Ошибка в коде, деление на ноль, нужна помощь спецов.

 

Приветствую всех уделивших внимание. При использовании данного индикатора в советнике, выдаётся сообщение о делении на ноль (zero divide) Индикатор писал сам, имея поверхностное знание предмета. Буду очень признателен за конструктивную критику по оптимизации кода и указание на ошибки. О практической ценности индикатора речи не идёт. =)

Выглядит он так:

 

Единственная строка где может быть деление:

Val[j]=((Close[i+j]-Open[i+j])/(High[i+j]-Low[i+j])); 

Сделайте проверку, что (High[i+j]-Low[i+j]) не равно нулю, если равно нулю к Val[j] нчего не прибавлять.

 
Val[j]=((Close[i+j]-Open[i+j])/(High[i+j]-Low[i+j]));
Если High[i+j] равно Low[i+j] , вот тебе и деление на ноль
 

for(i=0;i<=Bars;i++) 

 Замените на: 

for(i=0;i<Bars-Per;i++) { 

 
Спасибо, очень оперативно ответили! Попробую сделать.
 
tara:

for(i=0;i<=Bars;i++) 

 Замените на: 

for(i=0;i<Bars-Per;i++) { 



Неа, не айс. Посреди истории тоже могут быть бары с равными хай и ло. 
 

Тогда сделать и то и это:) 

 
MikeM:
Если High[i+j] равно Low[i+j] , вот тебе и деление на ноль


Надо проверять не равенство хай и ло, а значение вычисленного знаменателя. Тут вот переменные double... проблемы нормализации... 
 
tara:

Тогда сделать и то и это:) 

 



Не помешает.
 
Кстати, неопределенность при High=Low я бы раскрыл в единицу, поскольку при этом  High=Low=Open=Close.  
 
tara:
Кстати, неопределенность при High=Low я бы раскрыл в единицу, поскольку при этом  High=Low=Open=Close.  


Чисто философская тема) И там ноль и там ноль... Числитель равен нулю, значит результат ноль, или равенство числителя и знаменателя - значит 1. Надо исходить из условий и требования задачи.

Здесь 1 получается если бар вверх, а если бар в низ, то -1. Когда открытие равно закрытию, неизвестно куда бар направлен, значит 0. 

 

Кругом грабли:)