OnTrade

La fonction est appelée dans les EA lorsque l'évènement Trade apparaît. La fonction est prévue pour le traitement des changements dans les listes des ordres, des positions et des trades.

void  OnTrade(void);

Valeur de Retour

Aucune valeur de retour

Note

OnTrade() n'est appelée que pour les Expert Advisors. Elle n'est pas utilisée dans les indicateurs et dans les scripts même si vous ajoutez une fonction avec le même nom et le même type.

Pour n'importe quelle action de trading (placer un ordre en attente, ouvrir/fermer une position, placer des stops, activer des ordres en attente, etc.), l'historique des ordres et des trades et/ou la liste des positions et des ordres courants est changé de façon correspondante.

Lors du traitement d'un ordre, le serveur de trade envoie un message au terminal à propos de l'évènement Trade entrant. Pour récupérer les données correspondantes des ordres et des trades de l'historique, il est nécessaire d'effectuer une demande de l'historique de trading en utilisant d'abord HistorySelect().

Les évènements de trading sont générés par le serveur dans les cas suivants :

  • changement des ordres actifs,
  • changement des positions,
  • changement des transactions,
  • changement de l'historique de trading.

 

Chaque évènement Trade peut être le résultat d'une ou plusieurs demandes de trades. Les demandes de trades sont envoyées au serveur en utilisant OrderSend() ou OrderSendAsync(). Chaque demande peut aboutir à plusieurs évènements de trading. Vous ne pouvez pas vous fier à la phrase "Une demande - un évènement Trade", puisque le traitement des évènements peut être effectué en plusieurs étapes, et chaque opération peut changer l'état des ordres, des positions et de l'historique de trading.

 

La fonction OnTrade() est appelée après les appels correpondants OnTradeTransaction() calls. En général, il n'y a pas de corrélation exacte entre le nombre d'appels à OnTrade() et à OnTradeTransaction(). Un appel à OnTrade() correspond à un ou plusieurs appels à OnTradeTransaction.

EA exemple avec la fonction 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;            // profondeur de l'historique de trading en jours
//--- définit les limites de l'historique de trading au niveau global
datetime     start;             // date de début de l'historique de trading dans le cache
datetime     end;               // date de fin de l'historique de trading dans le cache
//--- compteurs globaux
int          orders;            // nombre d'ordres actifs
int          positions;         // nombre de positions ouvertes
int          deals;             // nombre de transactions dans le cache de l'historique des trades
int          history_orders;    // nombre d'ordres dans le cache de l'historique de trading
bool         started=false;     // flag de pertinence du compteur
 
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   end=TimeCurrent();
   start=end-days*PeriodSeconds(PERIOD_D1);
   PrintFormat("Limites du chargement de l'historique à charger : début - %s, fin - %s",
               TimeToString(start),TimeToString(end));
   InitCounters();
//---
   retourne(0);
  }
//+------------------------------------------------------------------+
//|  initialisation de la position, de l'ordre et du compteur        |
//+------------------------------------------------------------------+
void InitCounters()
  {
   ResetLastError();
//--- chargement de l'historique
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Echec du chargement de l'historique de %s à %s vers le cache. Code d'erreur : %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- récupère la valeur courante
   orders=OrdersTotal();
   positions=PositionsTotal();
   deals=HistoryDealsTotal();
   history_orders=HistoryOrdersTotal();
   started=true;
   Print("Les compteurs des ordres, des positions et des transactions ont été initialisés avec succès");
  }  
//+------------------------------------------------------------------+
//| Fonction de tick de l'Expert                                     |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| appelé lorsqu'un évènement Trade arrive                          |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(started) SimpleTradeProcessor();
   else InitCounters();
  }
//+------------------------------------------------------------------+
//| ex de traitement des changements dans le trade et l'historique   |
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
  {
   end=TimeCurrent();
   ResetLastError();
//--- téléchargement de l'historique de trading dans l'intervalle spécifié dans le cache du programme
   bool selected=HistorySelect(start,end);
   if(!selected)
     {
      PrintFormat("%s. Echec du chargement de l'historique de %s à %s vers le cache. Code d'erreur : %d",
                  __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
      return;
     }
//--- récupère les valeurs courantes
   int curr_orders=OrdersTotal();
   int curr_positions=PositionsTotal();
   int curr_deals=HistoryDealsTotal();
   int curr_history_orders=HistoryOrdersTotal();
//--- vérifie si le nombre d'ordres actifs a été changé
   if(curr_orders!=orders)
     {
      //--- le nombre d'ordres actifs a changé
      PrintFormat("Le nombre d'ordres a changé. La valeur précédente était %d, la valeur actuelle est %d",
                  orders,curr_orders);
      //--- mets à jour la valeur
      orders=curr_orders;
     }
//--- changements du nombre de positions ouvertes
   if(curr_positions!=positions)
     {
      //--- le nombre de positions ouvertes a changé
      PrintFormat("Le nombre de positions a changé. La valeur précédente était %d, la valeur actuelle est %d",
                  positions,curr_positions);
      //--- mets à jour la valeur
      positions=curr_positions;
     }
//--- changements du nombre de transactions dans le cache de l'historique des trades
   if(curr_deals!=deals)
     {
      //--- le nombre de transactions dans le cache de l'historique de trading a changé
      PrintFormat("Le nombre de transactions a changé. La valeur précédente était %d, la valeur actuelle est %d",
                  deals,curr_deals);
      //--- mets à jour la valeur
      deals=curr_deals;
     }
//--- changements dans le nombre d'ordres dans le cache de l'historique
   if(curr_history_orders!=history_orders)
     {
      //--- le nombre d'ordres dans le cache de l'historique a été changé
      PrintFormat("Le nombre d'ordres dans l'historique a été changé. La valeur précédente était %d, la valeur actuelle est %d",
                  history_orders,curr_history_orders);
     //--- mets à jour la valeur
     history_orders=curr_history_orders;
     }
//--- vérification s'il est nécessaire de changer les limites de l'historique de trades à demander dans le cache
   CheckStartDateInTradeHistory();
  }
//+------------------------------------------------------------------+
//|  changement de la date de début pour demander l'historique       |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
  {
//--- intervalle initial, si nous commencions dès maintenant
   datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- on s'assure que la limite de début de l'historique de trading n'a pas disparu
//--- plus d'un jour par rapport à la date prévue
   if(curr_start-start>PeriodSeconds(PERIOD_D1))
     {
      //--- corrige la date de début de l'historique à charger dans le cache
      start=curr_start;
      PrintFormat("Nouvelle limite de début de l'historique à charger : début => %s",
                  TimeToString(start));
      //--- recharge maintenant l'historique de trading pour l'intervalle mis à jour
      HistorySelect(start,end);
      //--- corrige les compteurs de transactions et d'ordres dans l'historique pour les comparaisons futures
      history_orders=HistoryOrdersTotal();
      deals=HistoryDealsTotal();
     }
  }
//+------------------------------------------------------------------+
/* Exemple de sortie :
  Limites du chargement de l'historique à charger : début - 2018.07.16 18:11, fin - 2018.07.23 18:11
  Les compteurs des ordres, des positions et des transactions ont été initialisés avec succès
  Le nombre d'ordres dans l'historique a été changé. Valeur précédente 0, valeur actuelle 1
  Le nombre d'ordres dans l'historique a été changé. Valeur précédente 1, valeur actuelle 0
  Le nombre de positions dans l'historique a été changé. Valeur précédente 0, valeur actuelle 1
  Le nombre de transactions a changé. Valeur précédente 0, valeur actuelle 1
  Le nombre d'ordres dans l'historique a été changé. Valeur précédente 0, valeur actuelle 1
*/

Voir également

OrderSend, OrderSendAsync, OnTradeTransaction, Evènements du terminal client