Subscription to OnBookEvent sometimes falls off - is there such a thing? - page 9

 

There is one crutch solution.

Use the global variables of the TERMINAL to create your own counter.

Only you need to think of a unique name so that two windows of the same symbol create their own

global terminal variable.

Added

If you do not want to open two symbol windows, you can use Magik as the name of the global terminal variable

you can use Magik

//+------------------------------------------------------------------+
//|                                                    AutoMagic.mqh |
//|                                      Copyright 2017 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//version   "1.34
ulong symb_magic;
//-------------------------------------------------------------------+
// Split string function                                             |
//+------------------------------------------------------------------+
string SplitString(const string a_str,ulong &a_month,ulong &a_year)
  {
   int str_size=StringLen(a_str);
   int str_tire=StringFind(a_str, "-");
   int str_tochka=StringFind(a_str, ".", str_tire);
   if((str_tire>0) && (str_tochka>0) &&(str_size > 0))
     {
      a_month= ulong(StringToInteger(StringSubstr(a_str,str_tire+1,str_tochka-str_tire-1)));
      a_year = ulong(StringToInteger(StringSubstr(a_str,str_tochka+1,str_size-str_tochka-1)));
      if((a_month > 0) && (a_year > 0)) return(StringSubstr(a_str, 0, str_tire));
     }
   return("");
  }
//-------------------------------------------------------------------+
// Get Magic function                                                |
//+------------------------------------------------------------------+
ulong GetMagic(const string a_symbol)
  {
   if(StringLen(a_symbol)>10)
   {
     Print(__FUNCTION__, "Invalid magic string!");
     return(0);
   }
   ulong month = 0;
   ulong year = 0;
   string new_str=SplitString(a_symbol,month,year);
   if(StringLen(new_str)>0)
     {
      uchar char_array[];
      int result=StringToCharArray(new_str,char_array,0,WHOLE_ARRAY,CP_ACP);
      if(result>0)
        {
         ulong value;
         ulong cur_magic = 0;
         for(int i = 0; i < result - 1; i++)
           {
            value=ulong(char_array[i]);
            value<<=(40 -(i*8));
            cur_magic+=value;
           }
         month<<=8;
         cur_magic += month;
         cur_magic += year;
         if(a_symbol == Symbol())
         {
           symb_magic = cur_magic <<= 16;
           return(symb_magic);
         }
         else return(cur_magic <<= 16);
        }
     }
   return(0);
  }
//-------------------------------------------------------------------+
// Is my magic function                                              |
//+------------------------------------------------------------------+
bool IsMyMagic(const ulong m_magic)
  {
   ulong in_magic=m_magic;
   ulong stored_magic=symb_magic;
   in_magic>>=16;
   stored_magic>>=16;
   if(stored_magic == in_magic) return(true);
   return(false);
  }
//+------------------------------------------------------------------+

or just a symbol name

such as "Si-9.18_bookcount".

I count collateral (GO) funds for pending orders this way

 
prostotrader:
Only you need to think of a unique name so that two windows of the same symbol create their own global terminal variable.
You can hardly think of a better name than this https://www.mql5.com/ru/forum/267154/page8#comment_8171650
Подписка на OnBookEvent иногда отваливается - есть такое?
Подписка на OnBookEvent иногда отваливается - есть такое?
  • 2018.07.24
  • www.mql5.com
После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторы...
 
A100:
I can hardly think of a better name than this https://www.mql5.com/ru/forum/267154/page8#comment_8171650

Great, whatever the name, as long as it's unique if there's more than one window

Added

Correct me if I've got it wrong somewhere.

