OnBookEvent

La fonction est appelée dans les indicateurs et les EA lorsque l'évènement BookEvent apparaît. Il est prévu pour gérer les changements dans le Depth of Market.

void  OnBookEvent(
   const string&  symbol         // symbole
   );

Parameters

symbol

[in]  Nom du symbole pour lequel le BookEvent est arrivé

Valeur de Retour

Aucune valeur de retour

Note

Pour récupérer les évènements BookEvent pour n'importe quel symbole, abonnez-vous simplement pour les recevoir pour ce symbole en utilisant la fonction MarketBookAdd(). Pour annuler un abonnement pour recevoir le BookEvent pour un symbole donné, appelez la fonction MarketBookRelease().

Le BookEvent est diffusé dans le graphique entier. Ceci signifie que si une application sur un graphique souscrit à BookEvent avec la fonction MarketBookAdd, tous les autres indicateurs et EA lancés sur le même graphique et ayant la fonction OnBookEvent() recevront également cet évènement. Il est donc nécessaire d'analyser le nom du symbole passé à la fonction OnBookEvent() dans le paramètre symbol.

Différents compteurs de BookEvent triés par symboles sont fournis pour toutes les applications en cours d'exécution sur un même graphique. Cela signifie que chaque graphique peut avoir plusieurs abonnements à différents symboles et un compteur est fourni pour chaque symbole. S'abonner et de désabonner aux changements BookEvent ne modifie le compteur d'abonnements que pour les symboles spécifiés dans un seul graphique. En d'autres termes, deux graphiques adjacents peuvent co-éxister pour le même symbole mais avec des valeurs différentes des compteurs d'abonnement.

La valeur initiale du compteur d'abonnement est zéro. A chaque appel à MarketBookAdd(), le compteur d'abonnement pour un symbole spécifié sur le graphique est augmenté de 1 (le symbole du graphique et le symbole de MarketBookAdd() n'ont pas besoin de correspondre). Lors de l'appel à MarketBookRelease(), le compteur d'abonnements pour un symbole spécifié dans le graphique est réduit de 1. Les évènements BookEvent pour n'importe quel symbole sont diffusés dans le graphique jusqu'à ce que le compteur soit égal à zéro. Il est donc important que chaque programme MQL5 contenant MarketBookAdd () appelle se désabonnent correctement des évènements pour chaque symbole en utilisant MarketBookRelease () à la fin de son travail. Pour cela, le nombre d'appels à MarketBookAdd() et à MarketBookRelease() doivent être égaux pour chaque appel pendant le cycle de vie entier du programme MQL5. L'utilisation de flags ou de compteurs d'abonnements personnalisés dans le programme vous permet de travailler en toute sécurité avec les événements BookEvent et empêche de désactiver les abonnements pour obtenir cet événement dans des programmes tiers dans le même graphique.

Les évènements BookEvent ne sont jamais ignorés et sont toujours placés dans une queue, même si le traitement du BookEvent précédent n'est pas encore terminé.

 

Exemple

//+------------------------------------------------------------------+
//|                                           OnBookEvent_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com/en/articles/2635"
#property version   "1.00"
#property description "Exemple de mesure du taux de rafraîchissement du market depth avec OnBookEvent()"
#property description "Le code est tiré de l'article https://www.mql5.com/en/articles/2635"
//--- input parameters
input ulong ExtCollectTime   =30;  // heure du test en secondes
input ulong ExtSkipFirstTicks=10;  // nombre de ticks ignorés au démarrage
//--- flag d'abonnement aux évènements BookEvent
bool book_subscribed=false;
//--- tableau pour conserver les demandes du market depth
MqlBookInfo  book[];
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- affiche le démarrage
   Comment(StringFormat("En attente de l'arrivée des %I64u premiers ticks",ExtSkipFirstTicks));
   PrintFormat("En attente de l'arrivée des %I64u premiers ticks",ExtSkipFirstTicks);
//--- active la diffusion du market depth
   if(MarketBookAdd(_Symbol))
     {
      book_subscribed=true;
      PrintFormat("%s: la fonction MarketBookAdd(%s) a retourné true",__FUNCTION__,_Symbol);
     }
   else
      PrintFormat("%s: la fonction MarketBookAdd(%s) a retourné false ! GetLastError()=%d",__FUNCTION__,_Symbol,GetLastError());
//--- initialisation réussie
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Déinitialise l'expert                                            |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- affiche le code de la raison de la désinitialisation
   Print(__FUNCTION__,": Code de la raison de la désinitialisation = ",reason);  
//--- annule l'abonnement pour récupérer les évènements du market depth
   if(book_subscribed)
     {
      if(!MarketBookRelease(_Symbol))
         PrintFormat("%s: MarketBookRelease(%s) a retourné false ! GetLastError()=%d",_Symbol,GetLastError());
      else
         book_subscribed=false;
     }
//--- 
  }
//+------------------------------------------------------------------+
//| Fonction BookEvent                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   static ulong starttime=0;             // heure de début du test
   static ulong tickcounter=0;           // compteur de mises à jour du market depth
//--- ne fonctionne avec les évènements du market depth que si nous nous y sommes abonnés nous-mêmes
   if(!book_subscribed)
      return;
//--- mise à jour du compteur pour un certain symbole
   if(symbol!=_Symbol)
      return;
//--- ignore les premiers ticks pour effacer la queue et pour préparer
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;
//--- conserve l'heure de début
   if(tickcounter==ExtSkipFirstTicks
      starttime=GetMicrosecondCount();
//--- demande les données du market depth
   MarketBookGet(symbol,book);
//--- quand stopper ?  
   ulong endtime=GetMicrosecondCount()-starttime;
   ulong ticks  =1+tickcounter-ExtSkipFirstTicks;
// combien de temps s'est-il écoulé en microsecondes depuis le début du test ?
   if(endtime>ExtCollectTime*1000*1000) 
     {
      PrintFormat("%I64u ticks pour %.1f secondes: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime);
      ExpertRemove();
      return;
     }
//--- affiche les compteurs dans le champ commentaire
   if(endtime>0)
      Comment(StringFormat("%I64u ticks pour %.1f secondes: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime));
  }

 

 

Voir également

MarketBookAdd, MarketBookRelease, MarketBookGet, OnTrade, OnTradeTransaction, OnTick, Fonctions de gestion des évènements, Exécution du programme, Evènements du terminal client