OnBookEvent

La funzione è chiamata in indicatori ed EA quando si verifica l'evento BookEvent. È pensato per gestire i cambiamenti del Depth of Market.

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

Parametri

symbol

[in] Nome del simbolo per cui è arrivato BookEvent

Valore di ritorno

Nessun valore di ritorno

Nota

Per ottenere gli eventi BookEvent per qualsiasi simbolo, è sufficiente iscriversi per riceverli per quel simbolo utilizzando la funzione MarketBookAdd(). Per annullare l'iscrizione per la ricezione di BookEvent per un determinato simbolo, chiamare la funzione MarketBookRelease().

Le trasmissioni di BookEvent all'interno dell'intero grafico-chart. Ciò significa che se un'applicazione su un grafico-chart si iscrive a BookEvent utilizzando la funzione MarketBookAdd, tutti gli altri indicatori ed EA lanciati sullo stesso chart e che hanno il gestore OnBookEvent() ricevono anche questo evento. Pertanto, è necessario analizzare ilnome di simbolo passato al gestore di OnBookEvent() come parametro symbol.

Contatori separati di BookEvent ordinati per simboli vengono forniti per tutte le applicazioni in esecuzione sullo stesso grafico-chart. Ciò significa che ogni chart può avere più iscrizioni a simboli diversi e viene fornito un contatore per ciascun simbolo. La sottoscrizione e l'annullamento dell'iscrizione da BookEvent modifica il contatore dell'iscrizione per i simboli specificati solo all'interno di un grafico-chart. In altre parole, potrebbero esserci due chart adiacenti a BookEvent per lo stesso simbolo ma diversi valori del contatore di iscrizioni.

Il valore del contatore dell'iscrizione iniziale è zero. A ciascuna chiamata MarketBookAdd(), il contatore dell'iscrizione per un simbolo specificato sul grafico-chart è aumentato di uno (il simbolo del chart e il simbolo in MarketBookAdd() non devono corrispondere). Quando si chiama MarketBookRelease(), il contatore delle iscrizioni per un simbolo specificato all'interno del grafico-chart è diminuito di uno. Gli eventi BookEvent per qualsiasi simbolo vengono trasmessi all'interno del chart finché il contatore non è uguale a zero. Pertanto, è importante che ogni programma MQL5 che contiene MarketBookAdd() chiami correttamente l'annullamento dell'iscrizione dal ricevere eventi per ogni simbolo che utilizza MarketBookRelease() alla fine del suo lavoro. Per raggiungere questo, il numero di chiamate MarketBookAdd() e MarketBookRelease() dovrebbe essere pari per ogni chiamata durante l'intera vita del programma MQL5. L'uso di flag o contatori di iscrizioni personalizzate all'interno del programma consente di lavorare in sicurezza con gli eventi BookEvent ed impedisce di disattivare le iscrizioni per ottenere questo evento in programmi di terze parti all'interno dello stesso grafico-chart.

Gli eventi BookEvent non vengono mai saltati e vengono sempre inseriti in una coda anche se la gestione del precedente handling di BookEvent non è ancora finita.

 

Esempio

//+------------------------------------------------------------------+
//|                                           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 "Esempio di misurazione della frequenza di aggiornamento profondità del mercato(market depth) utilizzando OnBookEvent()"
#property description "Il codice è tratto dall'articolo https://www.mql5.com/en/articles/2635"
//--- parametri di input
input ulong ExtCollectTime   =30;  // tempo di test in secondi
input ulong ExtSkipFirstTicks=10;  // numero di ticks saltati all'inizio
//--- contrassegno dell'iscrizione agli eventi BookEvent
bool book_subscribed=false;
//--- array per accettare richieste dal market depth
MqlBookInfo  book[];
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert                              |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mostra l'inizio
   Comment(StringFormat("In attesa dell'arrivo dei primi ticks %I64u",ExtSkipFirstTicks));
   PrintFormat("In attesa dell'arrivo dei primi ticks %I64u",ExtSkipFirstTicks);
//--- abilita la trasmissione del market depth
   if(MarketBookAdd(_Symbol))
     {
      book_subscribed=true;
      PrintFormat("%s: la funzione MarketBookAdd(%s) ha restituito true",__FUNCTION__,_Symbol);
     }
   else
      PrintFormat("%s: la funzione MarketBookAdd(%s) ha restituito false! GetLastError()=%d",__FUNCTION__,_Symbol,GetLastError());
//--- inizializzazione avvenuta con successo
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitializzazione Expert                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- mostra il codice della ragione di deinitializzazione
   Print(__FUNCTION__,": Codice ragione di Deinizializzazione = ",reason);  
//--- cancella l'iscrizione per ottenere eventi del market depth
   if(book_subscribed)
     {
      if(!MarketBookRelease(_Symbol))
         PrintFormat("%s: MarketBookRelease(%s) ha restituito false! GetLastError()=%d",_Symbol,GetLastError());
      else
         book_subscribed=false;
     }
//--- 
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   static ulong starttime=0;             // orario d'inizio del test
   static ulong tickcounter=0;           // aggiornamento contatore del market depth
//--- lavora con eventi di market depth solo se ci iscriviamo ad essi noi stessi
   if(!book_subscribed)
      return;
//--- conta gli aggiornamenti solo per un certo simbolo
   if(symbol!=_Symbol)
      return;
//--- salta i primi tick per cancellare la coda e prepararsi
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;
//--- ricorda l'ora di inizio
   if(tickcounter==ExtSkipFirstTicks
      starttime=GetMicrosecondCount();
//--- richiesta per i dati di market depth
   MarketBookGet(symbol,book);
//--- quando fermarsi?  
   ulong endtime=GetMicrosecondCount()-starttime;
   ulong ticks  =1+tickcounter-ExtSkipFirstTicks;
// quanto tempo è passato in microsecondi dall'inizio del test?
   if(endtime>ExtCollectTime*1000*1000) 
     {
      PrintFormat("%I64u ticks per %.1f secondi: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime);
      ExpertRemove();
      return;
     }
//--- visualizza i contatori nel campo dei commenti
   if(endtime>0)
      Comment(StringFormat("%I64u ticks per %.1f secondi: %.1f ticks/sec ",ticks,endtime/1000.0/1000.0,ticks*1000.0*1000.0/endtime));
  }

 

 

Guarda anche

MarketBookAdd, MarketBookRelease, MarketBookGet, OnTrade, OnTradeTransaction, OnTick, Funzioni di Event handling, Avvio Programma, Eventi terminale client