L'iscrizione a OnBookEvent a volte cade - esiste una cosa del genere? - pagina 11

 
Stanislav Korotky:

Sì, e in risposta a questo, prima hai sostenuto a lungo che non c'era alcun problema, poi hai iniziato a offrire diverse soluzioni, ma non funzionano nel caso generale. State rendendo un cattivo servizio alle persone sostenendo di aver fornito una soluzione. Non c'è bisogno di scuse. Sarebbe meglio andare in fondo alla questione d'ora in poi.

Ma devi scusarti, perché non hai letto nulla e ho scritto:

"Ho eseguito questi indicatori in diverse finestre dello stesso simbolo e ha funzionato bene,

ma quando ho eseguito entrambi gli indicatori in una finestra di simboli ,è davvero

L'abbonamento è "caduto" quando un indicatore è stato rimosso.

Scrivete alla SD (forse avranno il tempo di fare una correzione nella nuova build)"

Aggiunto

Per favore, Stanislav, non continuare questa polemica, non vuoi scusarti - non farlo.

 
Slava:

La sottoscrizione aumenta il contatore di 1.

L'annullamento dell'iscrizione diminuisce il contatore di 1.

Se il tuo EA ha bisogno di eventi tumblr, non dovrebbe dipendere da altri EA che qualcuno gli permetterà di iscriversi. Dovrebbe iscriversi in OnInit. E in OnDeinit - disdire l'iscrizione

Quello che hai scritto - lo fanno tutti.

Ma il problema è che se 2 abbonamenti sono stati chiamati in una finestra, quando un abbonamento viene cancellato - l'altro (il secondo) viene cancellato.

 
prostotrader:

Quello che hai scritto - lo fanno tutti.

Ma il problema è che se un abbonamento è stato chiamato 2 volte in una finestra, la cancellazione di un abbonamento cancella l'altro (il secondo).

No, non dovrebbe essere così. 2 abbonamenti - 2 AddRef. 1 unsubscribe - 1 Release. Di conseguenza, il contatore è 1.

La sottoscrizione viene distrutta solo dopo che il contatore diventa 0

 
prostotrader:
Ma il problema è che se 2 abbonamenti sono stati chiamati in una finestra, allora quando un abbonamento viene cancellato, l'altro (il secondo) viene cancellato.

In altre parole, c'è un contatore esperto/esperto (ma solo un esperto può essere su UN grafico), ma non c'è un contatore esperto/indicatore o indicatore/indicatore

 
A100:
In altre parole, c'è un contatore esperto/esperto, ma nessun contatore esperto/indicatore

Ci può essere solo un esperto in una finestra.

 
prostotrader:

Ci può essere solo un valutatore in una finestra.

Esattamente giusto... tra finestre/grafici conta... ma all'interno - NO

 
Slava:

No, non dovrebbe essere così. 2 Abbonamenti - 2 AddRef. 1 unsubscribe - 1 Release. Di conseguenza, il contatore è 1.

La sottoscrizione viene distrutta solo dopo che il contatore diventa 0

Questo thread ha il codice per gli indicatori, eseguiteli nella stessa finestra sullo stesso simbolo (forti) e vedrete voi stessi

Aggiunto

Il controllo richiede 2 minuti

1 indicatore

//+------------------------------------------------------------------+
//|                                                   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 indicatore

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

Capisco il problema.

Non sono ancora pronto a rispondere

 
Slava:

Capisco il problema.

Non sono ancora pronto a rispondere

Grazie, non vedo l'ora di risolverlo!

 
prostotrader:

Ma tu, d'altra parte, devi chiedere scusa, perché sei tu che non leggi niente, e io ho scritto:

"Ho eseguito questi indicatori in diverse finestre dello stesso simbolo e funziona bene,

ma quando ho eseguito entrambi gli indicatori in una finestra di simboli ,è davvero

L'abbonamento è "caduto" quando un indicatore è stato rimosso.

Scrivete alla SD (forse avranno il tempo di fare una correzione nella nuova build)"

Aggiunto

Per favore, Stanislav, non continuare questa discussione, non vuoi scusarti - non farlo.

L'hai iniziato, dovresti finirlo. Non ho niente di cui scusarmi. Ho scritto tutto al punto, a differenza di te.

Ho visto tutti i tuoi post. Hai citato solo quello che ti fa comodo, e ignori quello che c'era prima e poi, come se non l'avessi scritto tu. Infatti dalla een volta che sei riuscito a riprodurre il problema. E in generale, sei venuto in questo thread con il tuo problema, che non ha nulla a che fare con l'argomento.

Motivazione: