La Structure de Résultat d'une Demande de Trade (MqlTradeResult)

Comme résultat d'une demande de trade, un serveur de trades retourne des informations sur le résultat du traitement de la demande de trade sous la forme d'une structure spéciale prédéfinie de type MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Code de retour de l'opération
   ulong    deal;             // Ticket de la transaction si elle est effectuée
   ulong    order;            // Ticket de l'ordre, s'il est placé
   double   volume;           // Volume de la transaction confirmé par le courtier
   double   price;            // Prix de la transaction confirmé par le courtier
   double   bid;              // Prix Bid actuel
   double   ask;              // Prix Ask actuel
   string   comment;          // Commentaire du courtier pour l'opération (par défaut, il est rempli avec la description du code de retour du serveur de trades)
   uint     request_id;       // Identifiant de la demande renvoyé par le terminal pendant le dispatch 
   int      retcode_external// Code de retour d'un système de trading externe
  };

Description des champs

Champ

Description

retcode

Code de retour d'un serveur de trades

deal

Ticket de la transaction si la transaction a été effectuée. Il est disponible pour une opération de trading de type TRADE_ACTION_DEAL

ordre

Ticket de l'ordre, si un ticket a été placé. Il est disponible pour une opération de type TRADE_ACTION_PENDING

volume

Volume de la transaction, confirmé par le courtier. Il dépend du type de remplissage de l'ordre

prix

Prix de la transaction confirmé par le courtier. Il dépend de la déviation de la demande de trade et/ou de l'opération de trading

bid

Le prix du marché Bid actuel (requote price)

ask

Le prix du marché Ask actuel (requote price)

comment

Le commentaire du courtier pour l'opération (par défaut, il est rempli avec la description du code de retour du serveur de trades)

request_id

Identifiant de la demande défini par le terminal lors de l'envoi au serveur de trades

retcode_external

Le code de l'erreur retourné par un système de trading externe. L'utilisation et les types de ces erreurs dépendent du courtier et du système de trading externe auquel les opérations de trading sont envoyées.

Le résultat de l'opération de trading est retourné dans une variable de type MqlTradeResult, qui est passée en second argument à OrderSend() pour effectuer des opérations de trading.

Le terminal détermine l'identifiant de la demande dans le champ request_id lors de son envoi au serveur de trades en utilisant les fonctions OrdersSend() et OrderSendAsync(). Le terminal reçoit les messages à propos des transactions effectuées depuis le serveur de trades et les soumet pour le traitement via la fonction OnTradeTransaction() contenant les paramètres suivantes :

  • la description de la transaction de trading dans une structure MqlTradeTransaction ;
  • la description de la demande de trade envoyée par la fonction OrderSend() ou par la fonction OrdersSendAsync(). L'identifiant de la demande est envoyée par le terminal au serveur de trades, tandis que la demande elle-même et son identifiant request_id sont stockés dans la mémoire du terminal ;
  • le résultat de l'exécution de la demande de trade dans une structure MqlTradeResult avec le champ request_id contenant l'identifiant de cette demande.

La fonction OnTradeTransaction() reçoit 3 paramètres en entrée mais les deux derniers ne sont utilisés que pour les transactions de type TRADE_TRANSACTION_REQUEST. Dans tous les autres cas, les données de la demande de trade et le résultat de son exécution ne sont pas remplis. Un exemple d'analyse des paramètres est disponible dans le chapitre Structure d'une Demande de Trade.

L'ajout du request_id par le terminal pour la demande de trade lors de son envoi au serveur a été principalement introduit pour l'utilisation de la fonction asynchrone OrderSendAsync(). Cet identifiant permet d'associer l'action effectuée (appels aux fonctions OrderSend ou OrderSendAsync) avec le résultat de cette action envoyé à la foncion OnTradeTransaction().

Exemple :

//+----------------------------------------------------------------------------------------------------+
//| Envoi d'une demande de trading avec le traitement du résultat                                      |
//+----------------------------------------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
  {
//--- réinitialise le dernier code d'erreur à zéro
   ResetLastError();
//--- envoie la demande
   bool success=OrderSend(request,result);
//--- si le résultat échoue, essaye de savoir pourquoi
   if(!success)
     {
      int answer=result.retcode;
      Print("TradeLog : Echec de la demande de trade. Erreur = ",GetLastError());
      switch(answer)
        {
         //--- requote
         case 10004:
           {
            Print("TRADE_RETCODE_REQUOTE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- l'ordre n'est pas accepté par le serveur
         case 10006:
           {
            Print("TRADE_RETCODE_REJECT");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- prix invalide
         case 10015:
           {
            Print("TRADE_RETCODE_INVALID_PRICE");
            Print("request.price = ",request.price,"   result.ask = ",
                  result.ask," result.bid = ",result.bid);
            break;
           }
         //--- SL et/ou TP invalides
         case 10016:
           {
            Print("TRADE_RETCODE_INVALID_STOPS");
            Print("request.sl = ",request.sl," request.tp = ",request.tp);
            Print("result.ask = ",result.ask," result.bid = ",result.bid);
            break;
           }
         //--- volume invalide
         case 10014:
           {
            Print("TRADE_RETCODE_INVALID_VOLUME");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume);
            break;
           }
         //--- pas assez d'argent pour l'opération de trading
         case 10019:
           {
            Print("TRADE_RETCODE_NO_MONEY");
            Print("request.volume = ",request.volume,"   result.volume = ",
                  result.volume,"   result.comment = ",result.comment);
            break;
           }
         //--- une autre raison, affiche le code de retour du serveur
         default:
           {
            Print("Autre réponse = ",answer);
           }
        }
      //--- notification de l'échec de la demande de trading en retournant false
      return(false);
     }
//--- OrderSend() retourne true - répéte la même réponse
   return(true);
  }