PositionGetDouble

La función devuelve la propiedad solicitada de una posición abierta que previamente ha sido elegida a través de la función PositionGetSymbol o PositionSelect. La propiedad de la posición tiene que ser del tipo double.  Existen 2 variantes de la función.

1. Inmediatamente devuelve el valor de la propiedad.

double  PositionGetDouble(
   ENUM_POSITION_PROPERTY_DOUBLE  property_id      // identificador de la propiedad
   );

2. Devuelve true o false dependiendo del éxito de ejecución de la función. En caso del éxito el valor de la propiedad se coloca en una variable receptora que el último parámetro pasa por referencia.

bool  PositionGetDouble(
   ENUM_POSITION_PROPERTY_DOUBLE  property_id,     // identificador de la propiedad
   double&                        double_var       // aquí recibimos el valor de la propiedad
   );

Parámetros

property_id

[in]  Identificador de la propiedad de la posición. Su valor puede ser uno de los valores de la enumeración ENUM_POSITION_PROPERTY_DOUBLE.

double_var

[out]  Variable del tipo double que recibe el valor de la propiedad requerida.

Valor devuelto

Valor del tipo double.

Nota

En el registro de posiciones con "compensación" (ACCOUNT_MARGIN_MODE_RETAIL_NETTING y ACCOUNT_MARGIN_MODE_EXCHANGE) de cada símbolo en cualquier momento solo puede abrirse una posición, que es el resultado de una o más operaciones. Es mejor no confundir las posiciones con las órdenes pendientes en activo, que también se muestran en la pestaña "Trading" en el panel "Herramientas".

En el caso de que las posiciones se representen independientemente (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), de cada símbolo pueden abrirse a la vez varias posiciones.

Para garantizar la recepción de datos recientes sobre una posición, se recomienda llamar a la función PositionSelect() justamente antes de solicitarlos.

Ejemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- en un ciclo por todas las posiciones en la cuenta
   int total=PositionsTotal();
   for(int i=0i<totali++)
     {
      //--- obtenemos el ticket de la siguiente posición, seleccionando una posición de forma automática para acceder a sus propiedades
      ulong ticket=PositionGetTicket(i);
      if(ticket==0)
         continue;
      
      //--- obtenemos el tipo de la posición y mostramos el encabezado de la lista de propiedades reales de la posición
      string type=(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE ? "Buy" : "Sell");
      PrintFormat("Double properties of an open position %s #%I64u:"typeticket);
      
      //--- imprimimos bajo el encabezado todas las propiedades reales de la posición seleccionada
      PositionPropertiesDoublePrint(15);
     }
   /*
   resultado:
   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
   */
  }
//+------------------------------------------------------------------+
//| Muestra en el registro las propiedades reales de la posición seleccionada        
//+------------------------------------------------------------------+
void PositionPropertiesDoublePrint(const uint header_width=0)
  {
   uint   w=0;
   string header="";
   double value=0;
   
//--- obtenemos la divisa de la cuenta, el símbolo de la posición y el número de decimales del símbolo
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
   string symbol  =PositionGetString(POSITION_SYMBOL);
   int    digits  =(int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- definimos el texto del encabezado y la anchura del campo del encabezado
//--- si la anchura del encabezado se ha transmitido a la función como igual a cero, entonces la anchura será el tamaño de la línea del encabezado + 1
   header="Volume:";
   w=(header_width==0 ? header.Length()+1 : header_width);
//--- obtenemos y mostramos en el registro el volumen de la posición con un encabezado de la anchura establecida
   if(!PositionGetDouble(POSITION_VOLUMEvalue))
      return;
   PrintFormat("%-*s%-.2f"wheadervalue);
   
//--- mostramos en el registro el valor del precio de la posición
   header="Price open:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_PRICE_OPENvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
   
//--- mostramos en el regisro el valor de StopLoss
   header="StopLoss:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_SLvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
   
//--- mostramos en el registro el valor de TakeProfit
   header="TakeProfit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_TPvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
 
//--- mostramos en el registro el valor Price current
   header="Price current:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_PRICE_CURRENTvalue))
      return;
   PrintFormat("%-*s%-.*f"wheaderdigitsvalue);
 
//--- mostramos en el registro el valor de swap acumulado
   header="Swap:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_SWAPvalue))
      return;
   PrintFormat("%-*s%-.2f"wheadervalue);
 
//--- mostramos en el registro el valor de beneficio actual
   header="Profit:";
   w=(header_width==0 ? header.Length()+1 : header_width);
   if(!PositionGetDouble(POSITION_PROFITvalue))
      return;
   PrintFormat("%-*s%-.2f %s"wheadervaluecurrency);
  }

Véase también

PositionGetSymbol(), PositionSelect(), Propiedades de posiciones