ObjectGetDouble

Devuelve el valor de la correspondiente propiedad del objeto. La propiedad del objeto debe ser del tipo double.  Existen 2 variantes de la función.

1 Devuelve el valor de la propiedad directamente.

double  ObjectGetDouble(
   long                            chart_id,          // identificador del gráfico
   string                          name,              // nombre del objeto
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // identificador de la propiedad
   int                             prop_modifier=0    // modificador de la propiedad, si hace falta
   );

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

bool  ObjectGetDouble(
   long                            chart_id,          // identificador del gráfico
   string                          name,              // nombre del objeto
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // identificador de la propiedad
   int                             prop_modifier,     // modificador de la propiedad
   double&                         double_var         // aquí recibimos el valor de la propiedad
   );

Parámetros

chart_id

[in]  Identificador del gráfico. 0 significa el gráfico actual.

name

[in]  Nombre del objeto.

prop_id

[in]  Identificador de la propiedad del objeto. Su valor puede ser uno de los valores de la enumeración ENUM_OBJECT_PROPERTY_DOUBLE.

prop_modifier

[in]  Modificador de la propiedad especificada. Para la primera opción el valor del modificador es igual a 0 por defecto. La mayoría de las propiedades no requiere el modificador. Significa el número del nivel en las herramientas de Fibonacci y en el objeto gráfico Tridente de Andrews. La numeración se empieza desde cero.

double_var

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

Valor devuelto

Valor del tipo double para la primera opción de la llamada.

Para la segunda variante devuelve true, si dicha propiedad se mantiene y su valor ha sido colocado en la variable double_var, de lo contrario devuelve false. Para la información más detallada sobre el error hay que llamar a la función GetLastError().

Nota

La función usa una llamada sincrónica, esto significa que la función espera a la ejecución de todos los comandos que han sido ubicados en la cola del gráfico antes de su llamada, y por eso puede consumir un tiempo considerable. Hay que tener esta circunstancia en cuenta al trabajar con multitud de objetos en el gráfico.

 

Ejemplo:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetDouble"   // Nombre del objeto
#define   WND        0                       // Subventana del gráfico
#define   EXT        " (%$)"                 // Cadena de formato para mostrar los valores de precio en los niveles
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- identificador actual del gráfico, símbolo de este gráfico y Digits del símbolo
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- construimos el objeto gráfico "Niveles de Fibonacci", sobre los precios máximos y mínimos del gráfico visible
   if(!CreateFibo(chart_id))
      return;
      
//--- número de niveles del objeto
   int total=(int)ObjectGetInteger(chart_idOBJ_NAMEOBJPROP_LEVELS);
   double value =0;
   double price0=0;
   double price1=0;
   
//--- precios de los puntos de anclaje
   price0=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE0);
   price1=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE1);
   
//--- en un ciclo por el número de niveles del objeto
   for(int i=0i<totali++)
     {
      //--- obtenemos el valor establecido para el nivel actual
      ResetLastError();
      if(!ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_LEVELVALUEivalue))
        {
         Print("ObjectGetDouble() failed. Error "GetLastError());
         return;
        }
      
      //--- obtenemos los precios máximo y mínimo del anclaje del objeto y la distancia entre ellos en valor de precio
      double max=fmax(price0price1);
      double min=fmin(price0price1);
      double range=max-min;
      
      //--- calculamos el valor de precio para el nivel de objeto actual
      double level_price=min+range*value;
      
      //--- establecemos el color para el nivel de modo que sea visible en la oscuridad y en el fondo claro del gráfico
      ObjectSetInteger(chart_idOBJ_NAMEOBJPROP_LEVELCOLORiclrRed);
      
      //--- establecemos la cadena de formato para el nivel, de modo que junto con el valor del nivel se muestre su valor de precio
      string level_text=ObjectGetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTi);
      if(StringFind(level_textEXT)<0)
        {
         level_text+=EXT;
         ObjectSetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTilevel_text);
        }
      
      //--- imprimimos en el diario el número de nivel y sus datos : el valor del nivel y su precio
      PrintFormat("Fibo level [%d] value: %.3f,  price: %.*f"ivaluedigitslevel_price);
     }
   /*
   resultado:
   Fibo level [0value0.000,  price0.61989
   Fibo level [1value0.236,  price0.62533
   Fibo level [2value0.382,  price0.62869
   Fibo level [3value0.500,  price0.63140
   Fibo level [4value0.618,  price0.63412
   Fibo level [5value1.000,  price0.64292
   Fibo level [6value1.618,  price0.65715
   Fibo level [7value2.618,  price0.68018
   Fibo level [8value4.236,  price0.71745
   */
  }
//+------------------------------------------------------------------+
//| Crea un objeto gráfico de Niveles de Fibonacci en el gráfico especificado |
//+------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
  {
//--- los niveles de Fibonacci los dibujaremos desde el mayor hasta el menor valor visible del precio en el gráfico; los obtenemos
   double   price_high=0price_low=0;
   datetime time_high =0time_low =0;
   
   if(!GetChartExtremums(chart_idprice_highprice_lowtime_hightime_low))
      return(false);
 
//--- construimos el objeto "niveles de Fibonacci" en las coordenadas de precio/hora encontradas
   if(!ObjectCreate(chart_idOBJ_NAMEOBJ_FIBOWNDtime_highprice_hightime_lowprice_low))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
     
//--- todo ha tenido éxito, así que actualizamos el gráfico y retornamos true
   ChartRedraw();
   return(true);
  }
//+------------------------------------------------------------------+
//| Retornamos los precios máximos y mínimos en el gráfico y su hora |
//+------------------------------------------------------------------+
bool GetChartExtremums(const long chart_iddouble &price_highdouble &price_lowdatetime &time_highdatetime &time_low)
  {
//--- ponemos a cero las variables
   price_high=price_low=0;
   time_high =time_low =0;
//--- símbolo del gráfico
   string symbol = ChartSymbol(chart_id);
 
//--- según el número de la primera barra visible y el número de barras en el gráfico, calculamos el inicio del rango de las series de tiempo copiadas
   int first = (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR);
   int count = (int)ChartGetInteger(chart_idCHART_VISIBLE_BARS);
   int start = first+1-count;
   
//--- arrays donde se copiarán las series temporales
   double   array_high[];
   double   array_low[];
   datetime array_time[];
   int      index;
   
//--- copiamos en arrays tres series temporales en una cantidad count y comenzando desde start
   ResetLastError();
   if(CopySeries(symbolPERIOD_CURRENTstartcountCOPY_RATES_TIME|COPY_RATES_HIGH|COPY_RATES_LOWarray_timearray_higharray_low)!=count)
     {
      PrintFormat("%s: CopySeries() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   
//--- buscamos el índice de precio máximo en el array array_high
   index=ArrayMaximum(array_high);
   if(index<0)
     {
      PrintFormat("%s: ArrayMaximum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- anotamos el precio más alto en el gráfico visible y el valor de la barra de hora en la que se encuentra este precio
   price_high=array_high[index];
   time_high=array_time[index];
   
//--- buscamos el índice de precio mínimo en el array array_low
   index=ArrayMinimum(array_low);
   if(index<0)
     {
      PrintFormat("%s: ArrayMinimum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- anotamos el precio más bajo en el gráfico visible y el valor de la barra de hora en la que se encuentra este precio
   price_low=array_low[index];
   time_low=array_time[index];
   
//--- todo ha tenido éxito
   return(true);
  }