Вопрос по скрипту индикатора AD

Страницы: 1
RSS
Вопрос по скрипту индикатора AD
 
Всех приветствую, опять вопрос по индикаторам, стал изучать скрипт индикатора Accumulation/Distribution AD.lua
из дополнительно предоставленных индикаторных скриптов для графиков любезно предоставленных компанией ARQATECH
https://pastebin.com/ZCjRxVd9
Вот подскажите пожалуйста, функция 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?
 
Цитата
Анатолий написал:
Вот подскажите пожалуйста, функция OnCalculate, из описания - функция вызывается при поступлении новой или изменении существующей свечки в источнике данных для индикатора, возвращает два аргумента - один из них координата x другой координата yя так понимаю, т.е. первый - местоположение свечки в рядяах свечей, второй фактически само значение индикатора
Нет такого в описании. Почитайте внимательней

Цитата
Анатолий написал:
и у меня и у вас тоже абсолютно одинаковая
Вы же понимаете что чудес не бывает если цифры разные значит формула разная. Это же математика.

Цитата
Анатолий написал:
Где CLH/HL  и есть AD
Да но дальше еще сложение, согласно формуле (которая если что есть в документации)
CumAD = ADn + CumADn-1,

Цитата
Анатолий написал:
Раз формулы одинаковые и значения свечей тоже то значит полученные из формулы значения в вашем скрипте еще и после формулы зачем то дополнительно меняются изучив скрипт AD.lua не трудно догадатся что изменяются они в функции OnCalculate в функции ConvertValue(Settings, func(Index, Settings)) где func(Index, Settings) это переименованная в Init функция AD():

Вы категорически не правы, функция ConvertValue тут не причем.
Если не верите, просто уберите ее из OnCalculate
Код
local Out = func(Index, Settings)


Цитата
Анатолий написал:
Будьте любезны обьясните пожалуйста что она делает и зачем? Зачем она дополнительно меняет уже готовое значение функции AD?

Это опциональная функция которая позволяет при желании включить округление Round значений индикатора, либо умножить значения на заданный коэффицент Multiply.
По умолчанию эти параметры выключены.
Код
Round = "off",
Multiply = 1,
 
Цитата
Sergey Gorokhov написал:
Да но дальше еще сложение, согласно формуле (которая если что есть в документации)CumAD = ADn + CumADn-1,
Где в вашей документации эта формула? Ненашел,
Где в скрипте индикатора AD.lua этот код CumAD = ADn + CumADn-1 ?
В функции 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

Вижу только в

 if HL==0 then
           tmp.p = tmp.pp or 0
       else
           tmp.p = CLH/HL + (tmp.pp or 0)
       end


похожую строчку   tmp.p = CLH/HL + (tmp.pp or 0)
 
Цитата
Анатолий написал:
Где в вашей документации эта формула? Ненашел,
Документация к терминалу в файле info.chm, или можно открыть нажав F1
Формулы к индикаторам приведены в следующем разделе:
-Раздел 4. Работа с графиками
--Методы технического анализа
---A/D («Накопление/распределение»)
Цитата
Анатолий написал:
Где в скрипте индикатора AD.lua этот код CumAD = ADn + CumADn-1 ?
Вот:
Цитата
Анатолий написал:
          tmp.p = CLH/HL + (tmp.pp or 0)
 
Цитата
Sergey Gorokhov написал:
Документация к терминалу в файле info.chm, или можно открыть нажав F1Формулы к индикаторам приведены в следующем разделе:
Ясно спасибо, нетуда смотрел, скажите еще пожалуйста:
1) За какой период получается суммируются вычисленные значения AD? Чему равно n-?
2) Для чего это делается? В литературе по тех.анализу я ненашел ничего о суммировании этого индикатора с его предыдущими значениями, хотя литературы очень много всю ее пересмотреть сложно, можно у вас попросить ссылку на литературу по которой у вас сделан индикатор AD, т.е. с сумрованием тогового значения за n периодов?

Да точно tmp.p = CLH/HL + (tmp.pp or 0)  - это и есть  CumAD = ADn + CumADn-1

Изменил эту строчку на  tmp.p = CLH/HL  в файлах AD.lua и CO.lua  после чего индикатор AD стал совпадать с моим расчетным
но CO по прежнему несовпадает хотя отличается ненамного, у себя CO я рассчитываю как


CO = SMA (AD,3) - SMA(AD,10) - где SMA - среднеарифметическое суммы индикаторов AD за периоды 3 и 10

у вас формула в CO.lua в functions CO()   такая же -   return rS_MA - rL_MA
В настройках индикатора метод подсчета средней - SMA я естественно выставил, почему несовпадение непойму

Ну и хотел еще добавить - ваш индикатор A/D («Накопление/распределение») вовсе не оригинальный индикатор A/D разработанный Ларри Вильмсом в 1972 и вычисляемый по формуле


A/D = ( ( C - O) / ( H - L) ) * V

Ваш индикатор A/D не что иное как индикатор аккумуляции/распределения  VA Чайкина (Volume Accumulation) - накопленный обьем
( т.е. не осциллятор а индикатор)

Который как раз таки и рассчитывается по формуле

VA = ( ( C - L ) - ( H - C ) ) / ( H - L ) ) * V
 
Цитата
Анатолий написал:
1) За какой период получается суммируются вычисленные значения AD? Чему равно n-?
Нет никакого периода. n в формуле обозначает текущую свечку для которой происходит расчет.
Например если свечек 5 значит n=5
Цитата
Анатолий написал:
2) Для чего это делается? В литературе по тех.анализу я ненашел ничего о суммировании этого индикатора с его предыдущими значениями, хотя литературы очень много всю ее пересмотреть сложно, можно у вас попросить ссылку на литературу по которой у вас сделан индикатор AD, т.е. с сумрованием тогового значения за n периодов?
К сожалению на литературу ссылку дать не можем, но такая же формула легко находится в википедии

Цитата
Анатолий написал:
Изменил эту строчку на  tmp.p = CLH/HL  в файлах AD.lua и CO.lua
Зачем? Настоятельно НЕ рекомендуем менять наши формулы, т.к. потом мы не сможем Вам объяснить почему у Вас данные не совпадают.
Цитата
Анатолий написал:
но CO по прежнему несовпадает
Надо разбираться.
Вообще не понятно зачем Вы пишите свои формулы расчета когда уже есть готовые наши формулы.
Если не нравятся наши формулы, то очень зря, они отточены годами и оправдали свою надежность.
Тем более что, как показал разбор выше, в своих формулах Вы рано или поздно придете к тому что уже есть в наших.

Цитата
Анатолий написал:
Ну и хотел еще добавить - ваш индикатор A/D («Накопление/распределение») вовсе не оригинальный индикатор A/D разработанный Ларри Вильмсом в 1972 и вычисляемый по формуле

Никто не мешает Вам написать индикатор так как Вам хочется.
 
Цитата
Sergey Gorokhov написал:
Нет никакого периода. n в формуле обозначает текущую свечку для которой происходит расчет.Например если свечек 5 значит n=5
Тут опять непойму - что же есть тогда tmp.pp (CumADn-1) из tmp.p = CLH/HL + (tmp.pp or 0)? т.е. согласно вашей формуле CumAD = ADn + CumADn-1
Для каждой свечи можно получить только одно значение ADn согласно значениям цен (открытия  закрытия и т.д.) и обьема этой свечи чтоже вы тогда прибавляете к ADn в качестве  CumADn-1 если  говорите что CumADn-1 тоже для этой же свечи?
 
Цитата
Анатолий написал:
если  говорите что CumADn-1 тоже для этой же свечи?
Никто такого не говорил.
Было четко сказано:
Цитата
Sergey Gorokhov написал:
n в формуле обозначает текущую свечку

Следовательно n-1 это предыдущая свечка.
 
Цитата
Sergey Gorokhov написал:
Следовательно n-1 это предыдущая свечка.
Хорошо -  значит если свечек пять то тогда получается - для 5ой (последней) свечи:
CumAD = ADn + CumADn-1
где CumADn-1 это CumAD для 4ой свечи и т.д.  в итоге каким же тогда будет CumAD для последней, 1ой, свечи? Получается что для 1ой свечи CumAD = ADn и он же будет CumADn-1 для 2ой свечи правильно? т.е. в вашем индикаторе A/D и индикаторе Чайкина они рассчитываются от выбранного интервала (количества свечей взятых для рассчета)?
 
Цитата
Анатолий написал:
Получается что для 1ой свечи CumAD = ADn и он же будет CumADn-1 для 2ой свечи правильно?
Да правильно.

Цитата
Анатолий написал:
т.е. в вашем индикаторе A/D и индикаторе Чайкина они рассчитываются от выбранного интервала (количества свечей взятых для рассчета)?

Если свечек 5 значит для расчета 5й свечки надо посчитать по 1й по 2й по 3й по 4й и наконец по 5й.
Если свечек 6 значит для расчета 6й свечки надо посчитать по 1й по 2й по 3й по 4й по 5й и наконец по 6й.
Если свечек 7 значит для расчета 7й свечки надо посчитать по 1й по 2й по 3й по 4й по 5й по 6й и наконец по 7й.
и так далее.
 
Только вот непойму где у вас для индикатора AD определяется количество свечей по которым он рассчитывается? В настройках  индикатора на графике нет ничего связанного с выбором периода для расчета, в скрипте AD.lua я тоже чтото ничего связанного с определением диапазона расчета (т.е. с количеством свечек по которому он рассчитывается) невижу
 
К томуже количеством свечей по которому рассчитывается AD не является количество свечей отображаемых на графике - я хотьь увеличиваю хоть уменьшаю диапазон отображаемого графика, т.е. кол-во свечей на графике, но знаения AD для каждой свечи остаются неизменными, отсюда  вывод что количество свечей у вас в индикаторе фиксированное но не пойму где оно задается
 
Лол ))))) Вообщем с помощью отладки вашего скрипта индикатора AD.lua выяснил что итоговое значение AD он выдает суммируя мгновенные значения (по формуле для каждой свечки) за весь диапазон доступных с биржи свечей, от самой последней до самой первой, однакож вам видимо трудно было об этом сразу сказать.. ))))
 
Цитата
Анатолий написал:
за весь диапазон доступных с биржи свечей, от самой последней до самой первой,
Да верно

Цитата
Анатолий написал:
однакож вам видимо трудно было об этом сразу сказать.. ))))

читайте внимательней
Цитата
Sergey Gorokhov написал:
Нет никакого периода. n в формуле обозначает текущую свечку для которой происходит расчет.Например если свечек 5 значит n=5
Страницы: 1
Читают тему (гостей: 2)
Наверх