Всех приветствую, опять вопрос по индикаторам, стал изучать скрипт индикатора 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
((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я так понимаю, т.е. первый - местоположение свечки в рядяах свечей, второй фактически само значение индикатора
Нет такого в описании. Почитайте внимательней
Цитата
Анатолий написал: и у меня и у вас тоже абсолютно одинаковая
Вы же понимаете что чудес не бывает если цифры разные значит формула разная. Это же математика.
Да но дальше еще сложение, согласно формуле (которая если что есть в документации) 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. По умолчанию эти параметры выключены.
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
Анатолий написал: Где в вашей документации эта формула? Ненашел,
Документация к терминалу в файле info.chm, или можно открыть нажав F1 Формулы к индикаторам приведены в следующем разделе: -Раздел 4. Работа с графиками --Методы технического анализа ---A/D («Накопление/распределение»)
Цитата
Анатолий написал: Где в скрипте индикатора AD.lua этот код CumAD = ADn + CumADn-1 ?
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) - накопленный обьем ( т.е. не осциллятор а индикатор)
Анатолий написал: 1) За какой период получается суммируются вычисленные значения AD? Чему равно n-?
Нет никакого периода. n в формуле обозначает текущую свечку для которой происходит расчет. Например если свечек 5 значит n=5
Цитата
Анатолий написал: 2) Для чего это делается? В литературе по тех.анализу я ненашел ничего о суммировании этого индикатора с его предыдущими значениями, хотя литературы очень много всю ее пересмотреть сложно, можно у вас попросить ссылку на литературу по которой у вас сделан индикатор AD, т.е. с сумрованием тогового значения за n периодов?
К сожалению на литературу ссылку дать не можем, но такая же формула легко находится в википедии
Цитата
Анатолий написал: Изменил эту строчку на tmp.p = CLH/HL в файлах AD.lua и CO.lua
Зачем? Настоятельно НЕ рекомендуем менять наши формулы, т.к. потом мы не сможем Вам объяснить почему у Вас данные не совпадают.
Надо разбираться. Вообще не понятно зачем Вы пишите свои формулы расчета когда уже есть готовые наши формулы. Если не нравятся наши формулы, то очень зря, они отточены годами и оправдали свою надежность. Тем более что, как показал разбор выше, в своих формулах Вы рано или поздно придете к тому что уже есть в наших.
Цитата
Анатолий написал: Ну и хотел еще добавить - ваш индикатор 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 тоже для этой же свечи?
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 он выдает суммируя мгновенные значения (по формуле для каждой свечки) за весь диапазон доступных с биржи свечей, от самой последней до самой первой, однакож вам видимо трудно было об этом сразу сказать.. ))))