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_id= ChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   
//--- строим графический объект "Уровни Фибоначчи" на максимальной и минимальной ценах видимого графика
   if(!CreateFibo(chart_id))
      return;
      
//--- количество уровней объекта
   int total=(int)ObjectGetInteger(chart_id, OBJ_NAME, OBJPROP_LEVELS);
   double value =0;
   double price0=0;
   double price1=0;
   
//--- цены точек привязки
   price0=ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_PRICE, 0);
   price1=ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_PRICE, 1);
   
//--- в цикле по количеству уровней объекта 
   for(int i=0; i<total; i++)
     {
      //--- получаем значение, установленное для текущего уровня
      ResetLastError();
      if(!ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_LEVELVALUE, i, value))
        {
         Print("ObjectGetDouble() failed. Error ", GetLastError());
         return;
        }
      
      //--- получаем максимальную и минимальную цены привязки объекта и дистанцию между ними в значении цены
      double max=fmax(price0, price1);
      double min=fmin(price0, price1);
      double range=max-min;
      
      //--- рассчитаем значение цены для текущего уровня объекта
      double level_price=min+range*value;
      
      //--- установим цвет для уровня таким, чтобы он был видим на тёмнои и на светлом фоне графика
      ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_LEVELCOLOR, i, clrRed);
      
      //--- установим для уровня форматную строку, чтобы вместе со значением уровня выводилось и его ценовое значение
      string level_text=ObjectGetString(chart_id, OBJ_NAME, OBJPROP_LEVELTEXT, i);
      if(StringFind(level_text, EXT)<0)
        {
         level_text+=EXT;
         ObjectSetString(chart_id, OBJ_NAME, OBJPROP_LEVELTEXT, i, level_text);
        }
      
      //--- распечатаем в журнале номер уровня и его данные - значение уровня и его цену
      PrintFormat("Fibo level [%d] value: %.3f,  price: %.*f", i, value, digits, level_price);
     }
   /*
   результат:
   Fibo level [0] value: 0.000,  price: 0.61989
   Fibo level [1] value: 0.236,  price: 0.62533
   Fibo level [2] value: 0.382,  price: 0.62869
   Fibo level [3] value: 0.500,  price: 0.63140
   Fibo level [4] value: 0.618,  price: 0.63412
   Fibo level [5] value: 1.000,  price: 0.64292
   Fibo level [6] value: 1.618,  price: 0.65715
   Fibo level [7] value: 2.618,  price: 0.68018
   Fibo level [8] value: 4.236,  price: 0.71745
   */
  }
//+------------------------------------------------------------------+
//| Создаёт графический объект Уровни Фибоначчи на указанном графике |
//+------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
  {
//--- уровни Фибоначчи будем рисовать от наибольшего к наименьшему видимым значениям цены на графике, получаем их
   double   price_high=0, price_low=0;
   datetime time_high =0, time_low =0;
   
   if(!GetChartExtremums(chart_id, price_high, price_low, time_high, time_low))
      return(false);
 
//--- построим объект "Уровни Фибоначчи" на найденных координатах цены/времени
   if(!ObjectCreate(chart_id, OBJ_NAME, OBJ_FIBO, WND, time_high, price_high, time_low, price_low))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
     
//--- всё успешно - обновляем график и возвращаем true
   ChartRedraw();
   return(true);
  }
//+------------------------------------------------------------------+
//| Возвращает максимальную и минимальную цены на графике и их время |
//+------------------------------------------------------------------+
bool GetChartExtremums(const long chart_id, double &price_high, double &price_low, datetime &time_high, datetime &time_low)
  {
//--- обнуляем переменные
   price_high=price_low=0;
   time_high =time_low =0;
//--- символ графика
   string symbol = ChartSymbol(chart_id);
 
//--- по номеру первого видимого бара и количеству баров на графике рассчитываем начало диапазона копируемых таймсерий
   int first = (int)ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR);
   int count = (int)ChartGetInteger(chart_id, CHART_VISIBLE_BARS);
   int start = first+1-count;
   
//--- массивы, куда будут скопированы таймсерии
   double   array_high[];
   double   array_low[];
   datetime array_time[];
   int      index;
   
//--- копируем в массивы три таймсерии в количестве count и начиная от start
   ResetLastError();
   if(CopySeries(symbol, PERIOD_CURRENT, start, count, COPY_RATES_TIME|COPY_RATES_HIGH|COPY_RATES_LOW, array_time, array_high, array_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);
  }