Непонятное поведение OnCalculate() в индикаторе

 

Господа разработчики и программисты, помогите разобраться в непонятном для меня поведении ф-ции OnCalculate() в индикаторе.

1) Как я понимаю, OnCalculate() во время нормальной работы индикатора должна вызываться только при изменении Bid или Ask... Ниже привожу код индикатора, который на каждом тике сравнивает новые значения Bid / Ask со значениями на предыдущем шаге и в случае отличий запоминает их и прерывает выполнение ф-ции. Т.е. дальнейший код никогда не должен выполниться... Однако, последующий оператор Print тем не менее иногда, изредка, все же выполняется!!! Т.е. получается, что возможны подряд идущие тики с одинаковыми ценами??!!! Как так? Эффект проявляется тем заметнее, чем сильнее волатильность текущего инструмента. Причем это не связано с появлением нового бара и т.п., т.е. происходит спонтанно, "внутри" одной минуты и одного бара.

#property strict
#property indicator_chart_window

double OldBid, OldAsk;

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   if (Bid != OldBid || Ask != OldAsk)
   {
        OldBid = Bid;
        OldAsk = Ask;
        return(0);
   }
   
   Print("Почему сюда попадает?");
   
   return(0);
}

 

2) И еще непонятный момент. Если прикрепить такой индикатор к нескольким графикам и затем на одном из них сменить тайм-фрейм, то вышеописанный эффект почему то происходит так же на всех остальных графиках!!! Почему? Ладно, я еще понимаю, на текущем графике происходит переинциализация, пусть даже повторно предыдущие цены передаются в индюк после изменения периода, ок... но почему при этом срабатывает OnCalculate() на индикаторах всех других графиков?

 

 

 
Почитайте про сравнение действительных чисел
 
Vinin:
Почитайте про сравнение действительных чисел

Здесь у него, как раз, действительные оказываются равны.

Я думаю, что не стоит возвращать ноль в этой функции. Если вернуть ноль, то она может перезапуститься без всякого прихода тика по инструменту. Поэтому такая фигня и получается.

 
Vinin:
Почитайте про сравнение действительных чисел

Так здесь наоборот, этот нюанс играет в пользу срабатывания условия.

Даже если предположить, что возможен приход подряд двух тиков, цены которых отличаются в более чем 5-ом знаке, то double все равно хватит чтобы это отследить. Но ведь такие тики наверное в реале невозможны?

Да, уже подумал насчет возврата нуля... попробую... 

 
Сделал возврат rates_total вместо ноля - вроде немного реже стало срабатывать, но принципиально проблему не решило...
 
Mislaid:

Здесь у него, как раз, действительные оказываются равны.

Я думаю, что не стоит возвращать ноль в этой функции. Если вернуть ноль, то она может перезапуститься без всякого прихода тика по инструменту. Поэтому такая фигня и получается.

Проверили?
 
Vinin:
Проверили?
Я же постом выше написал, что возврат rates_total вместо ноля проблему не решает...
 
AlexPORT:
Я же постом выше написал, что возврат rates_total вместо ноля проблему не решает...

Я о сравнении действительных чисел.

Нельзя так сравнивать как делаете Вы

 

Вот как раз в данном случае это скорее правильно, чем неправильно.

Ведь даже если за счет неточности при сравнении сработает условие, то произойдет выход и Print() не отработает. А он, зараза, как раз таки и срабатывает почему-то!!!

 
Vinin:

Я о сравнении действительных чисел.

Нельзя так сравнивать как делаете Вы

Vinin, он не умеет сравнивать действительные числа. Но, очевидно, проблема где-то не в этом.
 
Mislaid:
Vinin, он не умеет сравнивать действительные числа. Но, очевидно, проблема где-то не в этом.

Вы проверили что бы говорить что проблема не в этом?

Как я понимаю - Вы умеете сравнивать действительные числа. 

Причина обращения: