A assinatura do OnBookEvent às vezes cai - existe algo assim? - página 6

 
Sergey Savinkin:

Eu gostaria de um comentário dos desenvolvedores, porque não há nada na documentação sobre isso.

Você não vê pelo registro acima que há um contador?

 
prostotrader:

Não parece, pelo registro acima, que há um contador?

Você pode ver no log acima que uma EA não anula a inscrição da outra. Mas como ela é implementada - através de contador ou outra coisa qualquer - não é clara. Além disso, o programador teve um indicador e um Expert Advisor. Mas o indicador tem uma característica desagradável de misturar a ordem de início do OnInit() e OnDeinit(). Embora, não deve confundir o balcão, se ele realmente tem um.

 
Sergey Savinkin:

Você pode ver no log acima que uma EA não anula a inscrição da outra. Mas como ela é implementada - através de contador ou outra coisa qualquer - não é clara. Além disso, o programador tem um indicador e um Expert Advisor. Mas o indicador tem uma característica irritante de misturar a ordem de início OnInit() e OnDeinit().

Portanto, implementamos a variável is_book para evitar confusão.

Os desenvolvedores fizeram do MarketBookAdd() uma FUNÇÃO por uma razão.

 
prostotrader:

Você não consegue ver pelo registro acima que há um contador?

O registro não é nada quando se utiliza uma situação diferente daquela em que o problema ocorre.

Pegue 2 de seus programas (Expert Advisor e um indicador, ou 2 induladores) - coloque-os na mesma tabela e depois apague um deles. A assinatura da instância restante cairá.

Mesmo quando a seqüência de chamadas OnInit/OnDeinit está correta (sempre foi correta nestes testes), há um problema.

 
Essa abordagem não funciona?
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:
Esta abordagem não funciona?

Ainda não o executei no terminal, mas tenho uma pergunta - como mover o código para um invólucro de objeto ajuda contra "cortar as extremidades" pelo próprio terminal (como está acontecendo agora)? Bem, um objeto será criado e a assinatura será iniciada, e se alguém fechar outro programa com a assinatura, o objeto nunca mais saberá que não há mais assinatura.

Fiz da maneira mais simples: comparo os timeouts no OnBookEvent e no OnTick. Se o timeout no primeiro exceder o timeout no segundo em mais de N segundos - eu me inscrevo novamente.

 
Stanislav Korotky :

Ainda não o executei no terminal, mas surgiu a questão - como a transferência do código para um wrapper de objeto ajudará a "cortar as pontas" pelo próprio terminal dentro de si (como está acontecendo agora)? Bem, um objeto será criado e a assinatura começará, e se alguém fechar outro programa com uma assinatura, o objeto nunca saberá que a assinatura não existe mais.

Fiz isso de uma maneira simples: comparo os tempos limite para OnBookEvent e OnTick. Se o primeiro tempo limite exceder o segundo tempo limite em mais de N segundos, eu assino novamente.

Bem, como esperado, você está errado.

1º indicador

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

Segundo indicador

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


Resultado

 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:

Ainda não o executei no terminal, mas tenho uma pergunta - como mover o código para um invólucro de objeto ajuda contra "cortar as extremidades" pelo próprio terminal (como está acontecendo agora)?

O Init e o Deinit não participam da assinatura. Talvez esta circunstância possa ajudar.

 

Eu já executei estes indicadores em diferentes janelas com o mesmo símbolo e funciona bem,

mas quando corri os dois indicadores na mesma janela de símbolo, ele realmente

assinatura "caiu" ao remover um indicador.

Escrever para o SD (talvez eles tenham tempo para fazer uma correção na nova construção)

Razão: