OrderSelect

选择工作订单。如果函数成功调用返回真值,如果函数没能完成,返回错误值,了解更多关于错误调用的信息,使用 GetLastError()

bool  OrderSelect(
   ulong   ticket      // 订单号
   );

参量

报价

[in] 订单号。

返回值

布尔型值。

注释

不要使仓位挂单混乱,它显示在客户端“工具箱”的“交易”标签中。

对于"单边" 持仓 (ACCOUNT_MARGIN_MODE_RETAIL_NETTINGACCOUNT_MARGIN_MODE_EXCHANGE),无论任何时候一个交易品种只能存在一个持仓 。该持仓是一个或多个交易的结果。请不要混淆也显示在工具箱窗口交易标签中的有效挂单的持仓。

如果允许单独持仓 (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING),那么可为一个交易品种打开多个持仓。

OrderSelect()函数复制有关订单的数据到程序环境中,远程调用OrderGetDouble()OrderGetInteger()OrderGetString(),返回先前的复制数据。表示该命令本身不存在(或者开仓价格,止损数值/目标数值水平或者届期改变),但是命令数据仍旧包含。为了确保接收订单新命令,推荐调用OrderSelect()命令。

示例:

#define   EXPERT_MAGIC  123456
#define   OFFSET        50                      // 设置订单距离当前价格的点数
#define   DIRECTION     ORDER_TYPE_BUY_LIMIT    // 订单类型
#define   VOLUME        1.0                     // 交易量
#define   DEVIATION     2                       // 允许的价格偏差
 
//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                    |
//+------------------------------------------------------------------+
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;                                       // 订单幻数
   
//--- 检查操作类型
   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// 如果没有选择挂单或者止损限价单
        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()订单属性