OrderSelect

Elige una orden para el futuro trabajo con ella. Devuelve true en caso de que la ejecución de la función se finalice con éxito, de lo contrario devuelve false. Para obtener la información sobre el error hay que llamar a la función GetLastError().

bool  OrderSelect(
   ulong   ticket,      // ticket de la orden
   );

Parámetros

ticket

[in]  Ticket de la orden.

Valor devuelto

Valor del tipo bool.

Nota

No se puede confundir las órdenes pendientes con las posiciones que también se muestran en la pestaña "Operaciones" del panel "Caja de Herramientas" del terminal de cliente.

En el registro de posiciones con "compensación" (ACCOUNT_MARGIN_MODE_RETAIL_NETTING y ACCOUNT_MARGIN_MODE_EXCHANGE) de cada símbolo en cualquier momento solo puede abrirse una posición, que es el resultado de una o más operaciones. Es mejor no confundir las posiciones con las órdenes pendientes en activo, que también se muestran en la pestaña "Trading" en el panel "Herramientas".

En el caso de que las posiciones se representen independientemente (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), de cada símbolo pueden abrirse a la vez varias posiciones.

La función OrderSelect() copia los datos sobre la orden en el entorno del programa, y las posteriores llamadas OrderGetDouble(), OrderGetInteger(), OrderGetString() devuelven los datos copiados anteriormente. Eso significa que la propia orden a lo mejor ya no existe (o se ha cambiado su precio de apertura, niveles Stop Loss / Take Profit o el plazo de vencimiento), pero todavía se puede seguir recibiendo los datos sobre esta orden. Para garantizar la recepción de datos recientes sobre una orden, se recomienda llamar a la función OrderSelect() justamente antes de solicitarlos.

Ejemplo:

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // separación desde el precio actual para establecer la orden, en puntos
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // tipo de orden
#define   VOLUME        1.0                     // volumen
#define   DEVIATION     2                       // desviación permitida respecto al precio
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- declaración e inicialización de la consulta, el resultado y las variables
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   double          order_price=0;
   
//--- parámetros de colocación de una orden pendiente
   request.action    = TRADE_ACTION_PENDING;                               // tipo de operación comercial
   request.symbol    = _Symbol;                                            // símbolo
   request.volume    = VOLUME;                                             // volumen
   request.deviation = DEVIATION;                                          // desviación permitida respecto al precio
   request.magic     = EXPERT_MAGIC;                                       // MagicNumber de la orden
   
//--- comprobación del tipo de operación
   switch(DIRECTION)
     {
      case ORDER_TYPE_BUY_LIMIT :
        request.type = ORDER_TYPE_BUY_LIMIT;                               // tipo de orden
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// precio de apertura 
        request.priceNormalizeDouble(order_price_Digits);              // precio normalizado de apertura 
        break;
      case ORDER_TYPE_SELL_LIMIT :
        request.type = ORDER_TYPE_SELL_LIMIT;                              // tipo de orden
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// precio para la apertura 
        request.priceNormalizeDouble(order_price,_Digits);               // precio normalizado de apertura 
        break;
      case ORDER_TYPE_BUY_STOP :
        request.type = ORDER_TYPE_BUY_STOP;                                // tipo de orden
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)+OFFSET*_Point;// precio para la apertura 
        request.priceNormalizeDouble(order_price,_Digits);               // precio normalizado de apertura 
        break;
      case ORDER_TYPE_SELL_STOP :
        request.type = ORDER_TYPE_SELL_STOP;                               // tipo de orden
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)-OFFSET*_Point;// precio para la apertura 
        request.priceNormalizeDouble(order_price,_Digits);               // precio normalizado de apertura 
        break;
      default// si no se ha elegido una orden pendiente o StopLimit
        Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
        break;
     }
 
//--- enviar la solicitud, si la solicitud no se ha podido enviar, mostramos el código de error y finalizamos el funcionamiento
   if(!OrderSend(requestresult))
     {
      Print("OrderSend error "GetLastError());
      return;
     }
     
//--- mostramos la información sobre la operación
   PrintFormat("Trade request result: retcode=%u, order=%I64u"result.retcoderesult.order);
   
//--- obtenemos el ticket de la orden a partir del resultado de la operación comercial y seleccionamos la orden según el ticket
   ulong ticket=result.order;
   ResetLastError();
   if(!OrderSelect(ticket))
     {
      PrintFormat("OrderSelect(%I64u) failed. Error %d"ticketGetLastError());
      return;
     }
 
//--- mostramos en el registro los datos de la orden seleccionada según el 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));
   /*
   resultado:
   Trade request resultretcode=10009order=2811006719
   Current selected orderEURUSD 1.00 Buy Limit #2811006719 at 1.105502024.09.04 10:38:28.563
   */
  }
//+------------------------------------------------------------------+
//| Retorna la hora en milisegundos                                  |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '0'));
  }
//+------------------------------------------------------------------+
//| Retorna la descripción del tipo de orden                         |
//+------------------------------------------------------------------+
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");
     }
  }

Véase también

OrderGetInteger(), OrderGetDouble(), OrderGetString(), OrderCalcProfit(), OrderGetTicket(), Propiedades de órdenes