OnBookEvent에 대한 구독이 때때로 중단됩니다. 그런 일이 있습니까? - 페이지 11

 
Stanislav Korotky :

예, 이에 대한 응답으로 처음에는 문제가 없다고 오랫동안 주장한 다음 해결 방법에 대해 다른 옵션을 제공하기 시작했지만 일반적인 경우에는 작동하지 않습니다. 당신은 해결책을 제공했다고 주장함으로써 사람들에게 해를 끼치고 있습니다. 사과는 필요하지 않습니다. 본질을 계속 탐구하는 것이 좋습니다.

그러나 당신은 아무것도 읽지 않았기 때문에 사과해야하지만 나는 다음과 같이 썼습니다.

" 같은 기호의 다른 창에서 이 표시기를 실행했는데 제대로 작동합니다.

그러나 동일한 기호 창에서 두 표시기를 모두 실행하면실제로

하나의 지표가 제거되었을 때 구독이 "떨어졌습니다" .

SD에 쓰기(새 빌드에서 수정할 시간이 있을 수 있음) "

추가됨

제발, Stanislav, 이 논쟁을 계속하지 마세요. 사과하고 싶지 않다면 하지 마세요.

 
Slava :

구독하면 카운터가 1 증가합니다.

구독을 취소하면 카운터가 1 감소합니다.

Expert Advisor에 Depth of Market 이벤트가 필요한 경우 누군가가 구독을 활성화할 것이라고 다른 Expert Advisor에 의존해서는 안 됩니다. 자체적으로 OnInit를 구독해야 합니다. 그리고 OnDeinit에서 - 구독 취소

당신이 쓴 것 - 모두가 그렇습니다.

그러나 문제는 한 창에서 구독이 2번 호출된 경우 하나의 구독이 삭제되면 다른(두 번째) 구독도 삭제된다는 것입니다.

 
prostotrader :

당신이 쓴 것 - 모두가 그렇습니다.

그러나 문제는 한 창에서 구독이 2번 호출된 경우 하나의 구독이 삭제되면 다른(두 번째) 구독도 삭제된다는 것입니다.

아니요. 이것은 안됩니다. 2개의 구독 - 2개의 AddRef. 1 구독 취소 - 1 릴리스. 결과적으로 카운터는 1과 같습니다.

카운터가 0에 도달할 때만 구독이 파괴됩니다.

 
prostotrader :
그러나 문제는 한 창에서 구독이 2번 호출된 경우 하나의 구독이 삭제되면 다른(두 번째) 구독도 삭제된다는 것입니다.

즉, 전문가\전문가 카운터가 있지만(하지만 한 명의 전문가만 차트에 있을 수 있음) 전문가\지표 카운터 또는 지표\지표가 없습니다.

 
A100 :
즉, 전문가/전문가 카운터는 있지만 전문가/지표 카운터는 없습니다.

한 창에는 한 명의 전문가만 있을 수 있습니다.

 
prostotrader :

한 창에는 한 명의 전문가만 있을 수 있습니다.

맞아요... windows\charts 사이에서 계산되지만... 내부 - NO

 
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에 쓰기(새 빌드에서 수정할 시간이 있을 수 있음) "

추가됨

제발, Stanislav, 이 논쟁을 계속하지 마세요. 사과하고 싶지 않다면 하지 마세요.

당신은 토론을 시작했고, 당신은 그것을 끝냅니다. 나는 사과할 것이 없습니다. 나는 당신과 달리 케이스에 모든 것을 썼습니다.

나는 당신의 모든 게시물을 보았습니다. 자신에게 맞는 말만 인용했는데, 그 이전에는 안 쓴 것처럼 무시하고 다녔다. 실제로, n번째로 문제를 재현하는 데 성공했습니다. 그리고 일반적으로 그들은 주제와 관련이없는 자신의 문제로이 주제에 왔습니다.