Получить номер свечи-фрактала

Страницы: 1
RSS
Получить номер свечи-фрактала
 
Здравствуйте! Использую следующий индикатор фрактала.

Но не могу понять, как мне вытащить с графика номер свечи...
f=getCandlesByIndex("Fractal",v,N-1,1)[0];
if f.Type==TYPE_TRIANGLE_DOWN then message("Fractal Down "..tostring(v)); end;
if f.Type==TYPE_TRIANGLE_UP then message("Fractal UP "..tostring(v)); end;

Пробовал и f.Setting.line.Type - не понимаю, как мне программно узнать, какой фрактал у свечи и есть ли он в принципе... Подскажите пожалуйста
Код
Settings = {
Name = "*FRACTALS (Fractals)", 
Period = 5,
line = {{
      Name = "FRACTALS - Down", 
      Type = TYPE_TRIANGLE_DOWN, 
      Color = RGB(255, 0, 0)
      },
      {
      Name = "FRACTALS - Up", 
      Type = TYPE_TRIANGLE_UP, 
      Color = RGB(0, 255, 0)
      }
      }
}
         
function Init() 
   func = FRACTALS()
   return #Settings.line
end

function OnCalculate(Index) 
   return func(Index, Settings)
end

function FRACTALS() --Fractals ("FRACTALS")
   local H_tmp={}
   local L_tmp={}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 5)
P = math.floor(P/2)*2+1
H_tmp[I]=Value(I,"High",ds)
L_tmp[I]=Value(I,"Low",ds)
if I>=P then
   local S = I-P+1+math.floor(P/2)
   local val_h=math.max(unpack(H_tmp,I-P+1,I)) 
   local val_l=math.min(unpack(L_tmp,I-P+1,I))
   local L = Value(S,"Low",ds)
   local H = Value(S,"High",ds)
   if (val_h == H) and (val_h >0) 
      and (val_l == L) and (val_l > 0) then
         if ds then return S,S else
            SetValue(S, 1, val_l)
            SetValue(S, 2, val_h)
         end
   else
      if (val_h == H) and (val_h >0) then
         if ds then return S,nil else
            SetValue(S, 1, nil)
            SetValue(S, 2, val_h)
         end
      end
      if (val_l == L) and (val_l > 0) then
         if ds then return nil,S else
            SetValue(S, 1, val_l)
            SetValue(S, 2, nil)
         end
      end
   end
   
end
   return nil,nil
end
end

function Value(I,VType,ds) 
local Out = nil
VType=(VType and string.upper(string.sub(VType,1,1))) or "A"
   if VType == "O" then      --Open
      Out = (O and O(I)) or (ds and ds:O(I))
   elseif VType == "H" then    --High
      Out = (H and H(I)) or (ds and ds:H(I))
   elseif VType == "L" then   --Low
      Out = (L and L(I)) or (ds and ds:L(I))
   elseif VType == "C" then   --Close
      Out = (C and C(I)) or (ds and ds:C(I))
   elseif VType == "V" then   --Volume
      Out = (V and V(I)) or (ds and ds:V(I)) 
   elseif VType == "M" then   --Median
      Out = ((Value(I,"H",ds) + Value(I,"L",ds)) / 2)
   elseif VType == "T" then   --Typical
      Out = ((Value(I,"M",ds) * 2 + Value(I,"C",ds))/3)
   elseif VType == "W" then   --Weighted
      Out = ((Value(I,"T",ds) * 3 + Value(I,"O",ds))/4) 
   elseif VType == "D" then   --Difference
      Out = (Value(I,"H",ds) - Value(I,"L",ds))
   elseif VType == "A" then   --Any
      if ds then Out = ds[I] end
   end
return Out
end
 
Цитата
Егор Масалкин написал:
f=getCandlesByIndex("Fractal",v,N-1,1)[0];
if f.Type==TYPE_TRIANGLE_DOWN then message("Fractal Down "..tostring(v)); end;
if f.Type==TYPE_TRIANGLE_UP then message("Fractal UP "..tostring(v)); end;

Согласно документации, у свечек возвращаемых функцией getCandlesByIndex нет такого параметра Type.
От куда Вы его взяли?
Данный код и не будет работать т.к. Вы пытаетесь использовать параметры которых не существует.
И потом, согласно приведенному коду не понятно чему равно N и чему равно v
 
Я знаю, почему не работает это.
Вопрос в том, какой мне нужно выцепить параметр, чтобы понять, что данная свеча с фракталом на покупку/продажу
 
Егор Масалкин,
Никакой. Такого параметра нет. Это сказано в документации.
Единственный способ получить цену графика и сравнить ее со значением цены у фрактала.
Если цена фрактала равна HIGTH то стрелка вверх, если LOW то вниз.
 
Цитата
Sergey Gorokhov написал:
Если цена фрактала равна HIGTH то стрелка вверх, если LOW то вниз.

Опечатка, имелось ввиду
Если цена фрактала равна HIGHT то стрелка вверх, если LOW то вниз.
 
N=getNumCandles("Price")
for v=100,N,1 do
t=getCandlesByIndex("Price",0,v-1,1)[0];
f=getCandlesByIndex("Fractal",0,v-1,1)[0];
if t.high==f.high then message("Fractal Up Year"..tostring(t.datetime.year).." Month"..tostring(t.datetime.month).." Day"..tostring(t.datetime.day).." Hour"..tostring(t.datetime.hour)); end;
if t.low==f.low then message("Fractal Down Year"..tostring(t.datetime.year).." Month"..tostring(t.datetime.month).." Day"..tostring(t.datetime.day).." Hour"..tostring(t.datetime.hour)); end;

Если я правильно понял, то должно быть где-то так. Проверил по графику, стрелки вниз находит верно, а стрелки вверх игнорирует =_=
В чем дело?
 
Егор Масалкин,

Боюсь предположить, что Вы наткнулись на известную тему про сравнение значений типа DOUBLE с плавающей точкой.
Про данную тему легко найти статьи в википедии, или учебниках по программированию.
Дело в том что для значений с плавающей точкой, недопустима проверка на жесткое равенство т.к. цифра легко может оказаться равной 1.0000001 вместо 1.  
Правильно сравнивать с заданной точностью, типа if t.high-f.high <0.0001 then, ну либо смотреть не на H или L, а на их среднее.
Например if f.high > (t.high+t.low) /2 then
 
Понял, в чем ошибка была. Не несоответствие типов, а элементарно не просек, что фрактал вверх - это не линия 0, а линия 1 в индикаторе.

Спасибо за помощь)
Страницы: 1
Читают тему
Наверх