PositionSelectByTicket

根据持仓中指定的报价号选择持仓。如果成功,返回true。如果函数失败,返回false。调用GetLastError() 了解错误详情。

bool  PositionSelectByTicket(
   ulong   ticket     // 持仓价格
   );

参数

报价

[in]  持仓报价。

返回值

bool 型值。

注意

PositionSelectByTicket() 函数复制持仓数据到程序环境。进一步调用PositionGetDouble()PositionGetInteger()PositionGetString() 返回之前复制的数据。即使持仓已不存在(或其大小,方向等等发生变化),有时仍然可能接收到数据。若要确保您收到有效的持仓数据,建议您访问数据之前调用PositionSelectByTicket()。

示例:

#define   EXPERT_MAGIC  123456   // MagicNumber
 
//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 声明和初始化请求和结果结构
   MqlTradeRequest request={};
   MqlTradeResult  result ={};
   
//--- 填充交易请求参数以开启一个多头仓位
   request.action    = TRADE_ACTION_DEAL;                      // 交易操作类型
   request.symbol    = Symbol();                               // 交易品种
   request.volume    = 0.1;                                    // 交易量为 0.1 手
   request.type      = ORDER_TYPE_BUY;                         // 订单类型
   request.price     = SymbolInfoDouble(Symbol(), SYMBOL_ASK); // 开仓价格
   request.deviation = 5;                                      // 允许的价格偏差
   request.magic     = EXPERT_MAGIC;                           // 订单幻数
   
//--- 发送请求. 如果发送请求失败, 则显示错误代码并结束操作
   if(!OrderSend(requestresult))
     {
      PrintFormat("OrderSend error "GetLastError());
      return;
     }
      
//--- 显示操作数据
   PrintFormat("Trade request result: retcode: %u, deal: %I64u, order: %I64u"result.retcoderesult.dealresult.order);
   
//--- 取得交易操作结果的仓位编号并根据编号选择仓位
//--- 新开启仓位的编号就对应着所生成交易的订单编号
   ulong ticket=result.order;
   ResetLastError();
   if(!PositionSelectByTicket(ticket))
     {
      PrintFormat("PositionSelectByTicket(%I64u) failed. Error %d"ticketGetLastError());
      return;
     }
 
//--- 在日志中根据选定编号显示仓位数据
   ENUM_POSITION_TYPE type  = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
   long               time  = PositionGetInteger(POSITION_TIME_MSC);
   double             price = PositionGetDouble(POSITION_PRICE_OPEN);
   double             volumePositionGetDouble(POSITION_VOLUME);
   string             symbolPositionGetString(POSITION_SYMBOL);
   int                digits= (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   PrintFormat("Current selected position: %s %.2f %s #%I64u at %.*f, %s",
               symbolvolume, (type==POSITION_TYPE_BUY ? "Buy" : "Sell"), ticketdigitspriceTimeMscToString(time));
   /*
   结果:
   Trade request resultretcode10009deal2778100901order2803905975
   Current selected positionEURUSD 0.10 Buy #2803905975 at 1.106722024.09.02 12:09:51.239
   */
  }
//+------------------------------------------------------------------+
//| 返回包含毫秒信息的时间                                              |
//+------------------------------------------------------------------+
string TimeMscToString(const long time_mscint flags=TIME_DATE|TIME_MINUTES|TIME_SECONDS)
  {
   return(TimeToString(time_msc/1000flags) + "." + IntegerToString(time_msc %10003, '0'));
  }

另见

PositionGetSymbol()PositionsTotal()持仓属性