//+------------------------------------------------------------------+
//|                                                    BookCount.mqh |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
//
//+------------------------------------------------------------------+
//| Create book count function                                       |
//+------------------------------------------------------------------+
string CreateBookCount(int &cnt)
{
  string book_cnt_name = IntegerToString(ChartID());
  if(GlobalVariableCheck(book_cnt_name) == true)
  {
    double curr_value;
    if(GlobalVariableGet(book_cnt_name, curr_value) == true)
    {
      cnt = int(curr_value);
      return(book_cnt_name);
    }  
  }
  else
  {
    cnt = 0;
    if(ulong(GlobalVariableSet(book_cnt_name, double(cnt))) > 0)
    {
      return(book_cnt_name);
    }
  }
  return(""); 
}
//+------------------------------------------------------------------+
//| Delete book count function                                       |
//+------------------------------------------------------------------+
bool DeleteBookCount(const string cnt_name)
{
  if(GlobalVariableCheck(cnt_name) == true)
  {
    return(GlobalVariableDel(cnt_name));
  }
  return(false);
}
//+------------------------------------------------------------------+
//| Book count update function                                       |
//+------------------------------------------------------------------+
bool BookCountUpdate(const string cnt_name, int &value, const bool is_update)
{
  if(GlobalVariableCheck(cnt_name) == true)
  {
    double curr_value;
    double new_value;
    if(GlobalVariableGet(cnt_name, curr_value) == true)
    {
      if(is_update == true)
      {
        new_value = curr_value + 1;
      }
      else
      {
        new_value = curr_value - 1;
      }
      int i = 0;  
      do
      {
        i++;
        if(GlobalVariableSetOnCondition(cnt_name, new_value, curr_value) == true)
        {
          value = int(new_value);
          return(true);
        }  
     }  
     while(i < 100);
    }
  }
  return(false);
}
 
prostotrader:
Correct, if I've got it wrong somewhere

The uniqueness of the name is directly related to the name of the symbol, I meant the more general case

IntegerToString(ChartID()) + ":" + symbol

i.e. in your case (if all MQL programs on the chart work only with the current symbol)

IntegerToString(ChartID()) + ":" + Symbol()

instead of

IntegerToString(ChartID())
it's not a mistake... just discipline
 

Guys!

We will NEVER "beat" MT-5!

Indicator 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"
#include   "..\Include\BookCount.mqh"
#define  on_call -111
#property indicator_separate_window
string b_cnt_name;
int book_count;
bool is_book;
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()
  {
    b_cnt_name = CreateBookCount(book_count);
    if(b_cnt_name == "") return(INIT_FAILED);
   //--- 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());
      if(BookCountUpdate(b_cnt_name, book_count, true) == true)
      {
        Print(__FUNCTION__, ": Счётчик подписок обновлён. Символ ", Symbol());
            Print(__FUNCTION__, ": Book count: ", book_count);
      }
    }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    Print(__FUNCTION__, ": Book count: ", book_count);
    if(book_count > 1)
    {
      if(BookCountUpdate(b_cnt_name, book_count, false) == true)
      {
        Print(__FUNCTION__, ": Счётчик подписок обновлён. Символ ", Symbol());
        Print(__FUNCTION__, ": Book count: ", book_count);
      }
    }
    else
    { 
      Print(__FUNCTION__, ": Book count: ", book_count);
      MarketBookRelease(Symbol());
      Print(__FUNCTION__, ": Подписка на стакан удалена. Символ ", Symbol());
      DeleteBookCount(b_cnt_name);
      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);
   }
   
  }  
//+------------------------------------------------------------------+

Indicator 2

//+------------------------------------------------------------------+
//|                                                   Test_ind_2.mq5 |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include   "..\Include\BookCount.mqh"
#define  on_call -111
#property indicator_separate_window
string b_cnt_name;
int book_count;
bool is_book;
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  clrLime
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
    b_cnt_name = CreateBookCount(book_count);
    if(b_cnt_name == "") return(INIT_FAILED);
   //--- 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());
      if(BookCountUpdate(b_cnt_name, book_count, true) == true)
      {
        Print(__FUNCTION__, ": Счётчик подписок обновлён. Символ ", Symbol());
        Print(__FUNCTION__, ": Book count: ", book_count);
      }
    }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    Print(__FUNCTION__, ": Book count: ", book_count);
    if(book_count > 1)
    {
      if(BookCountUpdate(b_cnt_name, book_count, false) == true)
      {
        Print(__FUNCTION__, ": 2 Счётчик подписок обновлён. Символ ", Symbol());
        Print(__FUNCTION__, ": 2 Book count: ", book_count);
      }
    }
    else
    { 
      MarketBookRelease(Symbol());
      Print(__FUNCTION__, ": Подписка 2 на стакан удалена. Символ ", Symbol());
      DeleteBookCount(b_cnt_name);
      Print(__FUNCTION__, ": Счётчик подписок удален. Символ ", Symbol());
      Print(__FUNCTION__, ": Book count: ", book_count);
    }
  }  
//+------------------------------------------------------------------+
//| 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);
   }
   
  }  
//+------------------------------------------------------------------+

Global Variables


Result 1

