La suscripción a OnBookEvent a veces se cae - ¿existe? - página 9

 

Hay una solución de muleta.

Utilice las variables globales del TERMINAL para crear su propio contador.

Sólo hay que pensar en un nombre único para que dos ventanas del mismo símbolo creen su propio

variable terminal global.

Añadido

Si no quiere abrir dos ventanas de símbolos, puede utilizar Magik como nombre de la variable global del terminal

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

o sólo un nombre de símbolo

como "Si-9.18_bookcount".

Cuento los fondos de garantía (GO) para las órdenes pendientes de esta manera

 
prostotrader:
Sólo hay que pensar en un nombre único para que dos ventanas del mismo símbolo creen su propia variable global de terminal.
Difícilmente se puede pensar en un nombre mejor que este https://www.mql5.com/ru/forum/267154/page8#comment_8171650
Подписка на OnBookEvent иногда отваливается - есть такое?
Подписка на OnBookEvent иногда отваливается - есть такое?
  • 2018.07.24
  • www.mql5.com
После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторы...
 
A100:
No se me ocurre un nombre mejor que este https://www.mql5.com/ru/forum/267154/page8#comment_8171650

Genial, sea cual sea el nombre, siempre que sea único si hay más de una ventana

Añadido

Corrígeme si me he equivocado en algún punto.

//+------------------------------------------------------------------+
//|                                                    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:
Corrige, si me he equivocado en alguna parte

La unicidad del nombre está directamente relacionada con el nombre del símbolo, me refería al caso más general

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

es decir, en su caso (si todos los programas MQL en el gráfico trabajan sólo con el símbolo actual)

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

en lugar de

IntegerToString(ChartID())
no es un error... sólo disciplina
 

¡Chicos!

¡Nunca "venceremos" a la 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);
   }
   
  }  
//+------------------------------------------------------------------+

Variables globales


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

Si pones 1 indicador y luego el segundo indicador, entonces

cuando se quita el primer indicador - basura total (Resultado 2), PERO

Si pones primero el primer indicador y luego el segundo y luego

quitar la 2ª, luego la 1ª, ¡todo está bien (Resultado 1)!


Añadido

Parece que si se añaden 2 indicadores, al quitar el indicador que

se colocó en primer lugar,

void OnDeinit(const int reason) se llama tantas veces como indicadores haya en el gráfico.

 
prostotrader:

¡Chicos!

¡Nunca "venceremos" a la MT-5!

En general, hay trampas cuando se trata de variables globales... puede haber un error en el código... Estoy en mi móvil ahora mismo - quizás alguien desde mi ordenador pueda comprobarlo - ayúdame

 

Creo que lo he conseguido! Cada indicador tiene una variable que debe ser actualizada antes de poder ser eliminada! :)

Lo arreglaré.

 

Sí, mi error. Funciona correctamente.

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

Archivo adjunto

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


¡Funciona correctamente!

 
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
Aprovecha.
 
prostotrader:
Aprovéchalo.

Esto no ayuda en el caso general de que el software sea de diferentes proveedores y no haya ningún control en común. Así que todo este baile de pandereta es inicialmente inútil. Y esto ya se ha dicho antes. Estás desordenando el hilo fuera del tema.

Razón de la queja: