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

 
Sergey Savinkin:

我想让开发人员发表一下意见,因为在文档中没有关于这个的内容。

从上面的日志中,你没有看到有一个计数器吗?

 
prostotrader:

从上面的日志来看,不是有一个计数器吗?

你可以从上面的日志中看到,一个EA并没有退订另一个。但如何实施--通过计数器或其他东西--还不清楚。此外,该程序员还拥有一个指标和一个专家顾问。但该指标有一个令人不快的特点,就是把OnInit()和OnDeinit()的启动顺序混在一起。虽然,它不应该混淆计数器,如果它真的有一个。

 
Sergey Savinkin:

你可以从上面的日志中看到,一个EA并没有退订另一个。但如何实施--通过计数器或其他东西--还不清楚。此外,该程序员还有一个指标和一个专家顾问。但该指标有一个恼人的特点,就是把OnInit()和OnDeinit()的启动顺序混在一起。

因此,我们实现了is_book这个变量,以避免混淆。

开发者将MarketBookAdd() 变成一个函数是有原因的。

 
prostotrader:

从上面的日志中,你难道看不到有一个计数器吗?

在使用与发生问题的情况不同的情况下,日志是没有什么的。

拿出你的两个程序(专家顾问和一个指标,或两个指标)--把它们放在同一个图表上,然后删除其中一个。剩余实例的订阅量将下降。

即使OnInit/OnDeinit的调用顺序是正确的(在这些测试中一直是正确的),也有一个问题。

 
这种方法难道不可行吗?
class MARKETBOOK
{
private:  
  const string SymbName;
  int Count;

public:  
  MARKETBOOK( const string Symb ) : SymbName(Symb), Count(0) { this.On(); }
  ~MARKETBOOK( void ) { this.Off(); }

  bool isExist( void ) const { return(this.Count); }
    
  bool On( void ) { return (this.isExist() || (bool)(this.Count += ::MarketBookAdd(this.SymbName))); }

  bool Off( void )
  {
    while (this.isExist())
      this.Count -= ::MarketBookRelease(this.SymbName);
      
    return(!this.isExist());
  }  
};

MARKETBOOK MarketBook(_Symbol);
 
fxsaber:
这种方法不起作用?

我还没有在终端中运行它,但我有一个问题--把代码移到一个对象封装器中,对防止终端本身的 "断头 "有什么帮助(就像现在这样)?那么,一个对象将被创建,订阅将开始,然后如果有人关闭了另一个有订阅的程序,这个对象将永远不知道没有订阅了。

我做了一个简单的方法:我比较了OnBookEvent和OnTick的超时情况。如果第一个电话的超时时间超过第二个电话的超时时间超过N秒--我就重新订阅。

 
Stanislav Korotky :

我还没有在终端中运行它,但是问题出现了——将代码传输到对象包装器如何帮助终端本身在自身内部“切断末端”(就像现在发生的那样)?好吧,将创建一个对象并开始订阅,然后如果有人用订阅关闭另一个程序,该对象将永远不会知道订阅不再存在。

我以一种简单的方式做到了这一点:我比较了 OnBookEvent 和 OnTick 的超时。如果第一次超时超过第二次超时超过 N 秒,我重新订阅。

好吧,正如预期的那样,你错了。

第一个指标

//+------------------------------------------------------------------+
//|                                                   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"
#define on_call - 111
#property indicator_separate_window
bool is_book = false ;
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 ()
  {
   //--- 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 ());
    }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
     if (is_book == true )
    { 
       MarketBookRelease ( Symbol ());
       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);
   }
   
  }  
//+------------------------------------------------------------------+

第二个指标

//+------------------------------------------------------------------+
//|                                                   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"
#define on_call - 111
#property indicator_separate_window
bool is_book = false ;
double Buff[];
int event_cnt = 0 ;
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1    "Test_2"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrLime
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   //--- 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 ());
    }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
     if (is_book == true )
    { 
       MarketBookRelease ( Symbol ());
       Print ( __FUNCTION__ , ": Подписка 2 на стакан удалена. Символ " , 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__ , ": Подписка 2 работает. Символ " , symbol);
       double price[];
       OnCalculate (event_cnt,event_cnt,on_call,price);
   }
   
  }  
//+------------------------------------------------------------------+


结果

2018.07 . 24 22 : 20 : 26.992 Test_ind_1 (Si- 9.18 ,M1) OnInit : Подписка на стакан добавлена. Символ Si- 9.18
2018.07 . 24 22 : 20 : 26.998 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 27.214 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 27.226 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 27.528 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 28.250 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 28.374 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 28.388 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 28.974 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 29.014 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 29.114 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 29.238 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 29.296 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 29.304 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 29.397 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 29.405 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 30.321 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 30.335 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 30.593 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 30.607 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 30.915 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 31.407 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 31.491 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 31.505 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 31.611 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 31.707 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 31.815 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 33.395 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 33.577 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 33.777 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 33.785 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 33.923 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 33.943 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 34.693 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 35.725 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 36.059 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 36.251 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 36.265 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 20 : 36.418 Test_ind_1 (Si- 9.18 ,M1) OnDeinit : Подписка на стакан удалена. Символ Si- 9.18
2018.07 . 24 22 : 21 : 41.846 Test_ind_1 (Si- 9.18 ,M1) OnInit : Подписка на стакан добавлена. Символ Si- 9.18
2018.07 . 24 22 : 21 : 41.852 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 41.884 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 42.658 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 42.926 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 44.540 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 44.632 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 45.396 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 45.722 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 46.132 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 46.514 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 46.860 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 47.012 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 47.064 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 47.254 Test_ind_2 (Si- 9.18 ,M1) OnInit : Подписка 2 на стакан добавлена. Символ Si- 9.18
2018.07 . 24 22 : 21 : 52.020 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 52.020 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 52.026 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 52.026 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 52.056 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 21 : 52.056 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18

2018.07 . 24 22 : 22 : 07.882 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.886 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.886 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.946 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.946 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.961 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.961 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.963 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 07.963 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 08.039 Test_ind_1 (Si- 9.18 ,M1) OnBookEvent : Подписка работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 08.039 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 08.433 Test_ind_1 (Si- 9.18 ,M1) OnDeinit : Подписка на стакан удалена. Символ Si- 9.18
2018.07 . 24 22 : 22 : 08.947 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 09.067 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 09.143 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 09.162 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 09.164 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 09.910 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 12.446 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 16.896 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 16.908 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 17.144 Test_ind_2 (Si- 9.18 ,M1) OnBookEvent : Подписка 2 работает. Символ Si- 9.18
2018.07 . 24 22 : 22 : 17.216 Test_ind_2 (Si- 9.18 ,M1) OnDeinit : Подписка 2 на стакан удалена. Символ Si- 9.18
 
Stanislav Korotky:

我还没有在终端中运行它,但我有一个问题--把代码移到一个对象封装器中,对防止终端本身的 "断头 "有什么帮助(就像现在这样)?

Init和Deinit不参与订阅。也许这种情况会有所帮助。

 

我在同一符号的不同窗口中运行过这些指标,效果不错。

但当我在同一个符号窗口中运行这两个指标时,它真的

拆除一个指示器时,认购书 "脱落 "了。

写给SD(也许他们会有时间在新版本中进行修复)。

原因: