Подводные камни MarketBookAdd и MarketBookGet

 

Билд 1430

Ошибка проявляется в следующем:

Есть ситуации, когда и советник и индикатор используют один и тот же стакан цен.

Но когда мы просто проверяем есть ли стакан, то на чистом чарте, где точно никто не запрашивал

стакан цен мы получаем следующее:

 

Получается, что стакан уже добавлен? НО

Когда мы ставим брэкпоинт в функции OnBookEvent, то оказывается, что стакан цен вовсе не добавлен:

 


 Как же проверить был ли уже добавлен стакан цен?

Добавлено 

Ведь если и светник и индикатор используют один и тот же стакан цен, при установке оба добавят стакан цен (не страшно),

но при удалении советника или индикатора, стакан цен будет убран и оставшийся индикатор или советник останется без стакана :)

Как быть??? 

 
prostotrader:

Билд 1430

Ошибка проявляется в следующем:

Это не ошибка.

MarketBookGet выдает содержимое стакана всегда, так как стакан существует всегда сам по себе.

MarketBookAdd не включает стакан как вам кажется, а только включает генерацию событий OnBookEvent.


Каждая программа сама управляет включением/выключением генерации потока событий OnBookEvent, так что они друг другу не мешают.

 
Renat Fatkhullin:

Это не ошибка.

MarketBookGet выдает содержимое стакана всегда, так как стакан существует всегда сам по себе.

MarketBookAdd не включает стакан как вам кажется, а только включает генерацию событий OnBookEvent.

Я описал ситуацию.

Хорошо не ошибка!

Но как проверить, что стакан уже добавлен на чарт? 

Добавлено

Ведь если и светник и индикатор используют один и тот же стакан цен, при установке оба добавят стакан цен (не страшно),

но при удалении советника или индикатора, стакан цен будет убран и оставшийся индикатор или советник останется без стакана :)

Как быть???  

 
prostotrader:

Я описал ситуацию.

Хорошо не ошибка!

Но как проверить, что стакан уже добавлен на чарт? 

Что значит добавлен  на чарт? Стакан существует сам по себе всегда.

В своей программе вы лишь управляете "включить или выключить генерацию потока событий стакана фукцией MarketBookAdd в мою собственную программу".

Прочтите внимательно оба моих ответа, пожалуйста. У вас в корне неверное понимание.

 
Renat Fatkhullin:

Что значит добавлен  на чарт? Стакан существует см по себе всегда.

В своей программе вы лишь управляете "включить или выключить генерацию потока событий стакана фукцией MarketBookAdd".

Если я вкличил, то должен выключить

Тогда второй элемент на чарте останется без стакана 

Повторюсь

И советник и индикатор используют один и тот же стакан цен 

добавлено

Как быть? 

 
prostotrader:

Если я вкличил, то должен выключить

И советник и индикатор используют один и тот же стакан цен

Используйте MarketBookRelease.

И контролируйте логику вызовов в подчиненных индикаторах самостоятельно, пожалуйста. Если боитесь, что удаленный в рантайме индикатор (вдруг они у вас без контроля внешние) вдруг выключит поток уведомлений на своей динамической выгрузке, то прост вызовите еще раз MarketBookAdd.

Это же элементарно.

 
Renat Fatkhullin:

Что значит добавлен  на чарт? Стакан существует сам по себе всегда.

В своей программе вы лишь управляете "включить или выключить генерацию потока событий стакана фукцией MarketBookAdd в мою собственную программу".

Прочтите внимательно оба моих ответа, пожалуйста. У вас в корне неверное понимание.

Если даже ни одна программа (скрипт советник индикатор) не пользуется стаканом, все равно данные стакана поступают в терминал?
 
Renat Fatkhullin:

Используйте MarketBookRelease.

И контролируйте логику вызовов в подчиненных индикаторах самостоятельно, пожалуйста. Если боитесь, что удаленный в рантайме индикатор (вдруг они у вас без контроля внешние) вдруг выключит поток уведомлений на своей динамической выгрузке, то прост вызовите еще раз MarketBookAdd.

Это же элементарно.

Да, я тоже так думал, но раньше, когда я удалял индикотор, у меня

переставал работать стакан в советнике. Сейчас проверил на билде 1430 - работает.

 
Sergey Chalyshev:
Если даже ни одна программа (скрипт советник индикатор) не пользуется стаканом, все равно данные стакана поступают в терминал?

Конечно, если символ активен в маркетвотче.

 
prostotrader:

Да, я тоже так думал, но раньше, когда я удалял индикотор, у меня

переставал работать стакан в советнике. Сейчас проверил на билде 1430 - работает.

Да, странности действительно есть. Вернее не странности, а особенности, опытным путем установлено  - если число вызовов marketbookrelease для одного инструмента >= число вызовов marketbookadd, то события onbookevent для инструмента перестают поступать во все советники.

Видимо такая логика зашита в терминал (подсчет кол-ва вызовов).

Например - тестовый советник:

input int release_cnt = 1;

 

int OnInit() {

      if (MarketBookAdd(_Symbol) ) {

         Print("OnInit, MarketBookAdd success, symbol: "+ _Symbol);

         return(INIT_SUCCEEDED);

      } else {

         return(INIT_FAILED);

      }   

}

 

void OnDeinit(const int reason) {

     for (int i=0; i<release_cnt; i++) {

      Print("OnDeinit, do MarketBookRelease ... symbol: " + _Symbol);  

      MarketBookRelease(_Symbol);    

     } 

}


void OnBookEvent(const string &symbol) {

   if ( symbol == _Symbol) {

         Print("s_ask: " + SymbolInfoDouble(_Symbol, SYMBOL_ASK) + " |s_bid: " + SymbolInfoDouble(_Symbol, SYMBOL_BID));

      }

}


На одном и том же инструменте поставить на два разных таймфрема. У одного задать release_cnt = 2, тогда если его отключить  - по второму тоже события перестанут поступать.