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

 
Stanislav Korotky:

Sim, e em resposta a isso você primeiro alega que não há problema, depois oferece soluções diferentes, mas elas não funcionam no caso geral. Você está prestando um mau serviço às pessoas, alegando ter fornecido uma solução. Não há necessidade de um pedido de desculpas. Seria melhor chegar ao fundo da questão de agora em diante.

Mas você precisa pedir desculpas, porque não leu nada e eu escrevi:

"Eu corri estes indicadores em janelas diferentes do mesmo símbolo e funcionou bem,

mas quando corri os dois indicadores em uma janela de símbolo ,ele realmente

assinatura "caiu" quando um indicador foi removido.

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

Adicionado

Por favor, Stanislav, não continue com esta polêmica, não queira se desculpar - não peça desculpas.

 
Slava:

A assinatura aumenta o contador em 1.

O cancelamento da inscrição diminui o contador em 1.

Se seu EA precisar de eventos de tumblr, ele não deve depender de outros EAs que alguém lhe permita subscrever. Ele deve se inscrever no OnInit. E no OnDeinit - cancelar a inscrição

O que você escreveu - todos o fazem.

Mas o problema é que se 2 assinaturas foram chamadas em uma janela, quando uma assinatura é apagada - a outra (segunda) é apagada.

 
prostotrader:

O que você escreveu - todo mundo faz.

Mas o problema é que se uma assinatura foi chamada 2 vezes em uma janela, então a eliminação de uma assinatura elimina a outra (a segunda).

Não. Não deveria ser assim. 2 assinaturas - 2 AddRef. 1 Cancelamento de inscrição - 1 Lançamento. Como resultado, o contador é 1.

A assinatura só é destruída depois que o contador se torna 0

 
prostotrader:
Mas o problema é que se 2 assinaturas foram chamadas em uma janela, então quando uma assinatura é apagada, a outra (segunda) é apagada.

Em outras palavras, há um contador especialista/especialista (mas apenas um especialista pode estar em UM gráfico), mas não há nenhum contador especialista/indicador ou contador indicador/indicador

 
A100:
Em outras palavras, há um contador de peritos/especialistas, mas nenhum contador de peritos/indicadores

Só pode haver um especialista em uma janela.

 
prostotrader:

Só pode haver um avaliador em uma janela.

Exatamente certo... entre janelas/gráficos conta... mas por dentro - NÃO

 
Slava:

Não, não deveria ser assim. 2 Assinaturas - 2 AddRef. 1 Cancelamento de inscrição - 1 Lançamento. Como resultado, o contador é 1.

A assinatura só é destruída depois que o contador se torna 0

Esta linha tem o código para os indicadores, execute-os na mesma janela no mesmo símbolo (fortes) e você verá por si mesmo

Adicionado

A verificação leva 2 minutos

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

2 indicadores

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

Eu entendo o problema.

Ainda não está pronto para responder

 
Slava:

Eu entendo o problema.

Ainda não está pronto para responder

Muito obrigado, estou muito ansioso para resolvê-lo!

 
prostotrader:

Mas você, por outro lado, precisa se desculpar, porque é você quem não lê nada, e eu escrevi:

"Eu corri estes indicadores em diferentes janelas com o mesmo símbolo e funciona bem,

mas quando corri os dois indicadores em uma janela de símbolo ,ele realmente

assinatura "caiu" quando um indicador foi removido.

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

Adicionado

Por favor, Stanislav, não continue com este argumento, não queira se desculpar - não peça desculpas.

Você começou, você deve terminá-lo. Não tenho nada a pedir desculpas. Eu escrevi tudo ao ponto, ao contrário de você.

Eu vi todos os seus postos. Você citou apenas o que lhe convém e ignorou o que era antes e depois, como se não o tivesse escrito. De fato, desde o momento em que você conseguiu reproduzir o problema. E, em geral, você chegou a esta linha com seu problema, que não tem nada a ver com o tema.