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

 
Stanislav Korotky:

ええ、それに対してあなたは、まず問題がないと主張し、次に別の解決策を提示しますが、それらは一般的なケースではうまくいきません。解決策を提供したと言って、人々に不利益を与えている。謝罪の必要はありません。これからは真相究明をしたほうがいい。

しかし、あなたは何も読まずに私が書いたのですから、謝る必要があります。

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

が、1つのシンボルウィンドウで 両方のインジケータを実行したところ 本当に

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

SDに書き込む(もしかしたら新ビルドで修正する時間があるかもしれない)"

追加

お願いです、スタニスラフさん、このまま極論を続けないでください、謝りたくないんです。

 
Slava:

加入すると、カウンターが1つ増えます。

退会するとカウンターが1つ減ります。

あなたのEAがtumblrのイベントを必要とする場合、彼は誰かが彼が購読することを可能にすることを他のEAに依存してはいけません。彼はOnInitで自分自身をサブスクライブする必要があります。そして OnDeinit で - unsubscribe します。

あなたが書いていることは、誰もがしていることです。

しかし、問題は、1つのウィンドウで2つのサブスクリプションが呼び出されていた場合、一方のサブスクリプションを削除すると、もう一方(2つ目)も削除されることです。

 
prostotrader:

あなたが書いたこと、みんなそうなんです。

しかし、問題は、1つのウィンドウで2回サブスクリプションが呼び出された場合、1つのサブスクリプションを削除すると、もう1つ(2つ目)が削除されることです。

いや、そんなことはないはずだ。2 サブスクリプション - 2 AddRef.1 配信停止 - 1 リリースその結果、カウンターは1になります。

カウンタが0になった後、サブスクリプションは破棄される

 
prostotrader:
しかし、問題は、1つのウィンドウで2つのサブスクリプションが呼び出されていた場合、一方のサブスクリプションを削除すると、もう一方(2つ目)も削除されることです。

つまり、エキスパート/エキスパートカウンターはありますが(ただし、1つのチャートに存在できるのは1人のエキスパートのみ)、エキスパート/インジケーターカウンターやインジケーター/インジケーターカウンターは存在しません。

 
A100:
つまり、エキスパート/エキスパートカウンターはあるが、エキスパート/インジケーターカウンターはない

1つのウィンドウには、1人のエキスパートしか入れません。

 
prostotrader:

1つのウィンドウには、1人のアセッサーしか配置できません。

まさにその通り...。ウィンドウやチャートの間はカウントされますが、内側はカウントされません。

 
Slava:

いや、そんなことはないはずだ。2 サブスクリプション - 2 AddRef.1 配信停止 - 1 リリースその結果、カウンターは1になります。

カウンタが0になった後、サブスクリプションは破棄される

このスレッドには、指標のコードがあります。同じウィンドウで同じシンボル(砦)でそれらを実行すると、あなた自身のために表示されます。

追加

チェックに要する時間は2分

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

問題点は理解している。

まだ答えられない

 
Slava:

問題点は理解している。

まだ答えられない

ありがとうございます!解くのがとても楽しみです。

 
prostotrader:

でも、逆に謝る必要があるのは、何も読まないあなたで、私は書いたんです。

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

が、1つのシンボルウィンドウで 両方のインジケータを実行したところ 本当に

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

SDに書き込む(もしかしたら新ビルドで修正する時間があるかもしれない)"

追加

お願い、スタニスラフ、この議論を続けないでください、謝罪したくない - しないでください。

始めたからには、最後までやり遂げなければならない。謝ることは何もない。私はあなたと違って、すべてを要領よく書きました。

あなたの投稿を全部見たよ。自分の都合のいいところだけ引用して、それ以前やそれ以降のことはまるで書いていないかのように無視してるだけだろう。確かに、1回目から問題を再現することができましたね。それに大体、このスレッドに来たのは、話題とは関係ないあなたの問題でしょう。