2018.07.25 19:34:43.733 Test_ind_1 (Si-9.18,M1) OnInit: Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 19:34:43.733 Test_ind_1 (Si-9.18,M1) OnInit: Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 19:34:43.733 Test_ind_1 (Si-9.18,M1) OnInit: Book count: 1
2018.07.25 19:34:49.980 Test_ind_2 (Si-9.18,M1) OnInit: Подписка 2 на стакан добавлена. Символ Si-9.18
2018.07.25 19:34:49.980 Test_ind_2 (Si-9.18,M1) OnInit: Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 19:34:49.980 Test_ind_2 (Si-9.18,M1) OnInit: Book count: 2
2018.07.25 19:35:06.149 Test_ind_2 (Si-9.18,M1) OnDeinit: Book count: 2
2018.07.25 19:35:06.149 Test_ind_2 (Si-9.18,M1) OnDeinit: 2 Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 19:35:06.149 Test_ind_2 (Si-9.18,M1) OnDeinit: 2 Book count: 1
2018.07.25 19:35:17.408 Test_ind_1 (Si-9.18,M1) OnDeinit: Book count: 1
2018.07.25 19:35:17.408 Test_ind_1 (Si-9.18,M1) OnDeinit: Book count: 1
2018.07.25 19:35:17.408 Test_ind_1 (Si-9.18,M1) OnDeinit: Подписка на стакан удалена. Символ Si-9.18
2018.07.25 19:35:17.408 Test_ind_1 (Si-9.18,M1) OnDeinit: Счётчик подписок удален. Символ Si-9.18

Result 2

2018.07.25 19:42:34.884 Test_ind_1 (Si-9.18,M1) OnInit: Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 19:42:34.884 Test_ind_1 (Si-9.18,M1) OnInit: Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 19:42:34.884 Test_ind_1 (Si-9.18,M1) OnInit: Book count: 1
2018.07.25 19:42:41.019 Test_ind_2 (Si-9.18,M1) OnInit: Подписка 2 на стакан добавлена. Символ Si-9.18
2018.07.25 19:42:41.019 Test_ind_2 (Si-9.18,M1) OnInit: Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 19:42:41.019 Test_ind_2 (Si-9.18,M1) OnInit: Book count: 2
2018.07.25 19:42:46.310 Test_ind_1 (Si-9.18,M1) OnDeinit: Book count: 1
2018.07.25 19:42:46.310 Test_ind_1 (Si-9.18,M1) OnDeinit: Book count: 1
2018.07.25 19:42:46.311 Test_ind_1 (Si-9.18,M1) OnDeinit: Подписка на стакан удалена. Символ Si-9.18
2018.07.25 19:42:46.311 Test_ind_1 (Si-9.18,M1) OnDeinit: Счётчик подписок удален. Символ Si-9.18
2018.07.25 19:42:57.445 Test_ind_2 (Si-9.18,M1) OnDeinit: Book count: 2

If you put 1 indicator and then the second indicator, then

when you remove the 1st indicator - total rubbish (Result 2), BUT

If you put the 1st indicator first and then the 2nd indicator and then

remove 2nd, then 1st, everything is fine (Result 1)!


Added

It seems that if 2 indicators are added, then when removing the indicator that

was placed first,

void OnDeinit(const int reason) is called as many times as there are indicators on the chart!

 
prostotrader:

Guys!

We will NEVER "beat" the MT-5!

In general, there are pitfalls when dealing with global variables... there may be a mistake in the code... I'm on my mobile right now - maybe someone from my computer can check it - help me

 

I think I've got it! Every indicator has a variable that needs to be updated before it can be deleted! :)

I'll fix it.

 

Yes, my mistake. It's working properly.

2018.07.25 20:25:20.924 Test_ind_1 (Si-9.18,M1) OnInit: Indicator1 - Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 20:25:20.924 Test_ind_1 (Si-9.18,M1) OnInit: Indicator1 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:25:20.924 Test_ind_1 (Si-9.18,M1) OnInit: Indicator1 - Book count: 1
2018.07.25 20:25:25.325 Test_ind_2 (Si-9.18,M1) OnInit: Indicator 2 - Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 20:25:25.325 Test_ind_2 (Si-9.18,M1) OnInit: Indicator 2 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:25:25.325 Test_ind_2 (Si-9.18,M1) OnInit: Indicator 2 - Book count: 2
2018.07.25 20:25:29.813 Test_ind_3 (Si-9.18,M1) OnInit: Indicator 3 - Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 20:25:29.813 Test_ind_3 (Si-9.18,M1) OnInit: Indicator 3 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:25:29.813 Test_ind_3 (Si-9.18,M1) OnInit: Indicator 3 - Book count: 3
2018.07.25 20:25:38.919 Test_ind_1 (Si-9.18,M1) OnDeinit: Indicator1 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:25:38.919 Test_ind_1 (Si-9.18,M1) OnDeinit: Indicator1 - Book count: 2
2018.07.25 20:25:53.097 Test_ind_3 (Si-9.18,M1) OnDeinit: Indicator 3 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:25:53.097 Test_ind_3 (Si-9.18,M1) OnDeinit: Indicator 3 - Book count: 1
2018.07.25 20:25:58.296 Test_ind_2 (Si-9.18,M1) OnDeinit: Indicator 2 - Подписка на стакан удалена. Символ Si-9.18
2018.07.25 20:25:58.296 Test_ind_2 (Si-9.18,M1) OnDeinit: Indicator 2 - Счётчик подписок удален. Символ Si-9.18

Attached file

//+------------------------------------------------------------------+
//|                                                    BookCount.mqh |
//|                                      Copyright 2018 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018 prostotrader"
#property link      "https://www.mql5.com"
//
//+------------------------------------------------------------------+
//| Ctrate book count function                                       |
//+------------------------------------------------------------------+
string CreateBookCount(int &cnt)                      //return book count name & count value
  {
   string book_cnt_name=IntegerToString(ChartID());
   if(GlobalVariableCheck(book_cnt_name)==true)
     {
      double curr_value;
      if(GlobalVariableGet(book_cnt_name,curr_value)==true)
        {
         cnt=int(curr_value);
         return(book_cnt_name);
        }
     }
   else
     {
      cnt=0;
      if(ulong(GlobalVariableSet(book_cnt_name,double(cnt)))>0)
        {
         return(book_cnt_name);
        }
     }
   return("");
  }
//+------------------------------------------------------------------+
//| Delete book count function                                       |
//+------------------------------------------------------------------+
bool DeleteBookCount(const string cnt_name) //delete g;obal variable book count
  {
   if(GlobalVariableCheck(cnt_name)==true)
     {
      return(GlobalVariableDel(cnt_name));
     }
   return(false);
  }
