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

 
Sergey Savinkin:

Хотелось бы получить комментарий разработчиков, потому что в документации по этому поводу ничего.

А из лога выше не видно что есть счётчик?

 
prostotrader:

А из лога выше не видно что есть счётчик?

Из лога выше видно, что один эксперт не отключает другой от подписки. А вот как это реализовано - через счетчик или еще как - не понятно. Кроме того, у топикстатера был индикатор и советник. А индикатор, как известно, имеет неприятную особенность путать порядок запуска OnInit() и OnDeinit(). Хотя это, вроде, не должно сбивать счетчик, если он действительно есть.

 
Sergey Savinkin:

Из лога выше видно, что один эксперт не отключает другой от подписки. А вот как это реализовано - через счетчик или еще как - не понятно. Кроме того, у топикстатера был индикатор и советник. А индикатор, как известно, имеет неприятную особенность путать порядок запуска OnInit() и OnDeinit().

Именно поэтому и введена переменная is_book, чтобы не было путаницы.

Ведь не просто так разработчики сделали MarketBookAdd() ФУНКЦИЕЙ.

 
prostotrader:

А из лога выше не видно что есть счётчик?

Лог ни о чем, когда используется другая ситуация, нежели та, в которой возникает проблема.

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

Даже когда последовательность вызовов OnInit/OnDeinit правильная (в данных тестах она была всегда правильная), проблема есть.

 
Такой подход не прокатывает?
class MARKETBOOK
{
private:  
  const string SymbName;
  int Count;

public:  
  MARKETBOOK( const string Symb ) : SymbName(Symb), Count(0) { this.On(); }
  ~MARKETBOOK( void ) { this.Off(); }

  bool isExist( void ) const { return(this.Count); }
    
  bool On( void ) { return (this.isExist() || (bool)(this.Count += ::MarketBookAdd(this.SymbName))); }

  bool Off( void )
  {
    while (this.isExist())
      this.Count -= ::MarketBookRelease(this.SymbName);
      
    return(!this.isExist());
  }  
};

MARKETBOOK MarketBook(_Symbol);
 
fxsaber:
Такой подход не прокатывает?

В терминале не запускал пока, но возник вопрос - а чем перенос кода в объектную обертку поможет от "обрубания концов" самим терминалом внутри себя (как сейчас и происходит)? Ну создастся объект и начнется подписка, а потом если кто-то закроет другую программу с подпиской, то объект никогда не узнает, что подписки больше нет.

Я сделал по-простому: сравниваю таймауты по OnBookEvent и OnTick. Если по первому таймаут больше чем на N секунд превышает таймаут по второму - переподписываюсь.

 
Stanislav Korotky:

В терминале не запускал пока, но возник вопрос - а чем перенос кода в объектную обертку поможет от "обрубания концов" самим терминалом внутри себя (как сейчас и происходит)? Ну создастся объект и начнется подписка, а потом если кто-то закроет другую программу с подпиской, то объект никогда не узнает, что подписки больше нет.

Я сделал по-простому: сравниваю таймауты по OnBookEvent и OnTick. Если по первому таймаут больше чем на N секунд превышает таймаут по второму - переподписываюсь.

Ну, как и ожидалось, Вы - не правы

1-ый индикатор

//+------------------------------------------------------------------+
//|                                                   Test_ind_1.mq5 |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#define on_call -111
#property indicator_separate_window
bool is_book = false;
double Buff[];
int event_cnt =0;
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Test_1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- Set buffers 
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   IndicatorSetString(INDICATOR_SHORTNAME,"Test_ind_1");
//---Set buffers
   SetIndexBuffer(0,Buff,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Buff,true); 
   is_book = MarketBookAdd(Symbol());
   if(is_book == true)
    { 
      Print(__FUNCTION__, ": Подписка на стакан добавлена. Символ ", Symbol());
    }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    if(is_book == true)
    { 
      MarketBookRelease(Symbol());
      Print(__FUNCTION__, ": Подписка на стакан удалена. Символ ", Symbol());
    }  
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
    if(prev_calculated == 0)
    {
      ArrayInitialize(Buff, EMPTY_VALUE);
    }
   Buff[0] = 2;
//--- return value of prev_calculated for next call
   event_cnt = rates_total;
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol == Symbol())
   {
     Print(__FUNCTION__, ": Подписка работает. Символ ", symbol);
      double price[];
      OnCalculate(event_cnt,event_cnt,on_call,price);
   }
   
  }  
