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

 
Vinin:

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

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

Я умею это делать.
 
AlexPORT:

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

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

 

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

 

 

 

 

Дык. Так всегда же будет ретурн.

 

Ретурн то будет. Но вопрос какой )

Для начала советую принтануть входные Аски и Биды и дальше смотреть. И, разумеется, сравнить числа как это и нужно делать.. Но, главное, принтануть всё. Тогда уже даже если не так сравнил, станет понятным, что нужно это сделать. 

 
я не гений, но вроде аск и бид спрашивают активный график. если переключится - и числа пойдут другие 
 
shanty:

Ретурн то будет. Но вопрос какой )

Для начала советую принтануть входные Аски и Биды и дальше смотреть. И, разумеется, сравнить числа как это и нужно делать.. Но, главное, принтануть всё. Тогда уже даже если не так сравнил, станет понятным, что нужно это сделать. 

Дык. Всегда, 0
 
AlexPORT:

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

1) Как я понимаю, OnCalculate() во время нормальной работы индикатора должна вызываться только при изменении Bid или Ask... 

 

 

 

 

Нет, OnCalculate работает на каждом тике, независимо от того, изменились ли котировки. Для MQL4 и пока - для MQL5. 
 
tara:
Нет, OnCalculate работает на каждом тике, независимо от того, изменились ли котировки. Для MQL4 и пока - для MQL5. 
А что такое тик? Это и есть изменение котировки, бида или аска... Нет изменения - будет продолжительная пауза, пока не наступит изменение... Или я чего то не знаю?
 
AlexPORT:
А что такое тик? Это и есть изменение котировки, бида или аска... Нет изменения - будет продолжительная пауза, пока не наступит изменение... Или я чего то не знаю?
Теоретически ДА. Интересно узнать практически. Вы как раз можете это сделать. Хотя ответ и так известен. Но все равно интересно.
 

Так, видимо я изначально выбрал неправильную форму описания проблемы, из-за чего все свелось к пресловутому сравнению вещественных чисел...

Рассказываю реальное положение вещей. Я решил дополнить интерфейс МТ4 для более удобной работы, как мне надо... Речь о визуальном отображении инфы по торговым ордерам по отдельности и суммарно, переключениями м/у графиками и пр... Для этого использую библиотеку MT4GUI. Она позволяет создавать на графиках стандартные виндовые элементы управления (кнопки, чекбоксы, меню и т.п.). Родные МТ4-ые элементы не подошли из-за проблемы с их удалением по кнопке Backspace. При нажатии кнопки MT4GUI принудительно генерирует событие OnTick  или OnCalculate, в зависимости от программы, чтобы можно было идентифицировать нажатый элемент и произвести какое-то действие в ответ. Разумеется текущие цены Bid и Ask в этом случае равны последним известным на данный момент. Т.е. меня как раз интересует случай, когда в OnCalculate имеем случай Bid = OldBid И Ask = OldAsk. А как выяснилось на практике, такое периодически происходит на графиках, причем никаких манипуляций с терминалом в это время не производится - просто один раз запустили и все, смотрим, наблюдаем. В тестовом примере даже сама библиотека MT4GUI не используется, поэтому ее влияние следует исключить. Перебои связи тоже думаю не причем - ибо иначе бы сообщение сыпалось со всех графиков в этот момент.

Вот и хотелось бы узнать - почему такое происходит? Как будто бы иногда приходит подряд 2 тика с одинаковыми ценами.

Ну и по второму вопросу в первом посте хотелось бы услышать разработчиков - по моему это смахивает на типичный баг (одновременное возникновение события на незадействованных гарфиках). 

 
tara:
Нет, OnCalculate работает на каждом тике, независимо от того, изменились ли котировки. Для MQL4 и пока - для MQL5. 

И не только. Ещё при достижении лимита баров на графике (когда часть старых баров удаляется и значение rates_total меняется), перемотке графика назад с подргузкой истории - короче, при любом изменении ценовых данных. А ещё после каждого события Init, в том числе при переключении таймфреймов (что у автора и происходит).

  

ЗЫ. Автор, если вам нужно выполнение кода только при поступлении нового тика, пишите советник, а не индикатор. Событие NewTick, обрабатываемое в советниках функцией OnTick(), в отличие от события Calculate, генерируется только с приходом нового тика. Или можно в индикаторе проверять изменение тикового объёма на последнем баре - он тоже меняется только с приходом нового тика.

ЗЗЫ. Что там возвращает OnCalculate(), к биду и аску вообще никаким боком не относится. 

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