Вызов функции ATR

Страницы: 1
RSS
Вызов функции ATR
 
Прошу помочь с вызовом функции ATR
Код
dofile ("C:\\Program Files\\Lua\\5.1\\lua\\ATR.lua")--ATR
ds_v = CreateDataSource(instr[k].v_class,instr[k].v_sec,INTERVAL_D1)
ds_v:SetEmptyCallback()
sleep(1000)
func2 = ATR() 
candles=ds_v:Size() --до этого места доходит и выдаёт количество свечей
long_v={}
short_v={}
for i=1,candles do   
long_v[i]=func2(candles, {Period=252}, ds_v)                  
short_v[i]=func2(candles, {Period=5}, ds_v)   
end

но итоговые значения
long_v[i]
short_v[i]

равны нил.
Благодарю за помощь.
 
Let_it_go,

Сообщите на каком инструменте смотрите график.

К слову, ATR не вернет данных если номер свечки меньше чем заданный период (по умолчанию 14)
Т.е. если у Вас период 14, то первые 14 значений будут nil и это нормально.
 
Все инструменты ликвидные.
Например SBER (TQBR)
Нилом являются ВСЕ значения внутри цикла for i=1,candles do  (я специально это проверил). То есть функция не выдаёт ни одного значения.
---Вот код. Может быть он какой-то устаревший по сравнению с версией терминала.
Код
Settings = {
Name = "*ATR (Average True Range)", 
Period = 14,
line = {{
      Name = "Horizontal line",
      Type = TYPE_LINE, 
      Color = RGB(140, 140, 140)
      },
      {
      Width = 3,
      Name = "ATR_Up", 
      Type = TYPE_HISTOGRAM, 
      Color = RGB(0, 206, 0)
      },
      {
      Width = 3,
      Name = "ATR_Down", 
      Type = TYPE_HISTOGRAM, 
      Color = RGB(221, 44, 44)
      }
      },
Round = "off",
Multiply = 1,
Horizontal_line="0"
}

local prev=0
function Init()
   func = ATR()
   return #Settings.line
end

function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
   if Index == 1 then prev=0 end
   if Out then
      if Out > prev then
         prev = Out
         return HL,Out,nil
      else
         prev = Out
         return HL,nil,Out
      end
   else
      return HL,nil,nil
   end
end

function ATR() --Average True Range ("ATR")
   local f_TR = TR()
   local tmp = {pp=nil, p=nil}
   local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
if (P > 0) then
   if I == 1 then
      tmp = {pp=nil, p=nil}
      it = {p=0, l=0}
   end
   local tr = f_TR(I,ds)
   if CandleExist(I,ds) then
      if I~=it.p then 
         it = {p=I, l=it.l+1} 
         tmp.pp = tmp.p
      end
      if it.l < P then
         tmp.p = (tmp.pp or 0) + tr
      elseif it.l == P then
         tmp.p = ((tmp.pp or 0) + tr) / P
         return tmp.p
      elseif it.l > P then
         tmp.p = ((tmp.pp or 0) * (P-1) + tr) / P
         return tmp.p
      end
   end
end
return nil
end
end

function TR() --True Range ("TR")
   local it = {pp=0, p=0, l=0}
return function (I, ds)
   if I == 1 then
      it = {pp=0, p=0, l=0}
   end
   if CandleExist(I,ds) then
      if I~=it.p then it={pp=it.p, p=I, l=it.l+1} end
      if it.l == 1 then
         return math.abs(GetValueEX(it.p,DIFFERENCE, ds))
      else
         return math.max(math.abs(GetValueEX(it.p,DIFFERENCE, ds)), 
            math.abs(GetValueEX(it.p,HIGH,ds) - GetValueEX(it.pp,CLOSE,ds)), 
            math.abs(GetValueEX(it.pp,CLOSE,ds)-GetValueEX(it.p,LOW,ds)))
      end
   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
 
Let_it_go,

Попробуйте выделить две функции под разные параметры
Код
dofile ("C:\\Program Files\\Lua\\5.1\\lua\\ATR.lua")--ATR
ds_v = CreateDataSource(instr[k].v_class,instr[k].v_sec,INTERVAL_D1)
ds_v:SetEmptyCallback()
sleep(1000)
func1 = ATR() 
func2 = ATR() 
candles=ds_v:Size() --до этого места доходит и выдаёт количество свечей
long_v={}
short_v={}
for i=1,candles do   
long_v[i]=func1(candles, {Period=252}, ds_v)                  
short_v[i]=func2(candles, {Period=5}, ds_v)   
end
 
Сергей, спасибо за ответы.
Я нашёл ошибку.
Вот:
long_v[i]=func2(candles, {Period=252}, ds_v)  
а надо
long_v[i]=func2(i, {Period=252}, ds_v)  

теперь всё считает.
Страницы: 1
Читают тему
Наверх