OrderSelect

Выбирает ордер для дальнейшей работы с ним. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

bool  OrderSelect(
   ulong   ticket      // тикет ордера
   );

Параметры

ticket

[in]  Тикет ордера.

Возвращаемое значение

Значение типа bool.

Примечание

Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты" клиентского терминала.

При "неттинговом" учете позиций (ACCOUNT_MARGIN_MODE_RETAIL_NETTING и ACCOUNT_MARGIN_MODE_EXCHANGE) по каждому символу в любой момент времени может быть открыта только одна позиция, которая является результатом одной или более сделок. Не следует путать между собой позиции и действующие отложенные ордера, которые также отображаются на вкладке "Торговля" в панели "Инструменты".

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций.

Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderGetDouble(), OrderGetInteger(), OrderGetString() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.

Пример:

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // отступ от текущей цены для установки ордера, в пунктах
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // тип ордера
#define   VOLUME        1.0                     // объём
#define   DEVIATION     2                       // допустимое отклонение от цены
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- объявление и инициализация запроса, результата и переменных
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   double          order_price=0;
   
//--- параметры для установки отложенного ордера
   request.action    = TRADE_ACTION_PENDING;                               // тип торговой операции
   request.symbol    = _Symbol;                                            // символ
   request.volume    = VOLUME;                                             // объем
   request.deviation = DEVIATION;                                          // допустимое отклонение от цены
   request.magic     = EXPERT_MAGIC;                                       // MagicNumber ордера
   
//--- проверка типа операции
   switch(DIRECTION)
     {
      case ORDER_TYPE_BUY_LIMIT :
        request.type = ORDER_TYPE_BUY_LIMIT;                               // тип ордера
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)-OFFSET*_Point;// цена для открытия 
        request.priceNormalizeDouble(order_price_Digits);              // нормализованная цена открытия 
        break;
      case ORDER_TYPE_SELL_LIMIT :
        request.type = ORDER_TYPE_SELL_LIMIT;                              // тип ордера
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)+OFFSET*_Point;// цена для открытия 
        request.priceNormalizeDouble(order_price,_Digits);               // нормализованная цена открытия 
        break;
      case ORDER_TYPE_BUY_STOP :
        request.type = ORDER_TYPE_BUY_STOP;                                // тип ордера
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_ASK)+OFFSET*_Point;// цена для открытия 
        request.priceNormalizeDouble(order_price,_Digits);               // нормализованная цена открытия 
        break;
      case ORDER_TYPE_SELL_STOP :
        request.type = ORDER_TYPE_SELL_STOP;                               // тип ордера
        order_price  = SymbolInfoDouble(_SymbolSYMBOL_BID)-OFFSET*_Point;// цена для открытия 
        request.priceNormalizeDouble(order_price,_Digits);               // нормализованная цена открытия 
        break;
      default// если выбран не отложенный, или StopLimit-ордер
        Alert("This example is only for placing pending orders BuyLimit, SellLimit, BuyStop and SellStop");
        break;
     }
 
//--- отправляем запрос, если отправить запрос не удалось, выводим код ошибки и завершаем работу
   if(!OrderSend(requestresult))
     {
      Print("OrderSend error "GetLastError());
      return;
     }
     
//--- выведем информацию об операции
   PrintFormat("Trade request result: retcode=%u, order=%I64u"result.retcoderesult.order);
   
//--- получим тикет ордера из результата торговой операции и выберем ордер по тикету
   ulong ticket=result.order;
   ResetLastError();
   if(!OrderSelect(ticket))
     {
      PrintFormat("OrderSelect(%I64u) failed. Error %d"ticketGetLastError());
      return;
     }
 
//--- выведем в журнал данные выбранного по тикету ордера
   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));
   /*
   результат:
   Trade request resultretcode=10009order=2811006719
   Current selected orderEURUSD 1.00 Buy Limit #2811006719 at 1.105502024.09.04 10:38:28.563
   */
  }
//+------------------------------------------------------------------+
//| Возвращает время с миллисекундами                                |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '0'));
  }
//+------------------------------------------------------------------+
//| Возвращает описание типа ордера                                  |
//+------------------------------------------------------------------+
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");
     }
  }

Смотри также

OrderGetInteger(), OrderGetDouble(), OrderGetString(), OrderCalcProfit(), OrderGetTicket(), Свойства ордеров