OrderSelect

Seleciona uma ordem para trabalhar. Retorna true se a função for concluída com sucesso. Retorna false se a execução da função falhar. Para mais detalhes sobre o erro, chame GetLastError().

bool  OrderSelect(
   ulong   ticket      // Ticket de ordem
   );

Parâmetros

ticket

[in]  Ticket da ordem.

Valor retornado

Valor do tipo bool.

Observação

Não confunda ordens pendentes com posições, que também são exibidos na aba "negócios" da "caixa de ferramentas" do terminal do cliente.

Ao usar o registro de posições com "cobertura" (ACCOUNT_MARGIN_MODE_RETAIL_NETTING e ACCOUNT_MARGIN_MODE_EXCHANGE), para cada símbolo, em qualquer momento, pode estar aberta apenas a posição que resulte de uma ou mais operações. Não confunda as posições com as ordens pendentes ativas que aparecem na aba "Negociação" da janela "Caixa de ferramentas".

Ao usar a exibição independente de posições (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), pode haver várias posições abertas ao mesmo tempo para cada símbolo.

A função OrderGetTicket() copia os dados de uma ordem para o ambiente do programa, e chamadas subsequentes de OrderGetDouble(), OrderGetInteger(), OrderGetString() retornam esses dados copiados anteriormente. Isso significa que a ordem em si pode já não existir (ou seu preço de abertura, Stop Loss/Take Profit, níveis de lucro ou expiração podem ter mudado), mas ainda assim é possível obter os dados dessa ordem. Para garantir que os dados da posição estejam atualizados, é recomendável chamar OrderSelect() logo antes de acessá-los.

Exemplo:

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // desvio da ordem em relação ao preço atual, em pontos
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // tipo de ordem
#define   VOLUME        1.0                     // volume
#define   DEVIATION     2              // desvio permitido do preço
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- declaração e inicialização da solicitação, resultado e variáveis
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   double          order_price=0;
   
//--- parâmetros para a colocação de uma ordem pendente
   request.action    = TRADE_ACTION_PENDING;                               //--- tipo de operação
   request.symbol    = _Symbol;                                            // símbolo
   request.volume    = volume;            // volume
   request.deviation = DEVIATION;         // desvio permitido em relação ao preço
   request.magic     = EXPERT_MAGIC;      // MagicNumber da ordem
   
//--- verificação do tipo de operação
   switch(DIRECTION)
     {
      case ORDER_TYPE_BUY_LIMIT :
        request.type = ORDER_TYPE_BUY_LIMIT;                               // tipo de ordem
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// preço para abertura 
        request.priceNormalizeDouble(order_price_Digits);              // preço de abertura normalizado 
        break;
      case ORDER_TYPE_SELL_LIMIT :
        request.type = ORDER_TYPE_SELL_LIMIT;                              // tipo de ordem
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// preço de abertura 
        request.priceNormalizeDouble(order_price_Digits);              // preço de abertura normalizado 
        break;
      case ORDER_TYPE_BUY_STOP :
        request.type = ORDER_TYPE_BUY_STOP;                                // tipo de ordem
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// preço para abertura 
        request.priceNormalizeDouble(order_price_Digits);              // preço de abertura normalizado 
        break;
      case ORDER_TYPE_SELL_STOP :
        request.type = ORDER_TYPE_SELL_STOP;                               // tipo de ordem
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// preço de abertura 
        request.priceNormalizeDouble(order_price_Digits);              // preço de abertura normalizado 
        break;
      default// se a ordem selecionada não for pendente ou do tipo StopLimit
        Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
        break;
     }
 
//--- enviamos a solicitação, se o envio falhar, imprimimos o código de erro e encerramos o trabalho
   if(!OrderSend(requestresult))
     {
      Print("OrderSend error "GetLastError());
      return;
     }
     
//--- imprimimos informações sobre a operação
   PrintFormat("Trade request result: retcode=%u, order=%I64u"result.retcoderesult.order);
   
//--- obtemos o ticket da ordem do resultado da operação de negociação e selecionamos a ordem pelo ticket
   ulong ticket=result.order;
   ResetLastError();
   if(!OrderSelect(ticket))
     {
      PrintFormat("OrderSelect(%I64u) failed. Error %d"ticketGetLastError());
      return;
     }
 
//--- imprimimos no log os dados da ordem selecionada pelo 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 o tempo em milissegundos                                 |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '0'));
  }
//+------------------------------------------------------------------+
//| Retorna a descrição do tipo de ordem                             |
//+------------------------------------------------------------------+
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");
     }
  }

Também Veja

OrderGetInteger(), OrderGetDouble(), OrderGetString(), OrderCalcProfit(), OrderGetTicket(), Propriedades de uma Ordem