Все индикаторы переписаны с учетом проверок на возможные пропуски в данных. Выполнен ряд мер по оптимизации. Исправлен ряд ошибок в расчетах некоторых из индикаторов.
echaki, В архиве только аналоги индикаторов которые есть в QUIK. В QUIK нет индикатора True Range, по этой причине он был удален из архива. А в readme остался по ошибке.
Если Вам нужен этот индикатор, Вы можете взять функцию для его расчета из индикатора ATR
Скажите, пожалуйста. Могу ли я как-нибудь использовать два по-разному настроенных уровня Фибоначчи? Т.е. как в Квике по умолчанию + перенастроить и сохранить другие параметры. И использовать одновременно?
Alex Green написал: Скажите, пожалуйста. Могу ли я как-нибудь использовать два по-разному настроенных уровня Фибоначчи? Т.е. как в Квике по умолчанию + перенастроить и сохранить другие параметры. И использовать одновременно?
Добрый день.
Да, вы можете настроить еще один уровень Фибоначчи, сохранит настройки в шаблон и использоваться Фибаначчи по умолчанию и еще один с настройками из шаблона.
Alex Green написал: А где добавить еще уровни в Фибоначчи? После этого дает только сохранение, а шаблон по умолчанию не вижу? http://prntscr.com/hdq7wk
Добрый день.
Возможность добавлять тренды в шаблоны реализована в версии рабочего места 7.14 и выше. У Вас судя по скриншоту версия ниже. Т.е необходимо обновиться. Пункт меню Система - Получение файлов.
Здравствуйте Sergey. Подскажите пожалуйста для чего нужны эти индикаторы, если в Quick они и так есть? Изучать lua начал недавно, поэтому не сочтите мой вопрос странным. Спасибо
Здравствуйте, скачала индикаторы, установила. MFI (Bill Williams Market Facilitation Index)] выдает все столбцы красные, корректное окрашивание происходит только после того как захожу в редактирование настроек графика и нажимаю Применить, только тогда индикаторы перекрашиваются. Потом опять идут все красные, до тех пор пока не повторю нажатие "применить"
Алена, ошибка найдена и исправлена. Архив на сайте обновим завтра. Пока можно взять исправленный код индикатора ниже
Скрытый текст
Код
Settings = {
Name = "*BWMFI (Bill Williams Market Facilitation Index)",
line = {{
Name = "Horizontal line",
Type = TYPE_LINE,
Color = RGB(140, 140, 140)
},
{
Width = 3,
Name = "BWMFI_Green",
Type = TYPE_HISTOGRAM,
Color = RGB(0, 206, 0)
},
{
Width = 3,
Name = "BWMFI_Fade",
Type = TYPE_HISTOGRAM,
Color = RGB(128, 64, 0)
},
{
Width = 3,
Name = "BWMFI_Fake",
Type = TYPE_HISTOGRAM,
Color = RGB(0, 255, 255)
},
{
Width = 3,
Name = "BWMFI_Squat",
Type = TYPE_HISTOGRAM,
Color = RGB(255, 0, 255)
}
},
Round = "off",
Multiply = 1,
Horizontal_line="0"
}
function Init()
func = BWMFI()
return #Settings.line
end
function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
if Out then
local prev = GetValue(Index-1, 2) or GetValue(Index-1, 3) or GetValue(Index-1, 4) or GetValue(Index-1, 5) or 0
local prev_v = V(Index-1) or 0
if (Out > prev) and (V(Index) > prev_v) then
return HL,Out,nil,nil,nil
elseif (Out <= prev) and (V(Index) <= prev_v) then
return HL,nil,Out,nil,nil
elseif (Out > prev) and (V(Index) <= prev_v) then
return HL,nil,nil,Out,nil
elseif (Out <= prev) and (V(Index) > prev_v) then
return HL,nil,nil,nil,Out
else
return HL,nil,nil,nil,nil
end
else
return HL,nil,nil,nil,nil
end
end
function BWMFI() --Bill Williams Market Facilitation I ("BWMFI")
local it = {p=0, l=0}
return function (I, Fsettings, ds)
if I == 1 then
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
return GetValueEX(it.p, DIFFERENCE, ds) / GetValueEX(it.p, VOLUME, ds)
end
return nil
end
end
SMA,MMA,EMA,WMA,SMMA,VMA = "SMA","MMA","EMA","WMA","SMMA","VMA"
OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = "O","H","L","C","V","M","T","W","D","A"
function CandleExist(I,ds)
return (type(C)=="function" and C(I)~=nil) or
(type(ds)=="table" and (ds[I]~=nil or (type(ds.Size)=="function" and (I>0) and (I<=ds:Size()))))
end
function Squeeze(I,P)
return math.fmod(I-1,P+1)
end
function ConvertValue(T,...)
local function r(V, R)
if R and string.upper(R)== "ON" then R=0 end
if V and tonumber(R) then
if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R
else return math.ceil(V * 10^R - 0.5) / 10^R end
else return V end
end
if arg.n > 0 then
for i = 1, arg.n do
arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off")
end
return unpack(arg)
else return nil end
end
function GetValueEX(I,VT,ds)
VT=(VT and string.upper(string.sub(VT,1,1))) or ANY
if VT == OPEN then --Open
return (O and O(I)) or (ds and ds:O(I))
elseif VT == HIGH then --High
return (H and H(I)) or (ds and ds:H(I))
elseif VT == LOW then --Low
return (L and L(I)) or (ds and ds:L(I))
elseif VT == CLOSE then --Close
return (C and C(I)) or (ds and ds:C(I))
elseif VT == VOLUME then --Volume
return (V and V(I)) or (ds and ds:V(I))
elseif VT == MEDIAN then --Median
return ((GetValueEX(I,HIGH,ds) + GetValueEX(I,LOW,ds)) / 2)
elseif VT == TYPICAL then --Typical
return ((GetValueEX(I,MEDIAN,ds) * 2 + GetValueEX(I,CLOSE,ds))/3)
elseif VT == WEIGHTED then --Weighted
return ((GetValueEX(I,TYPICAL,ds) * 3 + GetValueEX(I,OPEN,ds))/4)
elseif VT == DIFFERENCE then --Difference
return (GetValueEX(I,HIGH,ds) - GetValueEX(I,LOW,ds))
else --Any
return (ds and ds[I])
end
return nil
end
Сергей написал: Добрый день, а Вы можете написать индикаторы Laguerre на языке lua? Или подскажите где взять?))))
Здравствуйте, К сожалению нет т.к. это не является нашей задачей. Вы можете попросить написать нужный Вам индикатор у других участников форума, создав для этого ветку в разделе про Lua.
Добрый день! Использовал функцию расчета индикатора из размещенной здесь библиотеки. В частности MA. В качестве исходных данных использую таблицу полученную с помощью CreateDataSource. Пересчитал индикатор для всех свечей как в описании. Сверяю полученные данные с графиком нарисованным с помощью этой-же библиотеки, совпадает только последняя свеча, все остальные предыдущие интервалы достаточно сильно отличаются. Что я делаю не так?
Делал свою реализацию RSI так что бы она в точности совпадала с реализацией в quik.
Скачал последний файл с примерами реализаций индикаторов.
Посмотрел.
Очень сложный, не читабельный код! Разбираться в алгоритме индикатора по такому коду чрезвычайно сложно.
Комментарии в тексте кода очень бы помогли, а комментариев в коде нет.
Разобрался в вашем коде. Написал свою реализацию RSI намного проще.
Проверил. Результаты RSI она выдает такие же как у вас.
Вот моя реализация RSI.
Код
Settings = {
Name = "rsi",
line = {{
Name = "Horizontal line (top)",
Type = TYPE_LINE,
Color = RGB(140, 140, 140)
},
{Name = "Horizontal line (bottom)",
Type = TYPE_LINE,
Color = RGB(140, 140, 140)
},
{Name = "RSI2",
Type = TYPE_LINE,
Color = RGB(221, 44, 44)
}
},
Horizontal_line="20"
}
function Init()
smoothUp={} --в этом массиве храним сглаженные значения периодов роста
smoothDown={}--в этом массиве храним сглаженные значения периодов падения
return #Settings.line
end
-----------------------------------------------------------
function OnCalculate(Index)
local Out =RSI(Index)
local HL = tonumber(Settings.Horizontal_line)
if HL then
return 50+HL,50-HL,Out
else
return nil,nil,Out
end
end
-----------------------------------------------------------
function RSI(I)-- функция выдает значение RSI для свечи номер I
local valUp,valDown
if I==1 then --Для 1-й свечи результата нет
return
end
local Val=C(I) --Цена закрытия в эту минуту
local ValPrev=C(I-1) --Цена закрытия в предыдущую минуту
if Val>=ValPrev then --Если цена закрытия уувеличилась
valUp=Val-ValPrev
valDown = 0
else
valUp=0
valDown=ValPrev-Val
end
if I==2 then --для 2-й свечи устанавливает сглаженное значение
smoothUp[I]=valUp
smoothDown[I]=valDown
else --Для свечи начиная с 2-й
smoothUp[I]=(smoothUp[I-1]*13+valUp)/14 --Вычисляем сглаженное значение этой свечи для периодов роста
smoothDown[I]=(smoothDown[I-1]*13+valDown)/14 --Вычисляем сглаженное значение этой свечи для периодов падения
end
return 100*smoothUp[I]/(smoothUp[I]+smoothDown[I]) --получаем результирущее значение RSI
end
Рано радуетесь. Даже если вы не видите кролика, он все равно есть.
Например,
в одной диаграмме на минутном графике постройте график газпрома и график какого-нибудь неликвидного фьючерса.и постройте ваш индикатор ПО НЕЛИКВИДНОМУ ФЬЮЧЕРСУ. Наблюдайте за кучей ошибок исполнения.
Здравствуйте, Раиль. Индикаторы объёма и открытого интереса могут быть построены как с использованием индикаторов, так и без использования дополнительных lua-индикаторов. График объёма Вы можете построить через пункт контекстного меню окна графика: ПКМ / Добавить график (индикатор). В появившемся окне выберите инструмент в качестве источника данных, а для типа графика выберите "Volume". График открытого интереса может быть построен из Таблицы Текущих Торгов по параметру "Колво отк.поз.", либо, как и объём - через контекстное меню меню. В этом случае, в окне добавления графика необходимо нажать Новый / Изменить / История значений параметра / Количество открытых позиций. Если Вас интересуют файлы, описывающие алгоритмы расчёта и построения данных графиков и индикаторов, то таких файлов не предоставляем. Готовых вариантов на lua-скриптах также не распространяем. Однако, Вы можете написать их самостоятельно с использованием документации QLUA, а также следующих примеров.
Рустам написал: Привет ребята. Как сделать среднюю линию на дополнительном индикаторе? Например на Volume?
Ищу ответ на тот же вопрос. Как добавить для индикатора volume среднюю скользящую, это возможно в принципе? ставить раздельно два индикатора на объем неудобно, например volume & volume oscillator
подскажите, почему при добавлении индикатора Квик 7.27 выдает ошибку: attempt to compare number with nil ?
Settings= { Name = "PrChannel ClosMid", period = 55, line= { { Name = "UpChannelClose", Color = RGB(0,128,0), Type=TYPE_LINE, Width=1 }, { Name = "Middle", Color = RGB(255,0,0), Type=TYPE_LINE, Width=1
}, { Name = "DownChannelClose", Color = RGB(0,128,0), Type=TYPE_LINE, Width=1 }
}
} function Init() -- возвр сколько линий в индикаторе return 3 end function OnCalculate(index) if index<Settings.period then return nil else local maximum = 0 local minimum = 1000000
for i= index - Settings.period +1, index do if C(i)>maximum then maximum = C(i) end if C(i)<minimum then minimum = C(i) end end return maximum, maximum-(maximum-minimum)/2, minimum end
Максим, нам не известно какой график Вы смотрите, не известно какие индикаторы на нем кроме указанного, не известно какой таймфрейм, вообще ничего не известно. Только код, на котором у нас проблема НЕ воспроизводится.
Максим, нам не известно какой график Вы смотрите, не известно какие индикаторы на нем кроме указанного, не известно какой таймфрейм, вообще ничего не известно. Только код, на котором у нас проблема НЕ воспроизводится.
на любом графике вылетает эта ошибка, на графике только этот индикатор, любой таймфрейм выдает ошибку.
Цифра 41 в данном сообщении указывает на строку где возникла ошибка.
Код
if C(i)>maximum then
Т.е. у Вас C(i) возвращает nil А значит свечи нет. И то что Вы говорите что это не так, совершенно ничего не значит. Свечи может не быть на момент обращения к ней из-за сдвига или из-за наличия нескольких графиков. Совет тот же, добавьте проверку через CandleExist
Цифра 41 в данном сообщении указывает на строку где возникла ошибка.
Код
if C(i) > maximum then
Т.е. у Вас C(i) возвращает nil А значит свечи нет. И то что Вы говорите что это не так, совершенно ничего не значит. Свечи может не быть на момент обращения к ней из-за сдвига или из-за наличия нескольких графиков. Совет тот же, добавьте проверку через CandleExist
спасибо большое, вы самый грамотный программист , второй раз мне уже помогаете!!!