对OnBookEvent的订阅有时会脱落--有这种情况吗? - 页 9

 

有一个拐杖的解决方案。

使用TERMINAL的全局变量 来创建你自己的计数器。

只是你需要想一个独特的名字,以便同一符号的两个窗口创建自己的

全局终端变量。

添加

如果你不想打开两个符号窗口,你可以使用Magik作为全局终端变量的名称

你可以使用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);
  }
//+------------------------------------------------------------------+

或只是一个符号名称

如 "Si-9.18_bookcount"。

我是这样计算挂单的抵押品(GO)资金的

 
prostotrader:
只是你需要想一个独特的名字,以便同一符号的两个窗口创建自己的全局终端变量。
你很难想到一个比这更好的名字https://www.mql5.com/ru/forum/267154/page8#comment_8171650
Подписка на OnBookEvent иногда отваливается - есть такое?
Подписка на OnBookEvent иногда отваливается - есть такое?
  • 2018.07.24
  • www.mql5.com
После того как поплотнее занялся стаканом и повесил на чарты несколько экспертов и индикаторов, подписанных на OnBookEvent, обнаружил, что некоторы...
 
A100:
我几乎想不出比这更好的名字了https://www.mql5.com/ru/forum/267154/page8#comment_8171650

很好,不管叫什么名字,只要在有多个窗口的情况下是唯一的就可以了。

添加

如果我有什么地方说错了,请纠正我。

//+------------------------------------------------------------------+
//|                                                    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:
如果我有什么地方弄错了,请纠正。

名称的唯一性与符号的名称直接相关,我指的是更普遍的情况

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

也就是说,在你的情况下(如果图表上的所有MQL程序只与当前的符号一起工作)。

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

而不是

IntegerToString(ChartID())
这不是一个错误...只是纪律
 

伙计们!

我们永远不会 "打败 "MT-5!

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

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

全局变量


结果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

结果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

如果你先放1个指标,再放第二个指标,那么

当你删除第一个指标时--完全是垃圾(结果2),但

如果你把第一个指标放在前面,然后是第二个指标,然后是

移除第2个,然后是第1个,一切都很好(结果1)!


添加

看来,如果添加了2个指标,那么在删除指标时,该

被放在第一位。

void OnDeinit(const int reason)被调用的次数与图表上的指标数量一样多!

 
prostotrader:

伙计们!

我们将永远不会 "打败 "MT-5!

一般来说,在处理全局变量 时,会有一些陷阱...代码中可能有一个错误...我现在在手机上--也许有人能从我的电脑上检查一下--帮帮我。

 

我想我明白了!每个指标都有一个变量,在你删除一个指标之前,需要对其进行更新。:)

我会解决这个问题。

 

是的,我的错误。它在正常工作。

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

附属文件

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

指标

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


它的工作正常了!

 
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
把握机会。
 
prostotrader:
利用好它。

在软件来自不同供应商且没有共同控制的一般情况下,这并没有帮助。因此,所有这些手鼓舞最初是没有用的。而这一点以前已经说过了。你把这个话题弄得乱七八糟,离题万里。