A assinatura do OnBookEvent às vezes cai - existe algo assim? - página 9

 

Existe uma solução de muleta.

Use as variáveis globais do TERMINAL para criar seu próprio contador.

Basta pensar em um nome único para que duas janelas com o mesmo símbolo criem seu próprio

variável terminal global.

Adicionado

Se você não quiser abrir duas janelas de símbolos, você pode usar Magik como o nome da variável terminal global

você pode usar 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);
  }
//+------------------------------------------------------------------+

ou apenas um nome simbólico

tais como "Si-9.18_bookcount".

Eu conto os fundos de garantia (GO) para ordens pendentes desta forma

 
prostotrader:
Basta pensar em um nome único para que duas janelas com o mesmo símbolo criem sua própria variável terminal global.
Você dificilmente pode pensar em um nome melhor do que este https://www.mql5.com/ru/forum/267154/page8#comment_8171650
Подписка на OnBookEvent иногда отваливается - есть такое?
Подписка на OnBookEvent иногда отваливается - есть такое?
  • 2018.07.24
  • www.mql5.com
После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторы...
 
A100:
Não consigo pensar em um nome melhor do que este https://www.mql5.com/ru/forum/267154/page8#comment_8171650

Ótimo, seja qual for o nome, desde que seja único se houver mais de uma janela

Adicionado

Corrija-me se eu me enganei em algum lugar.

//+------------------------------------------------------------------+
//|                                                    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:
Correto, se eu me enganei em algum lugar

A singularidade do nome está diretamente relacionada com o nome do símbolo, eu quis dizer o caso mais geral

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

ou seja, no seu caso (se todos os programas MQL no gráfico funcionarem somente com o símbolo atual)

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

em vez de

IntegerToString(ChartID())
não é um erro... apenas disciplina
 

Gente!

Nós NUNCA "bateremos" o MT-5!

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

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

Variáveis globais


Resultado 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

Resultado 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

Se você colocar 1 indicador e depois o segundo indicador, então

quando você remove o 1º indicador - o lixo total (Resultado 2), MAS

Se você colocar o 1º indicador primeiro e depois o 2º indicador e depois

remover 2º, depois 1º, tudo está bem (Resultado 1)!


Adicionado

Parece que se forem adicionados 2 indicadores, então ao remover o indicador que

foi colocada em primeiro lugar,

O OnDeinit(const int razão) é chamado tantas vezes quanto há indicadores no gráfico!

 
prostotrader:

Gente!

Nós NUNCA "bateremos" o MT-5!

Em geral, há armadilhas quando se trata de variáveis globais. pode haver um erro no código... Estou no meu celular agora - talvez alguém do meu computador possa verificá-lo - me ajude

 

Cada indicador tem uma variável que precisa ser atualizada antes de você apagar um indicador! :)

Eu vou consertar isso.

 

Sim, erro meu. Está funcionando corretamente.

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

Arquivo anexo

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

Indicador

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


Está funcionando corretamente!

 
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
Aproveite.
 
prostotrader:
Tire proveito disso.

Isto não ajuda no caso geral em que o software é de diferentes fornecedores e não há controle em comum. Portanto, toda esta dança de pandeiro é inicialmente inútil. E isto já foi dito antes. Você está desorganizando o fio fora de tópico.