OnTrade

La funzione è chiamata nell' EA quando si verifica l'evento Trade. La funzione è pensata per elaborare le modifiche nell'ordine, posizione e liste di trade.

void  OnTrade(void);

Valore di ritorno

Nessun valore di ritorno

Nota

OnTrade() è chiamato solo per gli Expert Advisor. Non è utilizzato in indicatori e script anche se si aggiunge una funzione con lo stesso nome e tipo.

Per qualsiasi azione di trade (piazzando un ordine pendente, aprendo/chiudendo una posizione, piazzando stops, attivando ordine pendente, ecc.), la cronistoria degli ordini e delle operazioni e/o l'elenco delle posizioni e degli ordini correnti viene modificata in modo appropriato.

Quando si gestisce un ordine, il trade server invia al terminale un messaggio sull'arrivo dell'evento Trade. Per recuperare dati rilevanti su ordini e trades dalla cronistoria, è necessario eseguire una richiesta di cronologia di trading utilizzando prima HistorySelect().

Gli eventi di trade sono generati dal server in caso di:

  • cambio ordini attivi,
  • cambio posizione,
  • cambio dels(affari),
  • cambio cronistoria di trade.

 

Ogni evento Trade può apparire come risultato di una o più richieste di trade. Le richieste di trade vengono inviate al server utilizzando OrderSend() o OrderSendAsync(). Ogni richiesta può portare a diversi eventi di trade. Non è possibile fare affidamento sull'affermazione "Una richiesta - un evento di Trade", poiché l'elaborazione degli eventi può essere eseguita in più fasi e ogni operazione può modificare lo stato degli ordini, delle posizioni e della cronologia di trade.

 

L'handler OnTrade() viene chiamato dopo l'appropriata chiamata OnTradeTransaction(). In generale, non esiste una correlazione esatta nel numero di chiamate OnTrade() e OnTradeTransaction(). Una chiamata OnTrade() corrisponde a una o più chiamate OnTradeTransaction.

Esempio EA con il gestore OnTrade()

//+------------------------------------------------------------------+
//|                                               OnTrade_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
input    int days=7;            // profondità della cronistoria trade in giorni
//--- imposta i limiti della cronistoria trade nell'ambito globale
datetime     start;             // data di inizio per la cronistoria di trade nella cache
datetime     end;               // data di fine per la cronistoria di trade nella cache
//--- contatori globali
int          orders;            // numero di ordini attivi
int          positions;         // numero di posizioni aperte
int          deals;             // numero di affari nella cache della cronistoria di trade
int          history_orders;    // numero di ordini nella cache della cronistoria di trade
bool         started=false;     // flag di rilevanza contatore
 
//+------------------------------------------------------------------+
//| Funzione di inizializzazione Expert                              |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   end=TimeCurrent();
   start=end-days*PeriodSeconds(PERIOD_D1);
   PrintFormat("Limiti della cronistoria da caricare: inizio -%s, fine - %s",
               TimeToString(start),TimeToString(end));
   InitCounters();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| inizializzazione di contatori di posizione, ordine e trade       |
//+------------------------------------------------------------------+
void InitCounters()
  {
   ResetLastError();
//--- carica cronistoria
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Fallimento nel caricare la cronistoria da %s a %s nella cache. Codice errore: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- ottiene il valore corrente
   orders=OrdersTotal();
   positions=PositionsTotal();
   deals=HistoryDealsTotal();
   history_orders=HistoryOrdersTotal();
   started=true;
   Print("Contatori di ordini, posizioni e affari inizializzati con successo");
  }  
//+------------------------------------------------------------------+
//| Funzione tick Expert                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| chiamata quando arriva un evento Trade                           |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| esempio di elaborazione delle modifiche nel trade e nella cronistoria 
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
  {
   end=TimeCurrent();
   ResetLastError();
//--- scarica la cronistoria di trading dall'intervallo specificato, nella cache del programma
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Fallimento nel caricare la cronistoria da %s a %s nella cache. Codice errore: %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- ottiene i valori correnti
   int curr_orders=OrdersTotal();
   int curr_positions=PositionsTotal();
   int curr_deals=HistoryDealsTotal();
   int curr_history_orders=HistoryOrdersTotal();
//--- controlla se il numero di ordini attivi è stato modificato
   if(curr_orders!=orders)
     {
      //--- il numero di ordini attivi è stato modificato
      PrintFormat("Numero di ordini è stato cambiato. Il valore precedente è %d, il valore corrente è %d ",
                  orders,curr_orders);
      //--- aggiorna il valore
      orders=curr_orders;
     }
//--- cambia il numero di posizioni aperte
   if(curr_positions!=positions)
     {
      //--- il numero di posizioni aperte è stato cambiato
      PrintFormat("Il numero di posizioni è stato cambiato Il valore precedente è %d, il valore corrente è %d ",
                  positions,curr_positions);
      //--- aggiorna il valore
      positions=curr_positions;
     }
//--- cambia il numero di affari nella cache della cronistoria di trade
   if(curr_deals!=deals)
     {
      //--- il numero di affari nella cache della cronologia di trade è stato modificato
      PrintFormat("Il numero di affari è stato cambiato. Il valore precedente è %d, il valore corrente è %d ",
                  deals,curr_deals);
      //--- aggiorna il valore
      deals=curr_deals;
     }
//--- cambio nel numero degli ordini storici nella cache della cronistoria di trade
   if(curr_history_orders!=history_orders)
     {
      //--- il numero di ordini dello storico nella cache della cronistoria di trade commerciale è stato modificato
      PrintFormat("Il numero di ordini nella cronistoria è stato cambiato. Il valore precedente è %d, il valore corrente è %d ",
                  history_orders,curr_history_orders);
     //--- aggiornamento valore
     history_orders=curr_history_orders;
     }
//--- verifica se è necessario modificare i limiti della cronistoria di trade da richiedere nella cache
   CheckStartDateInTradeHistory();
  }
//+------------------------------------------------------------------+
//| modifica della data di inizio per la richiesta della cronistoria di trade        
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
  {
/ --- intervallo iniziale, se dovessimo iniziare a lavorare in questo momento
   datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- assicurarsi che il limite iniziale della cronistoria di trade non sia andato
//--- più di 1 giorno oltre la data prevista
   if(curr_start-start>PeriodSeconds(PERIOD_D1))
     {
      //--- corregge la data di inizio della cronistoria da caricare nella cache
      start=curr_start;
      PrintFormat("Nuovo limite iniziale della cronistoria di trade da caricare: start => %s",
                  TimeToString(start));
      //--- ora ricarica la cronistoria degli scambi per l'intervallo aggiornato
      HistorySelect(start,end);
      //--- correggi l'ordine e i contatori dell'ordine nella cronistoria per ulteriori confronti
      history_orders=HistoryOrdersTotal();
      deals=HistoryDealsTotal();
     }
  }
//+------------------------------------------------------------------+
/* Esempio di Output :
  Limiti della cronistoria da caricare: inizio - 2018.07.16 18:11, fine 2018.07.23 18:11
  I contatori di ordini, posizioni ed affari sono inizializzati con successo
  Il numero di ordini è stato cambiato. Valore precedente 0, valore corrente 1
  Il numero di ordini è stato cambiato. Valore precedente 1, valore corrente 0
  Il numero di posizioni è stato cambiato. Valore precedente 0, valore corrente 1
  Il numero di offerte è stato cambiato. Valore precedente 0, valore corrente 1
  Il numero di ordini nella cronistoria è stato modificato. Valore precedente 0, valore corrente 1
*/

Guarda anche

OrderSend, OrderSendAsync, OnTradeTransaction, Eventi del terminale client