L'abonnement à OnBookEvent est parfois interrompu - existe-t-il une telle chose ? - page 11

 
Stanislav Korotky:

Oui, et en réponse à cela, vous avez d'abord affirmé pendant longtemps qu'il n'y avait pas de problème, puis vous avez commencé à proposer différentes solutions, mais elles ne fonctionnent pas dans le cas général. Vous rendez un mauvais service aux gens en prétendant avoir apporté une solution. Il n'y a pas besoin d'excuses. Il serait préférable d'aller au fond des choses à partir de maintenant.

Mais tu dois t'excuser, car tu n'as rien lu et j'ai écrit :

"J'ai exécuté ces indicateurs dans différentes fenêtres du même symbole et cela a bien fonctionné,

mais lorsque j'ai utilisé les deux indicateurs dans une fenêtre de symboles ,cela a vraiment...

L'abonnement est "tombé" lorsqu'un indicateur a été retiré.

Ecrire au SD (peut-être auront-ils le temps de faire un correctif dans la nouvelle version)".

Ajouté

S'il te plaît, Stanislav, ne continue pas cette polémique, ne veux pas t'excuser - ne le fais pas.

 
Slava:

L'abonnement augmente le compteur de 1.

Le désabonnement diminue le compteur de 1.

Si votre EA a besoin d'événements tumblr, il ne doit pas dépendre d'autres EA qui lui permettront de s'abonner. Il devrait s'inscrire lui-même dans OnInit. Et dans OnDeinit - désinscription

Ce que vous avez écrit, tout le monde le fait.

Mais le problème est que si deux abonnements ont été appelés dans une fenêtre, lorsqu'un abonnement est supprimé, l'autre (le second) est supprimé.

 
prostotrader:

Ce que vous avez écrit, tout le monde le fait.

Mais le problème est que si un abonnement a été appelé 2 fois dans une fenêtre, alors la suppression d'un abonnement supprime l'autre (le second).

Non. Ça ne devrait pas être comme ça. 2 abonnements - 2 AddRef. 1 désinscription - 1 libération. En conséquence, le compteur est à 1.

L'abonnement est détruit seulement après que le compteur soit devenu 0

 
prostotrader:
Mais le problème est que si deux abonnements ont été appelés dans une fenêtre, lorsqu'un abonnement est supprimé, l'autre (le second) est supprimé.

En d'autres termes, il y a un compteur expert/expert (mais un seul expert peut être sur UN graphique), mais il n'y a pas de compteur expert/indicateur ou indicateur/indicateur.

 
A100:
En d'autres termes, il existe un compteur expert/expert, mais pas de compteur expert/indicateur.

Il ne peut y avoir qu'un seul expert dans une fenêtre.

 
prostotrader:

Il ne peut y avoir qu'un seul assesseur dans une fenêtre.

C'est exactement ça... entre les fenêtres/chartes compte... mais à l'intérieur - NON

 
Slava:

Non, ça ne devrait pas être comme ça. 2 abonnements - 2 AddRef. 1 désinscription - 1 libération. En conséquence, le compteur est à 1.

L'abonnement est détruit seulement après que le compteur soit devenu 0

Ce fil de discussion contient le code des indicateurs, exécutez-les dans la même fenêtre sur le même symbole (forts) et vous verrez par vous-même.

Ajouté

La vérification prend 2 minutes

1 indicateur

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

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

Je comprends le problème.

Pas encore prêt à répondre

 
Slava:

Je comprends le problème.

Pas encore prêt à répondre

Merci, j'ai vraiment hâte de le résoudre !

 
prostotrader:

Mais toi, en revanche, tu dois t'excuser, car c'est toi qui ne lis rien, et c'est moi qui ai écrit :

"J'ai exécuté ces indicateurs dans différentes fenêtres du même symbole et cela fonctionne bien,

mais lorsque j'ai utilisé les deux indicateurs dans une fenêtre de symboles ,cela a vraiment...

L'abonnement est "tombé" lorsqu'un indicateur a été retiré.

Ecrire au SD (peut-être auront-ils le temps de faire un correctif dans la nouvelle version)".

Ajouté

S'il te plaît, Stanislav, ne continue pas cette dispute, ne veux pas t'excuser - ne le fais pas.

Vous l'avez commencé, vous devez le terminer. Je n'ai pas à m'excuser. J'ai tout écrit jusqu'au bout, contrairement à toi.

J'ai vu tous vos messages. Vous n'avez cité que ce qui vous arrange, et vous ignorez ce qui était avant et après, comme si vous ne l'aviez pas écrit. En effet, dès la première fois, vous avez réussi à reproduire le problème. Et en général, vous êtes venu dans ce fil avec votre problème, qui n'a rien à voir avec le sujet.

Raison: