La suscripción a OnBookEvent a veces se cae - ¿existe? - página 11

 
Stanislav Korotky:

Sí, y en respuesta a eso, primero afirmaste durante mucho tiempo que no había ningún problema, luego empezaste a ofrecer diferentes soluciones, pero no funcionan en el caso general. Haces un flaco favor a la gente al pretender dar una solución. No es necesario pedir disculpas. Sería mejor llegar al fondo de la cuestión a partir de ahora.

Pero tienes que disculparte, porque no has leído nada y yo he escrito:

"He ejecutado estos indicadores en diferentes ventanas del mismo símbolo y ha funcionado bien,

pero cuando ejecuté ambos indicadores en una ventana de símbolos ,realmente

Elabono "se cayó" cuando se retiró un indicador.

Escribe a la SD (tal vez tengan tiempo de hacer un arreglo en la nueva construcción)"

Añadido

Por favor, Stanislav, no sigas con esta polémica, no quieras disculparte, no lo hagas.

 
Slava:

La suscripción aumenta el contador en 1.

Anular la suscripción disminuye el contador en 1.

Si su EA necesita eventos de tumblr, no debería depender de otros EAs que le permitan suscribirse. Debería suscribirse en OnInit. Y en OnDeinit - desinscripción

Lo que has escrito, lo hace todo el mundo.

Pero el problema es que si se han llamado 2 suscripciones en una ventana, cuando se elimina una de ellas, se elimina la otra (la segunda).

 
prostotrader:

Lo que has escrito - todo el mundo lo hace.

Pero el problema es que si una suscripción ha sido llamada 2 veces en una ventana, entonces al borrar una suscripción se borra la otra (la segunda).

No. No debería ser así. 2 suscripciones - 2 AddRef. 1 desuscripción - 1 liberación. Como resultado, el contador es 1.

La suscripción se destruye sólo cuando el contador se convierte en 0

 
prostotrader:
Pero el problema es que si se han llamado 2 suscripciones en una ventana, cuando se elimina una de ellas, se elimina la otra (la segunda).

En otras palabras, hay un contador de expertos/expertos (pero sólo puede haber un experto en UN gráfico), pero no hay un contador de expertos/indicadores o de indicadores/indicadores

 
A100:
En otras palabras, hay un contador de expertos/expertos, pero no de expertos/indicadores

Sólo puede haber un experto en una ventana.

 
prostotrader:

Sólo puede haber un evaluador en una ventanilla.

Exactamente... entre ventanas/gráficos cuenta... pero dentro - NO

 
Slava:

No, no debería ser así. 2 Suscripciones - 2 AddRef. 1 desuscripción - 1 liberación. Como resultado, el contador es 1.

La suscripción sólo se destruye cuando el contador se convierte en 0

En este hilo tienes el código de los indicadores, ejecútalos en la misma ventana sobre el mismo símbolo (fuertes) y lo comprobarás por ti mismo

Añadido

La comprobación dura 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 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);
   }
   
  }  
//+------------------------------------------------------------------+
 

Entiendo el problema.

Todavía no está listo para responder

 
Slava:

Entiendo el problema.

Todavía no está preparado para responder

Gracias, ¡muchas ganas de resolverlo!

 
prostotrader:

Pero tú, en cambio, tienes que disculparte, porque eres tú quien no lee nada, y yo escribí:

"He ejecutado estos indicadores en diferentes ventanas del mismo símbolo y funciona bien,

pero cuando ejecuté ambos indicadores en una ventana de símbolos ,realmente

Elabono "se cayó" cuando se retiró un indicador.

Escribe a la SD (tal vez tengan tiempo de hacer un arreglo en la nueva construcción)"

Añadido

Por favor, Stanislav, no sigas con esta discusión, no quieras disculparte - no lo hagas.

Tú lo empezaste, deberías terminarlo. No tengo nada de qué disculparme. He escrito todo al grano, a diferencia de ti.

He visto todos tus posts. Has citado sólo lo que te conviene, y te limitas a ignorar lo que había antes y después, como si no lo hubieras escrito. Efectivamente, desde el momento en que se logró reproducir el problema. Y en general, has venido a este hilo con tu problema, que no tiene nada que ver con el tema.