ObjectGetDouble

Возвращает значение соответствующего свойства объекта. Свойство объекта должно быть типа double.  Существует 2 варианта функции.

1. Непосредственно возвращает значение свойства.

double  ObjectGetDouble(
   long                            chart_id,          // идентификатор графика
   string                          name,              // имя объекта
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // идентификатор свойства
   int                             prop_modifier=0    // модификатор свойства, если требуется
   );

2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром.

bool  ObjectGetDouble(
   long                            chart_id,          // идентификатор графика
   string                          name,              // имя объекта
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // идентификатор свойства
   int                             prop_modifier,     // модификатор свойства
   double&                         double_var         // сюда примем значение свойства
   );

Параметры

chart_id

[in]  Идентификатор графика. 0 означает текущий график.

name

[in]  Имя объекта.

prop_id

[in]  Идентификатор свойства объекта. Значение может быть одним из значений перечисления ENUM_OBJECT_PROPERTY_DOUBLE.

prop_modifier

[in]  Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

double_var

[out]  Переменная типа double, принимающая  значение запрашиваемого свойства.

Возвращаемое значение

Значение типа double для первого варианта вызова.

Для второго варианта вызова возвращает true, если данное свойство поддерживается и значение было помещено в переменную double_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду, если ведется работа с большим количеством объектов на графике.

Пример:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetDouble"   // Имя объекта
#define   WND        0                       // Подокно графика
#define   EXT        " (%$)"                 // Форматная строка для вывода значений цены на уровнях
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- идентификатор текущего графика, символ этого графика и Digits символа
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- строим графический объект "Уровни Фибоначчи" на максимальной и минимальной ценах видимого графика
   if(!CreateFibo(chart_id))
      return;
      
//--- количество уровней объекта
   int total=(int)ObjectGetInteger(chart_idOBJ_NAMEOBJPROP_LEVELS);
   double value =0;
   double price0=0;
   double price1=0;
   
//--- цены точек привязки
   price0=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE0);
   price1=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE1);
   
//--- в цикле по количеству уровней объекта 
   for(int i=0i<totali++)
     {
      //--- получаем значение, установленное для текущего уровня
      ResetLastError();
      if(!ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_LEVELVALUEivalue))
        {
         Print("ObjectGetDouble() failed. Error "GetLastError());
         return;
        }
      
      //--- получаем максимальную и минимальную цены привязки объекта и дистанцию между ними в значении цены
      double max=fmax(price0price1);
      double min=fmin(price0price1);
      double range=max-min;
      
      //--- рассчитаем значение цены для текущего уровня объекта
      double level_price=min+range*value;
      
      //--- установим цвет для уровня таким, чтобы он был видим на тёмнои и на светлом фоне графика
      ObjectSetInteger(chart_idOBJ_NAMEOBJPROP_LEVELCOLORiclrRed);
      
      //--- установим для уровня форматную строку, чтобы вместе со значением уровня выводилось и его ценовое значение
      string level_text=ObjectGetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTi);
      if(StringFind(level_textEXT)<0)
        {
         level_text+=EXT;
         ObjectSetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTilevel_text);
        }
      
      //--- распечатаем в журнале номер уровня и его данные - значение уровня и его цену
      PrintFormat("Fibo level [%d] value: %.3f,  price: %.*f"ivaluedigitslevel_price);
     }
   /*
   результат:
   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
   */
  }
//+------------------------------------------------------------------+
//| Создаёт графический объект Уровни Фибоначчи на указанном графике |
//+------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
  {
//--- уровни Фибоначчи будем рисовать от наибольшего к наименьшему видимым значениям цены на графике, получаем их
   double   price_high=0price_low=0;
   datetime time_high =0time_low =0;
   
   if(!GetChartExtremums(chart_idprice_highprice_lowtime_hightime_low))
      return(false);
 
//--- построим объект "Уровни Фибоначчи" на найденных координатах цены/времени
   if(!ObjectCreate(chart_idOBJ_NAMEOBJ_FIBOWNDtime_highprice_hightime_lowprice_low))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
     
//--- всё успешно - обновляем график и возвращаем true
   ChartRedraw();
   return(true);
  }
//+------------------------------------------------------------------+
//| Возвращает максимальную и минимальную цены на графике и их время |
//+------------------------------------------------------------------+
bool GetChartExtremums(const long chart_iddouble &price_highdouble &price_lowdatetime &time_highdatetime &time_low)
  {
//--- обнуляем переменные
   price_high=price_low=0;
   time_high =time_low =0;
//--- символ графика
   string symbol = ChartSymbol(chart_id);
 
//--- по номеру первого видимого бара и количеству баров на графике рассчитываем начало диапазона копируемых таймсерий
   int first = (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR);
   int count = (int)ChartGetInteger(chart_idCHART_VISIBLE_BARS);
   int start = first+1-count;
   
//--- массивы, куда будут скопированы таймсерии
   double   array_high[];
   double   array_low[];
   datetime array_time[];
   int      index;
   
//--- копируем в массивы три таймсерии в количестве count и начиная от 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);
     }
   
//--- ищем индекс максимальной цены в массиве array_high
   index=ArrayMaximum(array_high);
   if(index<0)
     {
      PrintFormat("%s: ArrayMaximum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- запомним наивысшую цену на видимом графике и значение времени бара, на которм находится эта цена
   price_high=array_high[index];
   time_high=array_time[index];
   
//--- ищем индекс минимальной цены в массиве array_low
   index=ArrayMinimum(array_low);
   if(index<0)
     {
      PrintFormat("%s: ArrayMinimum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- запомним наименьшую цену на видимом графике и значение времени бара, на которм находится эта цена
   price_low=array_low[index];
   time_low=array_time[index];
   
//--- всё успешно
   return(true);
  }