La Structure de Demande de Trade (MqlTradeRequest)

L'interaction entre le terminal client et le serveur de trades pour l'exécution des opérations de placement des ordres est effectuée en utilisant des demandes de trade. La demande de trade est représentée par une structure prédéfinie de type MqlTradeRequest, laquelle contient tous les champs nécessaires à la réalisation des trades. Le résultat du traitement de la demande est représenté par la structure de type MqlTradeResult.

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Type de l'opération de trading
   ulong                         magic;            // Identifiant de l'Expert Advisor (numéro magique)
   ulong                         order;            // Ticket de l'ordre
   string                        symbol;           // Symbole de trading
   double                        volume;           // Volume demandé pour une transaction en lots
   double                        price;            // Prix
   double                        stoplimit;        // Niveau du StopLimit de l'ordre
   double                        sl;               // Niveau du Stop Loss pour l'ordre
   double                        tp;               // Niveau du Take Profit pour l'ordre
   ulong                         deviation;        // Déviation maximale possible pour le prix demandé
   ENUM_ORDER_TYPE               type;             // Type de l'ordre
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Type d'exécution de l'ordre
   ENUM_ORDER_TYPE_TIME          type_time;        // Type d'expiration de l'ordre
   datetime                      expiration;       // Date/heure d'expiration de l'ordre (pour les ordres de type ORDER_TIME_SPECIFIED)
   string                        comment;          // Commentaire de l'ordre
   ulong                         position;         // Ticket de la position
   ulong                         position_by;      // Le ticket d'une position opposée
  };

Description des champs

Champ

Description

action

Type d'opération de trade. Peut être l'une des valeurs de l'énumération ENUM_TRADE_REQUEST_ACTIONS.

magic

Identifiant de l'Expert Advisor. Il permet d'organiser le traitement d'analyse des ordres de trading. Chaque Expert Advisor peut générer son propre identifiant unique lors de l'envoi d'une demande de trade.

ordre

Ticket de l'ordre. Il est utilisé pour modifier les ordres en attente.

symbol

Symbole de l'ordre. Il n'est pas nécessaire pour les opérations de modification d'ordre et de fermeture de position.

volume

Volume demandé de l'ordre en lots. Notez que le volume réel d'une transaction dépendra du type d'exécution de l'ordre.

prix

Le prix auquel l'ordre doit être exécuté. Les ordres au marché des symboles dont le type d'exécution est "Exécution au Marché" (SYMBOL_TRADE_EXECUTION_MARKET), de type TRADE_ACTION_DEAL, ne nécessite pas de spécifier un prix.

stoplimit

Le prix auquel l'ordre en attente de type Limit sera placé lorsque le prix atteint la valeur prix (cette condition est obligatoire). Jusqu'à ce moment, l'ordre en attente n'est pas placé.

sl

Le prix du Stop Loss dans un mouvement de prix défavorable

tp

Le prix du Take Profit dans un mouvement de prix défavorable

deviation

La déviation maximale du prix, spécifiée en points

type

Type d'ordre. Peut être l'une des valeurs de l'énumération ENUM_ORDER_TYPE.

type_filling

Type d'éxécution de l'ordre. Peut être l'une des valeurs de l'énumération ENUM_ORDER_TYPE_FILLING.

type_time

Type d'expiration de l'ordre. Peut être l'une des valeurs de l'énumération ENUM_ORDER_TYPE_TIME.

expiration

L'heure d'expiration de l'ordre (pour des ordres de type ORDER_TIME_SPECIFIED)

comment

Commentaire de l'ordre

position

Ticket d'une position. Doit être rempli lorsque la position est modifiée ou fermée pour identifier la position. La règle est qu'il est égal au ticket de l'ordre ayant ouvert la position.

position_by

Ticket d'une position opposée. Utilisé lorsqu'une position est fermée par une position opposée d'ouverture pour le même symbole dans la direction opposée.

Lors de la modification ou la clôture d'une position avec le système de hedging, assurez-vous de spécifier son ticket (MqlTradeRequest::position). Le ticket peut également être spécifié dans le système de netting, bien qu'une position soit identifié avec le nom du symbole.

Lors de l'envoi d'ordres pour effectuer des opérations de trading, il est nécessaire d'utiliser la fonction OrderSend(). Pour chaque opération, il est nécessaire de spécifier des champs obligatoires, des champs optionnels peuvent également être spécifiés. Il y a sept cas possibles d'envoi d'ordre :

Exécution de la Demande

