Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
AlexPORT
238
AlexPORT  

Господа разработчики и программисты, помогите разобраться в непонятном для меня поведении ф-ции 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() на индикаторах всех других графиков?

 

 

Victor Nikolaev
Модератор
14651
Victor Nikolaev  
Почитайте про сравнение действительных чисел
Mislaid
618
Mislaid  
Vinin:
Почитайте про сравнение действительных чисел

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

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

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

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

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

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

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

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

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

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

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

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

AlexPORT
238
AlexPORT  

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

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

Mislaid
618
Mislaid  
Vinin:

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

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

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

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

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

1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий