ObjectGetDouble

A função retorna o valor da propriedade do objeto correspondente. A propriedade objeto deve ser do tipo double. Existem 2 variantes da função.

1. Imediatamente retorna o valor da propriedade.

double  ObjectGetDouble(
   long                            chart_id,          // identificador Gráfico
   string                          name,              // nome objeto
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // identificador propriedade
   int                             prop_modifier=0    // modificador propriedade, se requerida
   );

2. Retorna true ou false, dependendo do sucesso da função. Se bem sucedido, o valor da propriedade é colocado para receber uma variável passada como referência pelo último parâmetro.

bool  ObjectGetDouble(
   long                            chart_id,          // identificador Gráfico
   string                          name,              // nome objeto
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // identificador propriedade
   int                             prop_modifier,     // modificador propriedade
   double&                         double_var         // aqui nós aceitamos o valor da propriedade
   );

Parâmetros

chart_id

[in]  Identificador do gráfico. Significa o gráfico atual.

nome

[in]  Nome do objeto.

prop_id

[in]  ID da propriedade do objeto. O valor pode ser um dos valores do enumerador ENUM_OBJECT_PROPERTY_DOUBLE.

prop_modifier

[in]  Modificador da propriedade específica. Para a primeira variante, o modificador tem valor padrão igual a 0. A maioria das propriedades não requerem um modificador. Indica o número do nível em ferramentas Fibonacci e no objeto gráfico do tipo Tridente de Andrew. A numeração dos níveis começa a partir do zero.

double_var

[out]  Variável do tipo double que recebeu o valor do propriedade solicitada.

Valor do Retorno

Valor do tipo double para a primeira variante chamada.

Para a segunda variante, se essa propriedade é mantida e o valor foi colocado na variável double_var, a função retorna true, caso contrário, retorna false. Para ler mais sobre o erro, chamar GetLastError().

Observação

A função utiliza uma chamada síncrona, isso significa que a função espera a execução de todos os comandos que foram colocados na fila do gráfico antes de sua chamada, e por isso este recurso pode consumir muito tempo. Deve ter isso em mente, se você estiver trabalhando com um grande número de objetos no gráfico.

 

Exemplo:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetDouble"   // Nome do objeto
#define   WND        0                       // Su0bjanela do gráfico
#define   EXT        " (%$)"                 // String de formato para exibir os valores de preço nos níveis
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- identificador do gráfico atual, símbolo desse gráfico e Digits do símbolo
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- construímos o objeto gráfico "Níveis de Fibonacci" nos preços máximo e mínimo do gráfico visível
   if(!CreateFibo(chart_id))
      return;
      
//--- quantidade de níveis do objeto
   int total=(int)ObjectGetInteger(chart_idOBJ_NAMEOBJPROP_LEVELS);
   double value =0;
   double price0=0;
   double price1=0;
   
//--- preços dos pontos de ancoragem
   price0=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE0);
   price1=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE1);
   
//--- em laço pela quantidade de níveis do objeto
   for(int i=0i<totali++)
     {
      //--- obtemos o valor definido para o nível atual
      ResetLastError();
      if(!ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_LEVELVALUEivalue))
        {
         Print("ObjectGetDouble() failed. Error "GetLastError());
         return;
        }
      
      //--- obtemos os preços máximo e mínimo de ancoragem do objeto e a distância entre eles em valor de preço
      double max=fmax(price0price1);
      double min=fmin(price0price1);
      double range=max-min;
      
      //--- calculamos o valor de preço para o nível atual do objeto
      double level_price=min+range*value;
      
      //--- definimos a cor para o nível de modo que seja visível tanto no fundo escuro quanto no fundo claro do gráfico
      ObjectSetInteger(chart_idOBJ_NAMEOBJPROP_LEVELCOLORiclrRed);
      
      //--- definimos para o nível a string de formato, para que junto com o valor do nível seja exibido também o seu valor de preço
      string level_text=ObjectGetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTi);
      if(StringFind(level_textEXT)<0)
        {
         level_text+=EXT;
         ObjectSetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTilevel_text);
        }
      
      //--- imprimimos no log o número do nível e seus dados - o valor do nível e seu preço
      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
   */
  }
//+------------------------------------------------------------------+
//| Cria o objeto gráfico Níveis de Fibonacci no gráfico especificado|
//+------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
  {
//--- desenharemos os Níveis de Fibonacci do maior para o menor dos valores de preço visíveis no gráfico, obtemos esses valores
   double   price_high=0price_low=0;
   datetime time_high =0time_low =0;
   
   if(!GetChartExtremums(chart_idprice_highprice_lowtime_hightime_low))
      return(false);
 
//--- construiremos o objeto "Níveis de Fibonacci" nas coordenadas de preço/tempo encontradas
   if(!ObjectCreate(chart_idOBJ_NAMEOBJ_FIBOWNDtime_highprice_hightime_lowprice_low))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
     
//--- tudo concluído com sucesso, atualizamos o gráfico e retornamos true
   ChartRedraw();
   return(true);
  }
//+------------------------------------------------------------------+
//| Retorna os preços máximo e mínimo no gráfico e seus tempos       |
//+------------------------------------------------------------------+
bool GetChartExtremums(const long chart_iddouble &price_highdouble &price_lowdatetime &time_highdatetime &time_low)
  {
//--- zeramos as variáveis
   price_high=price_low=0;
   time_high =time_low =0;
//--- símbolo do gráfico
   string symbol = ChartSymbol(chart_id);
 
//--- pelo número da primeira barra visível e pela quantidade de barras no gráfico calculamos o início do intervalo das séries temporais a copiar
   int first = (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR);
   int count = (int)ChartGetInteger(chart_idCHART_VISIBLE_BARS);
   int start = first+1-count;
   
//--- arrays para onde serão copiadas as séries temporais
   double   array_high[];
   double   array_low[];
   datetime array_time[];
   int      index;
   
//--- copiamos para os arrays três séries temporais na quantidade count e a partir de 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 o índice do preço máximo no array array_high
   index=ArrayMaximum(array_high);
   if(index<0)
     {
      PrintFormat("%s: ArrayMaximum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- guardamos o preço mais alto no gráfico visível e o valor do tempo da barra no qual esse preço se encontra
   price_high=array_high[index];
   time_high=array_time[index];
   
//--- buscamos o índice do preço mínimo no array array_low
   index=ArrayMinimum(array_low);
   if(index<0)
     {
      PrintFormat("%s: ArrayMinimum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- guardamos o menor preço no gráfico visível e o valor do tempo da barra na qual esse preço se encontra
   price_low=array_low[index];
   time_low=array_time[index];
   
//--- tudo concluído com sucesso
   return(true);
  }