Ошибка при поиске пиков\впадин кастом индикатора

Страницы: 1
RSS
Ошибка при поиске пиков\впадин кастом индикатора
 
Не пойму, в чем проблема..
Выдает ошибку attempt to compare number with nil когда индикатор растет или падает и не обнаруживает пиков\впадин
При успешном обнаружении пика\впадины выдает текстовое сообщение как положено
Код:

require("w32")
Settings = {
 Tiker = "\210\232\234\229\240",
 Name = "Kalman SndMsg",
 Mode = 6,
 KF = 50,
 line = {
   {
     Name = "Kalman",
     Color = RGB(0, 255, 0),
     Type = TYPE_LINE,
     Width = 2
   }
 }
}
function Init()
 return 1
end
i = 0
value = 0
count = 0
function OnCalculate(_ARG_0_)
 if _ARG_0_ == 1 then
   kalman ={}
   Distance = 0
   Error = 0
   value = dValue(1, Settings.Mode)
   Velocity = 0
   i = 0
   count = Size()
 end
 if _ARG_0_ > 1 then
   if _ARG_0_ > i then
     i = _ARG_0_
     Distance = dValue(i, Settings.Mode) - value
     Error = value + Distance * math.sqrt(Settings.KF / 1000)
     Velocity = Velocity + Distance * (Settings.KF / 1000)
     value = Error + Velocity
     kalman[i] = value
     
     if kalman[i-1] < kalman[i-2] and kalman[i-2] >= kalman[i-3] then
       if _ARG_0_ >= count then
         message(Settings.Tiker .. ": DOWN trend", 1)
         w32.MessageBeep(w32.MB_OK)
         count = _ARG_0_
       end
     end

     if kalman[i-1] > kalman[i-2] and kalman[i-2] <= kalman[i-3] then
       if _ARG_0_ >= count then
         message(Settings.Tiker .. ": UP trend", 1)
         w32.MessageBeep(w32.MB_OK)
         count = _ARG_0_
       end
     end
     
   end
 end
return kalman[i]  
end

function dValue(_ARG_0_, _ARG_1_)
 if (_ARG_1_ or 0) == 1 then
   return O(_ARG_0_)
 elseif (_ARG_1_ or 0) == 2 then
   return H(_ARG_0_)
 elseif (_ARG_1_ or 0) == 3 then
   return L(_ARG_0_)
 elseif (_ARG_1_ or 0) == 0 then
   return C(_ARG_0_)
 elseif (_ARG_1_ or 0) == 4 then
   return (H(_ARG_0_) + L(_ARG_0_)) / 2
 elseif (_ARG_1_ or 0) == 5 then
   return (H(_ARG_0_) + L(_ARG_0_) + C(_ARG_0_)) / 3
 elseif (_ARG_1_ or 0) == 6 then
   return (H(_ARG_0_) + L(_ARG_0_) + 2 * C(_ARG_0_)) / 4
 else
   return C(_ARG_0_)
 end
end
 
Цитата
torque написал:
attempt to compare number with nil
В тексте ошибки должен быть номер строки на которую она ссылается.
Кроме того, уточните на какой инструмент накладывается индикатор.
 
Строки с ошибкой
if kalman[i-1] < kalman[i-2] and kalman[i-2] >= kalman[i-3] then
или
if kalman[i-1] > kalman[i-2] and kalman[i-2] <= kalman[i-3] then

Инструмент любой.
 
torque,

Как минимум, уже ошибка в том что Вы берете значения kalman[i-1], kalman[i-2], kalman[i-3] тогда когда их может не быть.
раз i это номер свечки, следует добавить условие
if i>4 then
и только после этого продолжать код.
 
Цитата
Sergey Gorokhov написал:
if i>4 then
Имелось ввиду конечно же
if i>=4 then
 
Но ведь выше в начале цикла есть присвоение переменной i номера текущего бара. По поводу >=4 попробовал, ничего не изменилось

if _ARG_0_ >=4 then
   if _ARG_0_ > i then
     i = _ARG_0_
 
Странно именно то, что когда пик или впадина образуется, то сообщение выводится корректно и ошибки нет. Ошибка возникает только когда условие
if kalman[i-1] < kalman[i-2] and kalman[i-2] >= kalman[i-3] then
или
if kalman[i-1] > kalman[i-2] and kalman[i-2] <= kalman[i-3] then
не выполняется.
 
Цитата
torque написал:
Но ведь выше в начале цикла есть присвоение переменной i номера текущего бара.

ну да, а если будет когда появится второй бар?

_ARG_0_ = 2
...

 if _ARG_0_ > 1 then
   if _ARG_0_ > i then
     i = _ARG_0_
     kalman[i] = value
     if kalman[i-1] < kalman[i-2] and kalman[i-2] >= kalman[i-3] then

чему будет равно kalman[i-2]? а kalman[i-3]?
Цитата
torque написал:
По поводу >=4 попробовал, ничего не изменилось

Надо не "пробовать", а исправлять и если не помогло смотреть дальше.
Что попадает в kalman и что в i, перед возникновением ошибки.
И действительно ли на предыдущих итерациях заполнялись нужные параметры kalman[i-1], kalman[i-2], kalman[i-3]


Добавьте логирование этих данных, например через message.
 
Цитата
Sergey Gorokhov написал:
Цитата
Sergey Gorokhov   написал:
if i>4 then
Имелось ввиду конечно же
if i>=4 then

и все-таки правильно if i>4 then
т.к. в первом условии if _ARG_0_ >1 then, а не if _ARG_0_ >=1 then
Страницы: 1
Читают тему
Наверх