OnBookEventのサブスクリプションが落ちることがあるのですが、そのようなことはあるのでしょうか? - ページ 6

 
Sergey Savinkin:

ドキュメントには何も書かれていないので、開発者のコメントが欲しい。

上のログから、カウンターがあることがわからないのでしょうか?

 
prostotrader:

上のログを見る限りでは、カウンターがあるように見えませんか?

上のログから、一方のEAが他方のEAを退会させないことがわかります。しかし、カウンターなどを通じて、どのように実施されるかは不明である。さらに、プログラマーはインジケーターとExpert Advisorを持っていた。しかし、このインジケータは、OnInit()とOnDeinit()の開始順序がごちゃごちゃになるという不快な特徴を持っています。しかし、本当にカウンターがあるのなら、混乱しないようにしなければなりません。

 
Sergey Savinkin:

上のログから、一方のEAが他方のEAを退会させないことがわかります。しかし、それがカウンターか何かでどのように実装されるかは不明です。さらに、プログラマーは、インジケータとExpert Advisorを備えています。しかし、このインジケータはOnInit()とOnDeinit()の起動順序がごちゃごちゃになってしまうという厄介な特徴があるのです。

そこで、混乱を避けるために、is_book変数を実装しました。

開発者がMarketBookAdd() をFUNCTIONにしたのは理由があります。

 
prostotrader:

上のログから、カウンターがあることがわからないのでしょうか?

問題が発生した状況とは異なる状況で使用しても、ログは何も残らない。

2つのプログラム(Expert Advisorとインジケータ、または2つのインジケータ)を同じチャート上に配置し、そのうちの1つを削除してください。残りのインスタンスの加入が落ちる。

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のタイムアウトを比較するというシンプルな方法でやってみました。1回目のタイムアウトが2回目のタイムアウトをN秒以上上回った場合、再購読します。

 
Stanislav Korotky :

私はまだターミナルでそれを実行していませんが、疑問が生じました-コードをオブジェクトラッパーに転送すると、ターミナル自体が内部で「端を切り落とす」のにどのように役立ちますか(現在起こっているように)?さて、オブジェクトが作成され、サブスクリプションが開始されます。その後、誰かがサブスクリプションで別のプログラムを閉じた場合、オブジェクトはサブスクリプションがもうないことを知ることはありません。

私は簡単な方法でそれを行いました:OnBookEventとOnTickのタイムアウトを比較します。最初のタイムアウトが2番目のタイムアウトを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);
   }
   
  }  
//+------------------------------------------------------------------+

2番目のインジケーター

//+------------------------------------------------------------------+
//|                                                   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はサブスクリプションに参加しない。もしかしたら、この状況が役に立つかもしれません。

 

これらのインジケータを同じシンボルの別のウィンドウで実行しましたが、問題なく動作しています。

が、同じシンボルウィンドウで両方のインジケータを実行すると、本当に

インジケーターを1つ取り外すと、サブスクリプションが「落ちる」。

SDに書き込む(もしかしたら、新ビルドで修正する時間があるかもしれません。)