Всех приветствую, опять вопрос по индикаторам, стал изучать скрипт индикатора Accumulation/Distribution AD.lua
из дополнительно предоставленных индикаторных скриптов для графиков любезно предоставленных компанией ARQATECH
Вот подскажите пожалуйста, функция OnCalculate, из описания - функция вызывается при поступлении новой или изменении существующей свечки в источнике данных для индикатора, возвращает два аргумента - один из них координата x другой координата y
я так понимаю, т.е. первый - местоположение свечки в рядяах свечей, второй фактически само значение индикатора
Я запрограммировал в своем скрипте получение индикатора AD непосредственно из значений свечей и в итоге мои значения AD не такие как показывает ваш индикатор на графике, причем что как у меня так и у вас сама формула расчета AD одинаковая -
У вас она в скрипте выглядит как:
function AD() --Accumulation/Distribution ("AD")
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
if I == 1 then
tmp = {pp=nil, p=nil}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then
it={p=I, l=it.l+1}
tmp.pp = tmp.p
end
local CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds)
local HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds)
if HL==0 then
tmp.p = tmp.pp or 0
else
tmp.p = CLH/HL + (tmp.pp or 0)
end
if it.l==1 then
if HL == 0 then return 0
else return CLH/HL end
else
return tmp.p
end
end
return nil
end
end
А именно строчки
CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds)
HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds)
Где CLH/HL и есть AD
У меня AD рассчитывается так -
((2*datatb:C(candle)-datatb:L(candle))-(datatb:H(candle)))/(datatb:H(candle)-datatb:L(candle)))*datatb:V(candle)
Где datatb - таблица с получаемыми значениями свечей
Так вот по вашему индикатору AD значения получаются какие то совсем астрономические - скажем для образца возьмем график ИнтерРао
с дневным периодом -
У вас у меня
08.05.19 6006783,524897 -129967.14285714
07.05.19 6084763,810612 -9633.2300884955
Ну и так далее
Ну и соответственно рассчитываемые по индикатору AD значения осциллятора Чайкина тоже какие то совсем другие, хотя его формула
и у меня и у вас тоже абсолютно одинаковая
У вас у меня
08.05.19 11650,613 -18427.413178682
07.05.19 7774,461856 -19034.307618411
Ну и так далее
Раз формулы одинаковые и значения свечей тоже то значит полученные из формулы значения в вашем скрипте еще и после формулы зачем то дополнительно меняются изучив скрипт AD.lua не трудно догадатся что изменяются они в функции OnCalculate в функции ConvertValue(Settings, func(Index, Settings)) где func(Index, Settings) это переименованная в Init функция AD():
function Init()
func = AD()
return #Settings.line
end
function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
if Out then
if Out > (HL or 0) then
return HL,Out,nil
else
return HL,nil,Out
end
else
return HL,nil,nil
end
end
И вот сама функция ConvertValue
function ConvertValue(T,...)
local function r(V, R)
if R and string.upper®== "ON" then R=0 end
if V and tonumber® 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
Будьте любезны обьясните пожалуйста что она делает и зачем? Зачем она дополнительно меняет уже готовое значение функции AD?
				из дополнительно предоставленных индикаторных скриптов для графиков любезно предоставленных компанией ARQATECH
Вот подскажите пожалуйста, функция OnCalculate, из описания - функция вызывается при поступлении новой или изменении существующей свечки в источнике данных для индикатора, возвращает два аргумента - один из них координата x другой координата y
я так понимаю, т.е. первый - местоположение свечки в рядяах свечей, второй фактически само значение индикатора
Я запрограммировал в своем скрипте получение индикатора AD непосредственно из значений свечей и в итоге мои значения AD не такие как показывает ваш индикатор на графике, причем что как у меня так и у вас сама формула расчета AD одинаковая -
У вас она в скрипте выглядит как:
function AD() --Accumulation/Distribution ("AD")
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
if I == 1 then
tmp = {pp=nil, p=nil}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then
it={p=I, l=it.l+1}
tmp.pp = tmp.p
end
local CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds)
local HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds)
if HL==0 then
tmp.p = tmp.pp or 0
else
tmp.p = CLH/HL + (tmp.pp or 0)
end
if it.l==1 then
if HL == 0 then return 0
else return CLH/HL end
else
return tmp.p
end
end
return nil
end
end
А именно строчки
CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds)
HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds)
Где CLH/HL и есть AD
У меня AD рассчитывается так -
((2*datatb:C(candle)-datatb:L(candle))-(datatb:H(candle)))/(datatb:H(candle)-datatb:L(candle)))*datatb:V(candle)
Где datatb - таблица с получаемыми значениями свечей
Так вот по вашему индикатору AD значения получаются какие то совсем астрономические - скажем для образца возьмем график ИнтерРао
с дневным периодом -
У вас у меня
08.05.19 6006783,524897 -129967.14285714
07.05.19 6084763,810612 -9633.2300884955
Ну и так далее
Ну и соответственно рассчитываемые по индикатору AD значения осциллятора Чайкина тоже какие то совсем другие, хотя его формула
и у меня и у вас тоже абсолютно одинаковая
У вас у меня
08.05.19 11650,613 -18427.413178682
07.05.19 7774,461856 -19034.307618411
Ну и так далее
Раз формулы одинаковые и значения свечей тоже то значит полученные из формулы значения в вашем скрипте еще и после формулы зачем то дополнительно меняются изучив скрипт AD.lua не трудно догадатся что изменяются они в функции OnCalculate в функции ConvertValue(Settings, func(Index, Settings)) где func(Index, Settings) это переименованная в Init функция AD():
function Init()
func = AD()
return #Settings.line
end
function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
if Out then
if Out > (HL or 0) then
return HL,Out,nil
else
return HL,nil,Out
end
else
return HL,nil,nil
end
end
И вот сама функция ConvertValue
function ConvertValue(T,...)
local function r(V, R)
if R and string.upper®== "ON" then R=0 end
if V and tonumber® 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
Будьте любезны обьясните пожалуйста что она делает и зачем? Зачем она дополнительно меняет уже готовое значение функции AD?