C'est un ordre de trading pour ouvrir une position dans le mode Exécution de la Demande (trade upon requested prices). Il est demandé de spécifier les 9 champs suivants :

  • action
  • symbol
  • volume
  • prix
  • sl
  • tp
  • deviation
  • type
  • type_filling

Il est également possible de spécifier les valeurs des champs "magic" et "comment".

Exécution Instantanée

C'est un ordre de trading pour ouvrir une position dans le mode Exécution Instantanée (trade by current prices). Il est demandé de spécifier les 9 champs suivants :

  • action
  • symbol
  • volume
  • prix
  • sl
  • tp
  • deviation
  • type
  • type_filling

Il est également possible de spécifier les valeurs des champs "magic" et "comment".

Execution au Marché

C'est un ordre de trading pour ouvrir une position dans le mode Exécution au Marché. Il est demandé de spécifier les 5 champs suivants :

  • action
  • symbol
  • volume
  • type
  • type_filling

Il est également possible de spécifier les valeurs des champs "magic" et "comment".

Exécution en Bourse

C'est un ordre de trading pour ouvrir une position dans le mode Exécution en Bourse. Il est demandé de spécifier les 5 champs suivants :

  • action
  • symbol
  • volume
  • type
  • type_filling

Il est également possible de spécifier les valeurs des champs "magic" et "comment".

Exemple de l'opération de trading TRADE_ACTION_DEAL pour ouvrir une position Buy :

#define EXPERT_MAGIC 123456   // MagicNumber de l'
//+------------------------------------------------------------------+
//| Ouverture d'une position Buy                                     |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- déclare et initialise la demande de trading et le résultat de la demande
   MqlTradeRequest request={};
   MqlTradeResult  result={};
//--- paramètres de la demande
   request.action   =TRADE_ACTION_DEAL;                     // type de l'opération de trading
   request.symbol   =Symbol();                              // symbole
   request.volume   =0.1;                                   // volume de 0.1 lot
   request.type     =ORDER_TYPE_BUY;                        // type de l'ordre
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // prix d'ouverture
   request.deviation=5;                                     // déviation du prix autorisée
   request.magic    =EXPERT_MAGIC;                          // MagicNumber de l'ordre
//--- envoi la demande
   if(!OrderSend(request,result))
      PrintFormat("OrderSend erreur %d",GetLastError());     // en cas d'erreur d'envoi de la demande, affiche le code d'erreur
//--- informations de l'opération
   PrintFormat("retcode=%u  transaction=%I64u  ordre=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

 
Exemple de l'opération de trading TRADE_ACTION_DEAL pour ouvrir une position Sell :

#define EXPERT_MAGIC 123456   // MagicNumber de l'
//+------------------------------------------------------------------+
//| Ouverture d'une position Sell                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- déclare et initialise la demande de trading et le résultat de la demande
   MqlTradeRequest request={};
   MqlTradeResult  result={};
//--- paramètres de la demande
   request.action   =TRADE_ACTION_DEAL;                     // type de l'opération de trading
   request.symbol   =Symbol();                              // symbole
   request.volume   =0.1;                                   // volume de 0.2 lot
   request.type     =ORDER_TYPE_SELL;                        // type de l'ordre
   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); // prix d'ouverture
   request.deviation=5;                                     // déviation du prix autorisée
   request.magic    =EXPERT_MAGIC;                          // MagicNumber de l'ordre
//--- envoi la demande
   if(!OrderSend(request,result))
      PrintFormat("OrderSend erreur %d",GetLastError());     // en cas d'erreur d'envoi de la demande, affiche le code d'erreur
//--- informations de l'opération
   PrintFormat("retcode=%u  transaction=%I64u  ordre=%I64u",result.retcode,result.deal,result.order);
  }
<b88>//+------------------------------------------------------------------+

 
Exemple de l'opération de trading TRADE_ACTION_DEAL pour fermer des positions :

#define EXPERT_MAGIC 123456   // MagicNumber de l'expert
//+------------------------------------------------------------------+
//| Fermeture de toutes les positions                                |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- déclare et initialise la demande de trading et le résultat
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // nombre de positions ouvertes
//--- boucle sur toutes les positions ouvertes
   for(int i=total-1; i>=0; i--)
     {
      //--- paramètres de l'ordre
      ulong  position_ticket=PositionGetTicket(i);                                      // ticket de la position
      string position_symbol=PositionGetString(POSITION_SYMBOL);                        // symbole
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS);              // nombre de décimales
      ulong  magic=PositionGetInteger(POSITION_MAGIC);                                  // MagicNumber de la position
      double volume=PositionGetDouble(POSITION_VOLUME);                                 // volume de la position
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);    // type de la position
      //--- affiche les informations de la position
      PrintFormat("#%I64u %s  %s  %.2f  %s [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  magic);
      //--- si le MagicNumber correspond
      if(magic==EXPERT_MAGIC)
        {
         //--- remise à zéro de la demande et du résultat
         ZeroMemory(request);
         ZeroMemory(result);
         //--- paramètres de l'opration
         request.action   =TRADE_ACTION_DEAL;        // type de l'opération de trading
         request.position =position_ticket;          // ticket de la position
         request.symbol   =position_symbol;          // symbole 
         request.volume   =volume;                   // volume de la position
         request.deviation=5;                        // déviation du prix autoriséee
         request.magic    =EXPERT_MAGIC;             // MagicNumber de la position
         //--- définit le prix et le type de l'ordre suivant le type de la position
         if(type==POSITION_TYPE_BUY)
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID);
            request.type =ORDER_TYPE_SELL;
           }
         else
           {
            request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
            request.type =ORDER_TYPE_BUY;
           }
         //--- affiche les informations de clôture
         PrintFormat("Ferme #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- envoi la demande
         if(!OrderSend(request,result))
            PrintFormat("OrderSend erreur %d",GetLastError());  // en cas d'échec de l'envoi, affiche le code d'erreur
         //--- informations sur l'opération   
         PrintFormat("retcode=%u  transaction=%I64u  ordre=%I64u",result.retcode,result.deal,result.order);
         //---
        }
     }
  }
//+------------------------------------------------------------------+

 
Modification des SL & TP

Ordre de trading pour modifier les niveaux des prix des StopLoss et/ou TakeProfit. Il est demandé de spécifier les 4 champs suivants :

  • action
  • symbol
  • sl
  • tp
  • position

 

Exemple de l'opération de trading TRADE_ACTION_SLTP pour modifier les valeurs des Stop Loss et Take Profit d'une position ouverte :

#define EXPERT_MAGIC 123456  // MagicNumber de l' expert
//+------------------------------------------------------------------+
//| Modification du Stop Loss et du Take Profit d'une position       |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- déclare et initialise la demande de trade et le résultat
   MqlTradeRequest request;
   MqlTradeResult  result;
   int total=PositionsTotal(); // nombre de positions ouvertes
//--- boucle sur toutes les positions ouvertes
   for(int i=0; i<total; i++)
     {
      //--- paramètres de l'ordre
      ulong  position_ticket=PositionGetTicket(i);// ticket de la position
      string position_symbol=PositionGetString(POSITION_SYMBOL); // symbole 
      int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // nombre de décimales
      ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber de la position
      double volume=PositionGetDouble(POSITION_VOLUME);    // volume de la position
      double sl=PositionGetDouble(POSITION_SL);  // Stop Loss de la position
      double tp=PositionGetDouble(POSITION_TP);  // Take Profit de la position
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // type de la position
      //--- affiche quelques informations sur la position
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  position_ticket,
                  position_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- si le MagicNumber correspond et que le Stop Loss et le Take Profit ne sont pas définis
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        {
         //--- calcule les niveaux de prix actuels
         double price=PositionGetDouble(POSITION_PRICE_OPEN);
         double bid=SymbolInfoDouble(position_symbol,SYMBOL_BID);
         double ask=SymbolInfoDouble(position_symbol,SYMBOL_ASK);
         int    stop_level=(int)SymbolInfoInteger(position_symbol,SYMBOL_TRADE_STOPS_LEVEL);
         double price_level;
         //--- si la distance de décalage minimum autorisée en points du prix de cloturê courant n'est pas définie
         if(stop_level<=0)
            stop_level=150; // définit la distance de décalage de 150 points du priwx de clôture courant
         else
            stop_level+=50; // définit la distance de décalage à (SYMBOL_TRADE_STOPS_LEVEL + 50) points pour la fiabilité
 
         //--- calcul et arrondi des valeurs du Stop Loss et du Take Profit
         price_level=stop_level*SymbolInfoDouble(position_symbol,SYMBOL_POINT);
         if(type==POSITION_TYPE_BUY)
           {
            sl=NormalizeDouble(bid-price_level,digits);
            tp=NormalizeDouble(bid+price_level,digits);
           }
         else
           {
            sl=NormalizeDouble(ask+price_level,digits);
            tp=NormalizeDouble(ask-price_level,digits);
           }
         //--- remise à zéro de la demande et du résultat
         ZeroMemory(request);
         ZeroMemory(result);
         //--- définition des paramètres de l'opération
         request.action  =TRADE_ACTION_SLTP// type de l'opération de trading
         request.position=position_ticket;   // ticket de la position
         request.symbol=position_symbol;     // symbole 
         request.sl      =sl;                // Stop Loss de la position
         request.tp      =tp;                // Take Profit de la position
         request.magic=EXPERT_MAGIC;         // MagicNumber de la position
         //--- affiche des informations sur la modification
         PrintFormat("Modification de #%I64d %s %s",position_ticket,position_symbol,EnumToString(type));
         //--- envoi de la demande
         if(!OrderSend(request,result))
            PrintFormat("OrderSend erreur %d",GetLastError());  // en cas d'échec de l'envoi, affiche le code de l'erreur
         //--- informations sur l'opération   
         PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+

 
Ordre en Attente

Ordre pour placer un ordre en attente. Il est nécessaire de spécifier les 11 champs suivants :

  • action
  • symbol
  • volume
  • prix
  • stoplimit
  • sl
  • tp
  • type
  • type_filling
  • type_time
  • expiration

Il est également possible de spécifier les valeurs des champs "magic" et "comment".

Exemple de l'opération de trading TRADE_ACTION_PENDING pour placer un ordre en attente :

#property description "Exemple de placement d'ordres en attente"
#property script_show_inputs
#define EXPERT_MAGIC 123456                             // MagicNumber de l'expert
input ENUM_ORDER_TYPE orderType=ORDER_TYPE_BUY_LIMIT;   // type de l'ordre
//+------------------------------------------------------------------+
//| Placement d'ordres en attente                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- déclare et initialise la demande de trade et le résultat
   MqlTradeRequest request={};
   MqlTradeResult  result={};
//--- paramètres pour placer un ordre en attente
   request.action   =TRADE_ACTION_PENDING;                             // type de trade operation
   request.symbol   =Symbol();                                         // symbole
   request.volume   =0.1;                                              // volume de 0.1 lot
   request.deviation=2;                                                // déviation autorisée du prix
   request.magic    =EXPERT_MAGIC;                                     // MagicNumber de l'ordre
   int offset = 50;                                                    // décalage du prix courant pour placer un ordre, en points
   double price;                                                       // prix de déclenchement de l'ordre
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);                // valeur du point
   int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);                // nombre de décimales (précision)
   //--- vérification du type de l'opération
   if(orderType==ORDER_TYPE_BUY_LIMIT)
     {
      request.type     =ORDER_TYPE_BUY_LIMIT;                          // type de l'ordre
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;        // prix d'ouverture
      request.price    =NormalizeDouble(price,digits);                 // prix d'ouverture normalisé
     }
   else if(orderType==ORDER_TYPE_SELL_LIMIT)
     {
      request.type     =ORDER_TYPE_SELL_LIMIT;                          // type de l'ordre
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;         // prix d'ouverture
      request.price    =NormalizeDouble(price,digits);                  // prix d'ouverture normalisé
     }
   else if(orderType==ORDER_TYPE_BUY_STOP)
     {
      request.type =ORDER_TYPE_BUY_STOP;                                // type de l'ordre
      price        =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // prix d'ouverture
      request.price=NormalizeDouble(price,digits);                      // prix d'ouverture normalisé
     }
   else if(orderType==ORDER_TYPE_SELL_STOP)
     {
      request.type     =ORDER_TYPE_SELL_STOP;                           // type de l'ordre
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;         // prix d'ouverture
      request.price    =NormalizeDouble(price,digits);                  // prix d'ouverture normalisé
     }
   else Alert("Cet exemple ne permet de ne placer que des ordres en attente");   // si aucun ordre en attente n'est sélectionné
//--- envoie la demande
   if(!OrderSend(request,result))
      PrintFormat("OrderSend erreur %d",GetLastError());                 // en cas d'échec de l'envoi de la demande, affiche le code de l'erreur
//--- informations sur l'opération
   PrintFormat("retcode=%u  transaction=%I64u  ordre=%I64u",result.retcode,result.deal,result.order);
  }
//+------------------------------------------------------------------+

 
Modifier des Ordres en Attente

Ordre pour modifier les prix d'un ordre en attente. Il est nécessaire de spécifier les 7 champs suivants :

  • action
  • ordre
  • prix
  • sl
  • tp
  • type_time
  • expiration

 

Exemple de l'opération de trading TRADE_ACTION_MODIFY pour modifier les niveaux de prix d'ordres en attente :

#define EXPERT_MAGIC 123456  // MagicNumber de l'expert
//+------------------------------------------------------------------+
//| Modification des ordres en attente                               |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- déclare et initialise la demande de trade et le résultat
   MqlTradeRequest request={};
   MqlTradeResult  result={};
   int total=OrdersTotal(); // nombre total d'ordres en attente placés
//--- boucle sur tous les ordres en attente placés
   for(int i=0; i<total; i++)
     {
      //--- paramètres pour l'ordre
      ulong  order_ticket=OrderGetTicket(i);                             // ticket de l'ordre
      string order_symbol=Symbol();                                      // symbole
      int    digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS);  // nombre de décimales
      ulong  magic=OrderGetInteger(ORDER_MAGIC);                         // MagicNumber de l'ordre
      double volume=OrderGetDouble(ORDER_VOLUME_CURRENT);                // volume actuel de l'ordre
      double sl=OrderGetDouble(ORDER_SL);                                // Stop Loss actuel de l'ordre
      double tp=OrderGetDouble(ORDER_TP);                                // Take Profit actuel de l'ordre
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // type de l'ordre
      int offset = 50;                                                   // décalage du prix courant pour placer l'ordre, en points
      double price;                                                      // prix de déclenchement de l'ordre
      double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT);          // valeur du point
      //--- affiche des informations sur l'ordre
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  order_ticket,
                  order_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- si le MagicNumber correspond, et que le Stop Loss et le Take Profit ne sont pas définis
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        {
         request.action=TRADE_ACTION_MODIFY;                           // type de l'opération de trading
         request.order = OrderGetTicket(i);                            // ticket de l'ordre
         request.symbol   =Symbol();                                   // symbole
         request.deviation=5;                                          // déviation autorisée du prix
        //--- définition du niveau de prix, du Take Profit et du Stop Loss de l'ordre suivant son type
         if(type==ORDER_TYPE_BUY_LIMIT)
           {
            price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                // prix d'ouverture normalisé
           }
         else if(type==ORDER_TYPE_SELL_LIMIT)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // prix d'ouverture normalisé
           }
         else if(type==ORDER_TYPE_BUY_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // prix d'ouverture normalisé
           }
         else if(type==ORDER_TYPE_SELL_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // prix d'ouverture normalisé
           }
         //--- envoi de la demande
         if(!OrderSend(request,result))
            PrintFormat("OrderSend erreur %d",GetLastError());  // en cas d'échec de l'envoi de la demande, affiche le code de l'erreur
         //--- informations sur l'opération   
         PrintFormat("retcode=%u  transaction=%I64u  ordre=%I64u",result.retcode,result.deal,result.order);
         //--- remise à zéro de la demande et du résultat
         ZeroMemory(request);
         ZeroMemory(result);
        }
     }
  }
//+------------------------------------------------------------------+

 
Supprimer un Ordre en Attente

Ordre pour supprimer un ordre en attente. Il est nécessaire de spécifier les 2 champs suivants :

  • action
  • ordre

 

Exemple de l'opération de trading TRADE_ACTION_REMOVE pour supprimer des ordres en attente :

#define EXPERT_MAGIC 123456  // MagicNumber de l'expert
//+------------------------------------------------------------------+
//| Suppression des ordres en attente                                |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- déclare et initialise la demande de trading et le résultat
   MqlTradeRequest request={};
   MqlTradeResult  result={};
   int total=OrdersTotal(); // nombre total d'ordre en attente placés
//--- boucle sur tous les ordres en attente placés
   for(int i=total-1; i>=0; i--)
     {
      ulong  order_ticket=OrderGetTicket(i);                   // Ticket de l'ordre
      ulong  magic=OrderGetInteger(ORDER_MAGIC);               // MagicNumber de l'ordre
      //--- si le MagicNumber correspond
      if(magic==EXPERT_MAGIC)
        {
         //--- remise à zéro de la demande et du résultat
         ZeroMemory(request);
         ZeroMemory(result);
         //--- paramètres de l'opération
         request.action=TRADE_ACTION_REMOVE;                   // type de l'opération de trading
         request.order = order_ticket;                         // Ticket de l'ordre
         //--- envoi la demande
         if(!OrderSend(request,result))
            PrintFormat("OrderSend erreur %d",GetLastError());  // en cas d'échec de l'envoi de la demande, affiche le code d'erreur
         //--- informations sur l'opération   
         PrintFormat("retcode=%u  transaction=%I64u  ordre=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
//+------------------------------------------------------------------+

 
Voir aussi

Structures et Classes, fonctions de Trading, Propriétés de l'Ordre