//+------------------------------------------------------------------+
//| Book count update function                                       |
//+------------------------------------------------------------------+
bool BookCountUpdate(const string cnt_name,int &value,const bool is_update) //Update book count global variable
  {
   if(GlobalVariableCheck(cnt_name)==true)
     {
      double curr_value;
      double new_value;
      if(GlobalVariableGet(cnt_name,curr_value)==true)
        {
         if(is_update==true)
           {
            new_value=curr_value+1;
           }
         else
           {
            new_value=curr_value-1;
           }
         int i=0;
         do
           {
            i++;
            if(GlobalVariableSetOnCondition(cnt_name,new_value,curr_value)==true)
              {
               value=int(new_value);
               return(true);
              }
           }
         while(i<100);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//| Get book count function                                       |
//+------------------------------------------------------------------+
bool GetBookCount(const string cnt_name, int &cnt) 
  {
   if(GlobalVariableCheck(cnt_name)==true)
     {
      double curr_value;
      if(GlobalVariableGet(cnt_name,curr_value)==true)
        {
         cnt=int(curr_value);
         return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+

Indicator

//+------------------------------------------------------------------+
//|                                                   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"
#include   "..\Include\BookCount.mqh"
#define  on_call -111
#property indicator_separate_window
string b_cnt_name;
int book_count;
bool is_book;
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()
  {
    b_cnt_name = CreateBookCount(book_count);
    if(b_cnt_name == "") return(INIT_FAILED);
   //--- 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__, ": Indicator1 - Подписка на стакан добавлена. Символ ", Symbol());
      if(BookCountUpdate(b_cnt_name, book_count, true) == true)
      {
        Print(__FUNCTION__, ": Indicator1 - Счётчик подписок обновлён. Символ ", Symbol());
            Print(__FUNCTION__, ": Indicator1 - Book count: ", book_count);
      }
    }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    if(GetBookCount(b_cnt_name, book_count) == true)
    {
      if(book_count > 1)
      {
        if(BookCountUpdate(b_cnt_name, book_count, false) == true)
        {
          Print(__FUNCTION__, ": Indicator1 - Счётчик подписок обновлён. Символ ", Symbol());
          Print(__FUNCTION__, ": Indicator1 - Book count: ", book_count);
        }
      }
      else
      { 
        MarketBookRelease(Symbol());
        Print(__FUNCTION__, ": Indicator1 - Подписка на стакан удалена. Символ ", Symbol());
        if(DeleteBookCount(b_cnt_name) == true)
        {
          Print(__FUNCTION__, ": Indicator1 - Счётчик подписок удален. Символ ", 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);
   }
   
  }  
//+------------------------------------------------------------------+


It's working properly!

 
2018.07.25 20:42:35.261 Test_ind_1 (Si-9.18,M1) OnInit: Indicator 1 - Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 20:42:35.261 Test_ind_1 (Si-9.18,M1) OnInit: Indicator 1 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:42:35.261 Test_ind_1 (Si-9.18,M1) OnInit: Indicator 1 - Book count: 1
2018.07.25 20:42:35.407 Test_ind_1 (Si-9.18,M1) OnBookEvent:  Indicator 1 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:37.935 Test_ind_1 (Si-9.18,M1) OnBookEvent:  Indicator 1 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:38.909 Test_ind_2 (Si-9.18,M1) OnInit: Indicator 2 - Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 20:42:38.909 Test_ind_2 (Si-9.18,M1) OnInit: Indicator 2 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:42:38.909 Test_ind_2 (Si-9.18,M1) OnInit: Indicator 2 - Book count: 2
2018.07.25 20:42:39.053 Test_ind_1 (Si-9.18,M1) OnBookEvent:  Indicator 1 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:39.053 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:39.195 Test_ind_1 (Si-9.18,M1) OnBookEvent:  Indicator 1 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:43.127 Test_ind_3 (Si-9.18,M1) OnInit: Indicator 3 - Подписка на стакан добавлена. Символ Si-9.18
2018.07.25 20:42:43.127 Test_ind_3 (Si-9.18,M1) OnInit: Indicator 3 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:42:43.127 Test_ind_3 (Si-9.18,M1) OnInit: Indicator 3 - Book count: 3
2018.07.25 20:42:43.677 Test_ind_1 (Si-9.18,M1) OnBookEvent:  Indicator 1 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:43.677 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:43.677 Test_ind_3 (Si-9.18,M1) OnBookEvent: Indicator 3 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:44.066 Test_ind_1 (Si-9.18,M1) OnBookEvent:  Indicator 1 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:44.066 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:44.066 Test_ind_3 (Si-9.18,M1) OnBookEvent: Indicator 3 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:52.281 Test_ind_1 (Si-9.18,M1) OnDeinit: Indicator 1 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:42:52.281 Test_ind_1 (Si-9.18,M1) OnDeinit: Indicator 1 - Book count: 2
2018.07.25 20:42:52.533 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:52.533 Test_ind_3 (Si-9.18,M1) OnBookEvent: Indicator 3 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:52.579 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:52.579 Test_ind_3 (Si-9.18,M1) OnBookEvent: Indicator 3 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:52.779 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:52.779 Test_ind_3 (Si-9.18,M1) OnBookEvent: Indicator 3 - Подписка работает. Символ Si-9.18
2018.07.25 20:42:59.417 Test_ind_3 (Si-9.18,M1) OnDeinit: Indicator 3 - Счётчик подписок обновлён. Символ Si-9.18
2018.07.25 20:42:59.417 Test_ind_3 (Si-9.18,M1) OnDeinit: Indicator 3 - Book count: 1
2018.07.25 20:42:59.946 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:43:00.786 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:43:07.775 Test_ind_2 (Si-9.18,M1) OnBookEvent:  Indicator 2 - Подписка работает. Символ Si-9.18
2018.07.25 20:43:07.977 Test_ind_2 (Si-9.18,M1) OnDeinit: Indicator 2 - Подписка на стакан удалена. Символ Si-9.18
2018.07.25 20:43:07.977 Test_ind_2 (Si-9.18,M1) OnDeinit: Indicator 2 - Счётчик подписок удален. Символ Si-9.18
Take advantage.
 
prostotrader:
Take advantage of it.

This doesn't help in the general case where the software is from different vendors and there is no control in common. So all this tambourine dancing is initially useless. And this has already been said before. You are cluttering up the thread off-topic.

Reason: