OnBookEvent

Die Funktion wird von Indikatoren und EAs aufgerufen, wenn das Ereignis BookEvent eintritt. Sie dient zur Bearbeitung der Änderungen der Markttiefe.

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

Parameter

symbol

[in]  Name des Symbols für das ein BookEvent eingetreten ist

Rückgabewert

Kein Rückgabewert

Hinweis

Um die Ereignisse BookEvent für ein beliebiges Symbol zu erhalten, abonnieren Sie es einfach mit der Funktion MarketBookAdd(). Um das Abonnement für den Empfang des BookEvent für ein bestimmtes Symbol zu kündigen, rufen Sie die Funktion MarketBookRelease() auf.

Das BookEvent sendet im gesamten Chart. Das bedeutet, dass wen eine Anwendung auf einem Chart BookEvent mit der Funktion MarketBookAdd abboniert hat, alle anderen Indikatoren und EAs, die auf dem gleichen Chart gestartet wurden, auch den Handler von OnBookEvent() haben und diese Ereignisse erhalten. Daher ist es notwendig, einen Symbolnamen zu analysieren, der den Handler OnBookEvent() durch den Parameter symbol übergeben wird.

Separate BookEvent-Zähler, sortiert nach Symbolen, stehen für alle Anwendungen zur Verfügung, die auf dem gleichen Chart laufen. Dies bedeutet, dass jedes Chart mehrere Abonnements für verschiedene Symbole haben kann, und für jedes Symbol wird ein Zähler bereitgestellt. Das An- und Abmelden von BookEvent ändert den Abonnementzähler für bestimmte Symbole nur innerhalb eines Charts. Mit anderen Worten, es können zwei benachbarte Charts zum BookEvent für das gleiche Symbol, aber unterschiedliche Abonnementzählerwerte vorhanden sein.

Der anfängliche Zählerstand des Abonnements ist Null. Bei jedem Aufruf von MarketBookAdd() wird der Abonnementzähler für ein bestimmtes Symbol auf dem Chart um eins erhöht (Chartsymbol und Symbol in MarketBookAdd() müssen nicht übereinstimmen). Beim Aufruf von MarketBookRelease() wird der Zähler der Abonnements für ein bestimmtes Symbol im Chart um eins verringert. Die Ereignisse von BookEvent für ein beliebiges Symbol werden innerhalb des Charts gesendet, bis der Zähler gleich Null ist. Daher ist es wichtig, dass jedes MQL5-Programm, das MarketBookAdd()Aufrufe enthält, sich am Ende seiner Arbeit korrekt vom Erhalten von Ereignissen für jedes Symbol mit MarketBookRelease() abmeldet. Um dies zu erreichen, sollte die Anzahl der MarketBookAdd() und MarketBookRelease()-Aufrufe für jeden Aufruf während der gesamten MQL5-Programmlaufzeit gleich sein. Die Verwendung von Flags oder benutzerdefinierten Subskriptionszählern innerhalb des Programms ermöglicht es Ihnen, sicher mit BookEvent-Ereignissen zu arbeiten und verhindert das Deaktivieren von Subskriptionen, um dieses Ereignis in Drittanbieterprogrammen innerhalb derselben Tabelle zu erhalten.

BookEvent Ereignisse werden nie übersprungen und immer in eine Warteschlange gestellt, auch wenn die Behandlung des vorherigen BookEvents noch nicht beendet ist. .

 

Beispiel

//+------------------------------------------------------------------+
//|                                           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 "Example of measuring the market depth refresh rate using OnBookEvent()"
#property description "The code is taken from the article https://www.mql5.com/en/articles/2635"
//--- Eingabeparameter
input ulong ExtCollectTime   =30;  // Testdauer in Sekunden
input ulong ExtSkipFirstTicks=10;  // Anzahl der Ticks die nach dem Start ignoriert werden
//--- Flag des Abonnements des BookEvents
bool book_subscribed=false;
//--- Array der akzeptierten Anfragen der Markttiefe
MqlBookInfo  book[];
//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Zeige den Start
   Comment(StringFormat("Waiting for the first %I64u ticks to arrive",ExtSkipFirstTicks));
   PrintFormat("Waiting for the first %I64u ticks to arrive",ExtSkipFirstTicks);
//--- aktiviere die Verbreitung der Markttiefe
   if(MarketBookAdd(_Symbol))
     {
      book_subscribed=true;
      PrintFormat("%s: MarketBookAdd(%s) function returned true",__FUNCTION__,_Symbol);
     }
   else
      PrintFormat("%s: MarketBookAdd(%s) function returned false! GetLastError()=%d",__FUNCTION__,_Symbol,GetLastError());
//--- erfolgreiche Initialisierung
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialisierung des Experten                                   |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Anzeige der Ursache der Deinitialisierung
   Print(__FUNCTION__,": Deinitialization reason code = ",reason);  
//--- stornieren des Abonnements der Markttiefe
   if(book_subscribed)
     {
      if(!MarketBookRelease(_Symbol))
         PrintFormat("%s: MarketBookRelease(%s) returned false! GetLastError()=%d",_Symbol,GetLastError());
      else
         book_subscribed=false;
     }
//--- 
  }
//+------------------------------------------------------------------+
//| BookEvent Funktion                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   static ulong starttime=0;             // Beginn des Tests
   static ulong tickcounter=0;           // Aktualisierung des Zählers der Markttiefe
//--- Arbeiten mit der Markttiefe, aber nur wenn wir sie selbst abonniert haben
   if(!book_subscribed)
      return;
//--- zählen der Updates für nur ein bestimmtes Symbol
   if(symbol!=_Symbol)
      return;
//--- Ignorieren der ersten Ticks um die Warteschlange zu leeren und zur Vorbereitung
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;
//--- sichern der Startzeit
   if(tickcounter==ExtSkipFirstTicks
      starttime=GetMicrosecondCount();
//--- Abfrage der Daten der Markttiefe
   MarketBookGet(symbol,book);
//--- wann stoppen?  
   ulong endtime=GetMicrosecondCount()-starttime;
   ulong ticks  =1+tickcounter-ExtSkipFirstTicks;
// wie viel Zeit in Microsekunden ist seit Beginn des Tests vergangen?
   if(endtime>ExtCollectTime*1000*1000) 
     {
      PrintFormat("%I64u ticks for %.1f seconds: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime);
      ExpertRemove();
      return;
     }
//--- Anzeige des Zählers im Kommentarfeld
   if(endtime>0)
      Comment(StringFormat("%I64u ticks for %.1f seconds: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime));
  }

 

 

Siehe auch

MarketBookAdd, MarketBookRelease, MarketBookGet, OnTrade, OnTradeTransaction, OnTick, Ereignisbearbeiter, Durchführung der Programme, Ereignisse des Client-Terminals