Подписка на OnBookEvent иногда отваливается - есть такое?

 

После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторые из них самопроизвольно по тихому отваливаются, в частности 1 эксперт и 1 индикатор по разным символам. Никаких ошибок в логах. Котировки продолжали идти. Другие символы продолжили работать. После перезапуска простаивающих MQL-программ вручную, события стакана в них опять стали поступать.

Наблюдал ли кто подобное? Как защититься? Пока в плане обнаружения есть идея смотреть таймаут между последним событием стакана и новыми тиками. Но что делать, если таймаут превышен? Достаточно снова вызвать MarketBookAdd?

 

Ранее это называли "зомби", возможно поиск еще найдет старые темы.

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

Например было 2 эксперта, каждый подписался по 1-му разу. Далее один закрыли, он отписался дважды. Второй эксперт, который остался работать перестает получать обновления.

Видел такое несколько раз.

После корректировки экспертов проблема исчезла и уже больше года не повторяется.

 
Ilya Baranov:

Ранее это называли "зомби", возможно поиск еще найдет старые темы.

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

Строго говоря, не подходит. У меня подписка делается один раз в ините, а отписка - в деините. Хотя я не могу исключить вариант, что DeInit каким-либо образом вызывается большее число раз, чем OnInit.

 
Stanislav Korotky:

Строго говоря, не подходит. У меня подписка делается один раз в ините, а отписка - в деините. Хотя я не могу исключить вариант, что DeInit каким-либо образом вызывается большее число раз, чем OnInit.

Если речь идет об индикаторах, посмотрите эту тему.

Последовательность выполнение Init() и DeInit()
Последовательность выполнение Init() и DeInit()
  • 2017.04.07
  • www.mql5.com
Всем привет ! Столкнулся с такой проблемой Написан индикатор или советник...
 
Sergey Savinkin:

Если речь идет об индикаторах, посмотрите эту тему.

Да, была такая тема, я даже в ней участвовал, но видимо проблема осталась. Но в текущем случае пропала подписка и у одного эксперта.

Ладно, бум устраивать пляски с бубном.

 
Stanislav Korotky:

После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторые из них самопроизвольно по тихому отваливаются, в частности 1 эксперт и 1 индикатор по разным символам. Никаких ошибок в логах. Котировки продолжали идти. Другие символы продолжили работать. После перезапуска простаивающих MQL-программ вручную, события стакана в них опять стали поступать.

Наблюдал ли кто подобное? Как защититься? Пока в плане обнаружения есть идея смотреть таймаут между последним событием стакана и новыми тиками. Но что делать, если таймаут превышен? Достаточно снова вызвать MarketBookAdd?

Выключатели бывают двух типов,- кнопка и переключатель. Первый посылает импульс и завершает работу, второй подразумевает смену режима работы. Пример первого - дверной звонок,- идеал события. Пример второго - выключатель освещения,- нажал - и оно горит. Понимаете, это уже не совсем событие, а нечто большее. 

 
Алексей Тарабанов:

Выключатели бывают двух типов,- кнопка и переключатель. Первый посылает импульс и завершает работу, второй подразумевает смену режима работы. Пример первого - дверной звонок,- идеал события. Пример второго - выключатель освещения,- нажал - и оно горит. Понимаете, это уже не совсем событие, а нечто большее. 

Нет, не понимаю. Судя по документации, подписка увеличивает внутренний счетчик, а отказ от подписки - уменьшает на 1. По достижении 0 - события не рассылаются.

Я поставил принты. Добился воспроизведения проблемы в случае, когда на одном и том же чарте сидит и эксперт, и индикатор. Каждый из них делает MarketBookAdd в OnInit, и MarketBookRelease в OnDeinit. Так вот, после того как я снимаю эксперт с чарта (один вызов MarketBookRelease), индикатор перестает получать стакан (хотя по идее его собственный вызов MarketBookAdd еще не отменен). Наоборот точно также - если удалить индюк, подписка теряется в эксперте. Я это конечно уже детектирую и снова подписываюсь, но работать так не должно, имхо.

 
Stanislav Korotky:

Нет, не понимаю. Судя по документации, подписка увеличивает внутренний счетчик, а отказ от подписки - уменьшает на 1. По достижении 0 - события не рассылаются.

Я поставил принты. Добился воспроизведения проблемы в случае, когда на одном и том же чарте сидит и эксперт, и индикатор. Каждый из них делает MarketBookAdd в OnInit, и MarketBookRelease в OnDeinit. Так вот, после того как я снимаю эксперт с чарта (один вызов MarketBookRelease), индикатор перестает получать стакан. Наоборот точно также - если удалить индюк, подписка теряется в эксперте. Я это конечно уже детектирую и снова подписываюсь, но работать так не должно, имхо.

Уже все сказал. Помолчу. 

 
Stanislav Korotky:

Нет, не понимаю. Судя по документации, подписка увеличивает внутренний счетчик, а отказ от подписки - уменьшает на 1. По достижении 0 - события не рассылаются.

Я поставил принты. Добился воспроизведения проблемы в случае, когда на одном и том же чарте сидит и эксперт, и индикатор. Каждый из них делает MarketBookAdd в OnInit, и MarketBookRelease в OnDeinit. Так вот, после того как я снимаю эксперт с чарта (один вызов MarketBookRelease), индикатор перестает получать стакан (хотя по идее его собственный вызов MarketBookAdd еще не отменен). Наоборот точно также - если удалить индюк, подписка теряется в эксперте. Я это конечно уже детектирую и снова подписываюсь, но работать так не должно, имхо.

Событие BookEvent - широковещательное. Прочитайте внимательно здесь описание OnBookEvent. 

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Stanislav Korotky:

После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторые из них самопроизвольно по тихому отваливаются, в частности 1 эксперт и 1 индикатор по разным символам. Никаких ошибок в логах. Котировки продолжали идти. Другие символы продолжили работать. После перезапуска простаивающих MQL-программ вручную, события стакана в них опять стали поступать.

Наблюдал ли кто подобное? Как защититься? Пока в плане обнаружения есть идея смотреть таймаут между последним событием стакана и новыми тиками. Но что делать, если таймаут превышен? Достаточно снова вызвать MarketBookAdd?

Почитайте это

https://www.mql5.com/ru/forum/95131

invalid book transaction
invalid book transaction
  • 2016.09.06
  • www.mql5.com
Раньше не было, появилось сегодня (реал). Что это...
 

Спасибо ;-). Конечно же я читал документацию и форум. Если есть ответ на мой вопрос, было бы очень любезно его сформулировать или выделить здесь.

В частности, в документации есть увлекательная фраза:

В отличие от других событий, событие BookEvent является широковещательным. Это означает, что достаточно одному эксперту подписаться на получение события BookEvent с помощью функции MarketBookAdd, все остальные эксперты, имеющие обработчик OnBookEvent(), будут получать это событие.

Вот только по ней остается догадываться, стоит ли или нет - по аналогии продолжить, что "достаточно одному эксперту отписаться от получения события, как все остальные эксперты тоже перестанут его получать"? Я считаю, что такого не может быть, это был бы (или есть) баг.