PositionGetDouble

函数返回持仓的要求性质,使用PositionGetSymbol或者 PositionSelect预选出来,仓位属性必须是双精度型,有两种变体函数。

1. 立即返回属性值。

double  PositionGetDouble(
   ENUM_POSITION_PROPERTY_DOUBLE  property_id      // 属性标识符
   );

2. 返回true或者false,取决于函数执行成功与否,如果成功,性质值通过引用安置在最后参量的接受变量里。

bool  PositionGetDouble(
   ENUM_POSITION_PROPERTY_DOUBLE  property_id,     // 属性标识符
   double&                        double_var       // 这里接受属性值
   );

参量

property_id

[in] 位置属性标识符。值可能是ENUM_POSITION_PROPERTY_DOUBLE 计算中一个。

double_var

[out]  双精度类型值,如果函数调用失败,返回0。

返回值

双精度 类型值。如果函数失败,返回0 。

注释

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

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

为确保关于仓位的新数据的接收,在提及之前调用 PositionSelect() 函数。

示例:

//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 在账户中的所有仓位中循环
   int total=PositionsTotal();
   for(int i=0i<totali++)
     {
      //--- 通过自动选择仓位取得下一个仓位的编号以访问它的属性
      ulong ticket=PositionGetTicket(i);
      if(ticket==0)
         continue;
      
      //--- 取得仓位类型并显示仓位实数属性列表的标题
      string type=(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE ? "Buy" : "Sell");
      PrintFormat("Double properties of an open position %s #%I64u:"typeticket);
      
      //--- 在标题下方打印选定仓位的全部实数属性
      PositionPropertiesDoublePrint(15);
     }
   /*
   结果:
   Double properties of an open position Buy #2807075208:
   Volume:        1.00
   Price open:    1.10516
   StopLoss:      0.00000
   TakeProfit:    0.00000
   Price current1.10518
   Swap:          0.00
   Profit:        2.00 USD
   */
  }
//+------------------------------------------------------------------+
//| 在日志中显示选定仓位的实数属性                                       |
//+------------------------------------------------------------------+
void PositionPropertiesDoublePrint(const uint header_width=0)
  {
   uint   w=0;
   string header="";
   double value=0;
   
//--- 取得账户货币, 仓位的交易品种和交易品种的小数点位数
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   string symbol  =PositionGetString(POSITION_SYMBOL);
   int    digits  =(int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- 定义标题文字和标题栏位的宽度
//--- 如果传给函数的标题宽度为0, 则宽度为标题文字行的大小+1
   header="Volume:";
   w=(header_width==0 ? header.Length()+1 : header_width);
//--- 取得并在日志中以指定的标题宽度显示仓位交易量
   if(!PositionGetDouble(POSITION_VOLUMEvalue))
      return;
   PrintFormat("%-*s%-.2f"wheadervalue);
   
//--- 在日志中显示仓位价格值
   header="Price open:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_PRICE_OPENvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
   
//--- 在日志中显示止损值
   header="StopLoss:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_SLvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
   
//--- 在日志中显示止盈值
   header="TakeProfit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_TPvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
 
//--- 在日志中显示当前价格值
   header="Price current:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_PRICE_CURRENTvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
 
//--- 在日志中显示累积的库存费
   header="Swap:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_SWAPvalue))
      return;
   PrintFormat("%-*s%-.2f"wheadervalue);
 
//--- 在日志中显示当前利润值
   header="Profit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_PROFITvalue))
      return;
   PrintFormat("%-*s%-.2f %s"wheadervaluecurrency);
  }

另见

PositionGetSymbol()PositionSelect()仓位属性