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

 
Stanislav Korotky:

是的,作为回应,你首先声称没有问题,然后提供不同的解决方案,但它们在一般情况下不起作用。你声称已经提供了一个解决方案,这是对人们的伤害。没有必要道歉。从现在开始,最好能把事情搞清楚。

但你需要道歉,因为你没有阅读任何东西,而我写了。

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

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

当一个指标被移除时,订阅就 "脱落 "了

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

添加

拜托,斯坦尼斯拉夫,不要继续这种论战,不要想道歉--不要。

 
Slava:

订阅使计数器增加1。

取消订阅会使计数器减少1。

如果你的EA需要tumblr事件,他不应该依赖其他EA来启用对他的订阅。他应该在OnInit中订阅自己。而在OnDeinit中--取消订阅

你所写的--每个人都是如此。

但问题是,如果在一个窗口中调用了两个订阅,当一个订阅被删除时,另一个(第二个)也被删除。

 
prostotrader:

你所写的--每个人都是如此。

但问题是,如果一个订阅在一个窗口中被调用了2次,那么删除一个订阅会删除另一个(第二个)。

不,它不应该是这样的。2个订阅 - 2个AddRef。1次取消订阅 - 1次发布。结果是,计数器为1。

只有在计数器变为0后,订阅才会被销毁

 
prostotrader:
但问题是,如果在一个窗口中调用了两个订阅,那么当一个订阅被删除时,另一个(第二个)也会被删除。

换句话说,有专家/专家计数器(但一个图表上只能有一个专家),但没有专家/指标计数器或指标/指标计数器。

 
A100:
换句话说,有一个专家/专家计数器,但没有专家/指示器计数器

一个窗口只能有一个专家。

 
prostotrader:

一个窗口只能有一个评估员。

完全正确...窗口/图表之间也算......但内部 - 没有

 
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:

但另一方面,你需要道歉,因为是你什么都不看,而我写了。

"我在同一个符号的不同窗口中运行这些指标,效果很好。

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

当一个指标被移除时,订阅就 "脱落 "了

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

添加

拜托,斯坦尼斯拉夫,不要继续这种争论,不要想道歉--不要。

你开始了,你应该完成它。我没有什么需要道歉的。我写的东西都是直奔主题的,不像你。

我已经看到了你所有的帖子。你只引用了适合你的东西,而你只是忽略了之前和之后的内容,就好像你没有写过一样。的确,从你设法重现这个问题的那一刻起。而且总的来说,你带着你的问题来到这个主题,这与主题无关。

原因: