OrderSelect

Sélectionne un ordre pour pouvoir l'utiliser. Retourne si la fonction s'est terminé avec succès. Sinon retourne false. Pour plus de détails sur l'erreur, appelez GetLastError().

bool  OrderSelect(
   ulong   ticket      // Ticket de l'ordre
   );

Paramètres

ticket

[in]  Ticket de l'ordre.

Valeur de Retour

Valeur de type bool.

Note

Ne confondez pas les ordres en attente en cours avec les positions, qui sont également affichées dans l'onglet Trading de la fenêtre Boîte à Outils.

Pour le "netting" des positions (ACCOUNT_MARGIN_MODE_RETAIL_NETTING et ACCOUNT_MARGIN_MODE_EXCHANGE), seule une position peut exister pour un même symbole à tout moment. Cette position est le résultat d'une ou plusieurs transactions. Ne confondez pas les positions avec les ordres en attente valides, qui sont également affichés dans l'onglet Trading de la fenêtre Boîte à Outils.

Si les positions individuelles sont autorisées (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), plusieurs positions peuvent être ouvertes pour un même symbole.

La fonction OrderSelect() copie les données d'une position dans l'environnement du programme et les appels ultérieurs à OrderGetDouble(), OrderGetInteger() et OrderGetString() retournent les données copiées auparavant. Cela signifie que l'ordre lui-même peut ne plus exister (ou que son prix d'ouverture, son Stop Loss, son Take Profit ou son expiration a changé), mais que les données de cet ordres sont toujours accessibles. Pour être sûr d'utiliser les données à jour d'un ordre, il est recommandé d'appeler OrderSelect() juste avant son utilisation.

Exemple :

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // décalage par rapport au prix actuel pour passer l'ordre, en points 
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // type d'ordre
#define   VOLUME        1.0                     // volume
#define   DEVIATION     2                       // déviation autorisée par rapport au prix
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- déclare et initialise la demande de trade, le résultat et les variables
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   double          order_price=0;
   
//--- paramètres du passage de l'ordre en attente
   request.action    = TRADE_ACTION_PENDING;                               // trading operation type
   request.symbol    = _Symbol;                                            // symbol
   request.volume    = VOLUME;                                             // volume
   request.deviation = DEVIATION;                                          // allowed deviation from the price
   request.magic     = EXPERT_MAGIC;                                       // order MagicNumber
   
//--- vérifie le type de l'opération
   switch(DIRECTION)
     {
      case ORDER_TYPE_BUY_LIMIT :
        request.type = ORDER_TYPE_BUY_LIMIT;                               // type de l'ordre
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// prix d'ouverture
        request.priceNormalizeDouble(order_price_Digits);              // prix d'ouverture normalisé
        break;
      case ORDER_TYPE_SELL_LIMIT :
        request.type = ORDER_TYPE_SELL_LIMIT;                              // type d'ordre
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// prix d'ouverture
        request.priceNormalizeDouble(order_price,_Digits);               // prix d'ouverture normalisé
        break;
      case ORDER_TYPE_BUY_STOP :
        request.type = ORDER_TYPE_BUY_STOP;                                // type d'ordre
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)+OFFSET*_Point;// prix d'ouverture
        request.priceNormalizeDouble(order_price,_Digits);               // prix d'ouverture normalisé
        break;
      case ORDER_TYPE_SELL_STOP :
        request.type = ORDER_TYPE_SELL_STOP;                               // type d'ordre
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)-OFFSET*_Point;// prix d'ouverture
        request.priceNormalizeDouble(order_price,_Digits);               // prix d'ouverture normalisé
        break;
      default// si un ordre non en attente ou StopLimit est sélectionné 
        Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
        break;
     }
 
//--- envoie une demande. En cas d'échec de l'envoi d'une demande, affiche le code d'erreur et termine l'opération
   if(!OrderSend(requestresult))
     {
      Print("OrderSend error "GetLastError());
      return;
     }
     
//--- affiche les données de l'opération
   PrintFormat("Trade request result: retcode=%u, order=%I64u"result.retcoderesult.order);
   
//--- récupère le ticket de l'ordre à partir du résultat de l'opération de trading et sélectionne l'ordre par son ticket
   ulong ticket=result.order;
   ResetLastError();
   if(!OrderSelect(ticket))
     {
      PrintFormat("OrderSelect(%I64u) failed. Error %d"ticketGetLastError());
      return;
     }
 
//--- affiche dans le journal les données de l'ordre, sélectionné par ticket
   ENUM_ORDER_TYPE   type  = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
   long              time  = OrderGetInteger(ORDER_TIME_SETUP_MSC);
   double            price = OrderGetDouble(ORDER_PRICE_OPEN);
   double            volumeOrderGetDouble(ORDER_VOLUME_CURRENT);
   string            symbolOrderGetString(ORDER_SYMBOL);
   int               digits= (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   PrintFormat("Current selected order: %s %.2f %s #%I64u at %.*f, %s",
               symbolvolumeOrderTypeDescription(type), ticketdigitspriceTimeMscToString(time));
   /*
   résultat :
   Trade request resultretcode=10009order=2811006719
   Current selected orderEURUSD 1.00 Buy Limit #2811006719 at 1.105502024.09.04 10:38:28.563
   */
  }
//+------------------------------------------------------------------+
//| Retourne l'heure en millisecondes                                |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '0'));
  }
//+------------------------------------------------------------------+
//| Retourne la description du type de l'ordre                       |
//+------------------------------------------------------------------+
string OrderTypeDescription(const ENUM_ORDER_TYPE type)
  {
   switch(type)
     {
      case ORDER_TYPE_BUY              :  return("Buy");
      case ORDER_TYPE_SELL             :  return("Sell");
      case ORDER_TYPE_BUY_LIMIT        :  return("Buy Limit");
      case ORDER_TYPE_SELL_LIMIT       :  return("Sell Limit");
      case ORDER_TYPE_BUY_STOP         :  return("Buy Stop");
      case ORDER_TYPE_SELL_STOP        :  return("Sell Stop");
      case ORDER_TYPE_BUY_STOP_LIMIT   :  return("Buy Stop Limit");
      case ORDER_TYPE_SELL_STOP_LIMIT  :  return("Sell Stop Limit");
      default                          :  return("Unknown order type");
     }
  }

Voir également

OrderGetInteger(), OrderGetDouble(), OrderGetString(), OrderCalcProfit(), OrderGetTicket(), Propriétés d'un Ordre