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

 
Stanislav Korotky:

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

А вот Вам, извинится нужно, потому что это Вы ничего не читаете, а я написал:

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

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

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

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

Добавлено

Пожалуйста, Станислав, не продолжайте эту полемику, не хотите извиниться - не надо.

 
Slava:

Подписка увеличивает счётчик на 1.

Отписка уменьшает счётчик на 1.

Если Вашему эксперту нужны события стакана, то он не должен зависеть от других экспертов, что кто-то включит ему подписку. Он должен сам подписаться в OnInit. А в OnDeinit - отписаться

То, что Вы написали - делают все.

Но проблема в том, что если в одном окне подписка была вызвана 2 раза, то при удалении одной подписки - удаляется другая (вторая).

 
prostotrader:

То, что Вы написали - делают все.

Но проблема в том, что если в одном окне подписка была вызвана 2 раза, то при удалении одной подписки - удаляется другая (вторая).

Нет. Такого быть не должно. 2 подписки - 2 AddRef. 1 отписка - 1 Release. В итоге счётчик равен 1.

Подписка уничтожается только после того, как счётчик становится равным 0

 
prostotrader:
Но проблема в том, что если в одном окне подписка была вызвана 2 раза, то при удалении одной подписки - удаляется другая (вторая).

Другими словами счётчик эксперт\эксперт есть (но на ОДНОМ графике может находится только один эксперт), а счётчика эксперт\индикатор или индикатор\индикатор НЕТ

 
A100:
Другими словами счётчик эксперт\эксперт есть, а счётчика эксперт\индикатор - НЕТ

В одном окне может быть только один эксперт.

 
prostotrader:

В одном окне может быть только один эксперт.

Совершенно верно... между окнами\графиками считает... а внутри - НЕТ

 
Slava:

Нет. Такого быть не должно. 2 подписки - 2 AddRef. 1 отписка - 1 Release. В итоге счётчик равен 1.

Подписка уничтожается только после того, как счётчик становится равным 0

В этом топике есть код индикаторов, запустите их в одном окне на одном символе (фортс) и Вы сами всё увидите

Добавлено

Проверка займёт 2 минуты

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);
   }
   
  }  
//+------------------------------------------------------------------+

2 индикатор

//+------------------------------------------------------------------+
//|                                                   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);
   }
   
  }  
//+------------------------------------------------------------------+
 

Я понял проблему.

Ответить пока не готов

 
Slava:

Я понял проблему.

Ответить пока не готов

Спасибо, очень будем ждаеть её решения!

 
prostotrader:

А вот Вам, извинится нужно, потому что это Вы ничего не читаете, а я написал:

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

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

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

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

Добавлено

Пожалуйста, Станислав, не продолжайте эту полемику, не хотите извиниться - не надо.

Полемику начали вы, вам её и заканчивать. Мне не за что извиняться. Я все по делу писал, в отличии от вас.

Я видел все ваши посты. Процитировали только то, что вам подходит, а то, что было до этого и потом просто игнорируете, как будто и не писали. Действительно с энного раз у вас получилось воспроизвести проблему. И вообще, пришли в этот топик со своей проблемой, которая к теме не имеет отношения.

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