//+------------------------------------------------------------------+

Второй индикатор

//+------------------------------------------------------------------+
//|                                                   Test_ind_1.mq5 |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#define on_call -111
#property indicator_separate_window
bool is_book = false;
double Buff[];
int event_cnt =0;
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Test_2"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLime
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- Set buffers 
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   IndicatorSetString(INDICATOR_SHORTNAME,"Test_ind_2");
//---Set buffers
   SetIndexBuffer(0,Buff,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Buff,true); 
   is_book = MarketBookAdd(Symbol());
   if(is_book == true)
    { 
      Print(__FUNCTION__, ": Подписка 2 на стакан добавлена. Символ ", Symbol());
    }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    if(is_book == true)
    { 
      MarketBookRelease(Symbol());
      Print(__FUNCTION__, ": Подписка 2 на стакан удалена. Символ ", Symbol());
    }  
  }  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
    if(prev_calculated == 0)
    {
      ArrayInitialize(Buff, EMPTY_VALUE);
    }
   Buff[0] = 2;
//--- return value of prev_calculated for next call
   event_cnt = rates_total;
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol == Symbol())
   {
     Print(__FUNCTION__, ": Подписка 2 работает. Символ ", symbol);
      double price[];
      OnCalculate(event_cnt,event_cnt,on_call,price);
   }
   
  }  
//+------------------------------------------------------------------+


Результат

2018.07.24 22:20:26.992 Test_ind_1 (Si-9.18,M1) OnInit: Подписка на стакан добавлена. Символ Si-9.18
2018.07.24 22:20:26.998 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:27.214 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:27.226 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:27.528 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:28.250 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:28.374 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:28.388 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:28.974 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:29.014 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:29.114 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:29.238 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:29.296 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:29.304 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:29.397 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:29.405 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:30.321 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:30.335 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:30.593 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:30.607 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:30.915 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:31.407 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:31.491 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:31.505 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:31.611 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:31.707 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:31.815 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:33.395 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:33.577 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:33.777 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:33.785 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:33.923 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:33.943 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:34.693 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:35.725 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:36.059 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:36.251 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:36.265 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:20:36.418 Test_ind_1 (Si-9.18,M1) OnDeinit: Подписка на стакан удалена. Символ Si-9.18
2018.07.24 22:21:41.846 Test_ind_1 (Si-9.18,M1) OnInit: Подписка на стакан добавлена. Символ Si-9.18
2018.07.24 22:21:41.852 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:41.884 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:42.658 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:42.926 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:44.540 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:44.632 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:45.396 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:45.722 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:46.132 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:46.514 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:46.860 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:47.012 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:47.064 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:47.254 Test_ind_2 (Si-9.18,M1) OnInit: Подписка 2 на стакан добавлена. Символ Si-9.18
2018.07.24 22:21:52.020 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:52.020 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:21:52.026 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:52.026 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:21:52.056 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:21:52.056 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18

2018.07.24 22:22:07.882 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:07.886 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:22:07.886 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:07.946 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:22:07.946 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:07.961 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:22:07.961 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:07.963 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:22:07.963 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:08.039 Test_ind_1 (Si-9.18,M1) OnBookEvent: Подписка работает. Символ Si-9.18
2018.07.24 22:22:08.039 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:08.433 Test_ind_1 (Si-9.18,M1) OnDeinit: Подписка на стакан удалена. Символ Si-9.18
2018.07.24 22:22:08.947 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:09.067 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:09.143 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:09.162 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:09.164 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:09.910 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:12.446 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:16.896 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:16.908 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:17.144 Test_ind_2 (Si-9.18,M1) OnBookEvent: Подписка 2 работает. Символ Si-9.18
2018.07.24 22:22:17.216 Test_ind_2 (Si-9.18,M1) OnDeinit: Подписка 2 на стакан удалена. Символ Si-9.18
 
Stanislav Korotky:

В терминале не запускал пока, но возник вопрос - а чем перенос кода в объектную обертку поможет от "обрубания концов" самим терминалом внутри себя (как сейчас и происходит)?

Init и Deinit не участвуют в подписке. Возможно, это обстоятельство поможет.

 

Эти индикаторы я запускал в разных окнах одного символа и работает нормально,

но когда я запустил оба индикатора в одном окне символа, то действительно

подписка "отвалилась" при удалении одного индикатора.

Пишите в СД (может успеют внести исправление в новый билд)