L'abonnement à OnBookEvent est parfois interrompu - existe-t-il une telle chose ? - page 9

 

Il y a une solution de béquille.

Utilisez les variables globales du TERMINAL pour créer votre propre compteur.

Il faut seulement penser à un nom unique pour que deux fenêtres du même symbole créent leur propre nom.

variable globale du terminal.

Ajouté

Si vous ne voulez pas ouvrir deux fenêtres de symboles, vous pouvez utiliser Magik comme nom de la variable globale du terminal

vous pouvez utiliser 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 juste un nom de symbole

comme "Si-9.18_bookcount".

Je compte les fonds de garantie (GO) pour les ordres en attente de cette manière

 
prostotrader:
Vous devez seulement penser à un nom unique pour que deux fenêtres du même symbole créent leur propre variable globale du terminal.
On peut difficilement trouver un meilleur nom que celui-ci : https://www.mql5.com/ru/forum/267154/page8#comment_8171650.
Подписка на OnBookEvent иногда отваливается - есть такое?
Подписка на OnBookEvent иногда отваливается - есть такое?
  • 2018.07.24
  • www.mql5.com
После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторы...
 
A100:
Je peux difficilement trouver un meilleur nom que celui-ci https://www.mql5.com/ru/forum/267154/page8#comment_8171650

Super, quel que soit le nom, du moment qu'il est unique s'il y a plus d'une fenêtre.

Ajouté

Corrigez-moi si je me suis trompé quelque part.

//+------------------------------------------------------------------+
//|                                                    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:
Corrigez, si je me suis trompé quelque part.

L'unicité du nom est directement liée au nom du symbole, je voulais dire le cas plus général

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

c'est-à-dire dans votre cas (si tous les programmes MQL sur le graphique ne fonctionnent qu'avec le symbole courant)

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

au lieu de

IntegerToString(ChartID())
ce n'est pas une erreur... juste la discipline
 

Les gars !

Nous ne "battrons" JAMAIS MT-5 !

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

Indicateur 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


Résultat 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

Résultat 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 vous mettez 1 indicateur et ensuite le second indicateur, alors

lorsque vous supprimez le 1er indicateur, c'est la poubelle totale (Résultat 2), MAIS

Si vous mettez le 1er indicateur en premier, puis le 2ème, puis...

retirer le 2e, puis le 1er, tout va bien (Résultat 1) !


Ajouté

Il semble que si 2 indicateurs sont ajoutés, alors lors de la suppression de l'indicateur qui

a été placé en première position,

void OnDeinit(const int reason) est appelé autant de fois qu'il y a d'indicateurs sur le graphique !

 
prostotrader:

Les gars !

Nous ne " battrons " JAMAIS la MT-5 !

En général, il y a des pièges à éviter lorsqu'on traite des variables globales... il y a peut-être une erreur dans le code... Je suis sur mon portable en ce moment - peut-être que quelqu'un de mon ordinateur peut vérifier - aidez-moi.

 

Je crois que j'ai trouvé ! Chaque indicateur a une variable qui doit être mise à jour avant de supprimer un indicateur ! :)

Je vais arranger ça.

 

Oui, je me suis trompé. Il fonctionne correctement.

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

Fichier joint

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

Indicateur

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


Il fonctionne correctement !

 
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
Profitez-en.
 
prostotrader:
Profitez-en.

Cela n'aide pas dans le cas général où le logiciel provient de différents fournisseurs et qu'il n'y a pas de contrôle commun. Donc toute cette danse du tambourin est initialement inutile. Et cela a déjà été dit auparavant. Vous encombrez le fil de discussion hors sujet.

Raison: