ObjectGetValueByTime

Возвращает значение цены для указанного времени указанного объекта.

double  ObjectGetValueByTime(
   long      chart_id,     // идентификатор графика
   string    name,         // имя объекта
   datetime  time,         // время
   int       line_id       // номер линии
   );

Параметры

chart_id

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

name

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

time

[in]  Значение времени.

line_id

[in]  Идентификатор линии.

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

Значение цены для указанного времени указанного объекта.

Примечание

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

Так как объект в одной координате цены может иметь несколько значений, то необходимо указать номер линии. Эта функция применима только для следующих объектов:

  • Трендовая линия (OBJ_TREND)
  • Трендовая линия по углу (OBJ_TRENDBYANGLE)
  • Линия Ганна (OBJ_GANNLINE)
  • Равноудаленный канал (OBJ_CHANNEL) - 2 линии
  • Канал на линейной регрессии (OBJ_REGRESSION) - 3 линии
  • Канал стандартного отклонения (OBJ_STDDEVCHANNEL) - 3 линии
  • Линия со стрелкой (OBJ_ARROWED_LINE)

 

Пример:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetValueByTime" // имя графического объекта
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- идентификатор графика, символ
   long   chart_id=ChartID();
   string symbol=ChartSymbol(chart_id);
 
   long bar1=0, bar2=0, visible=0;
//--- получаем первый видимый слева бар графика
   ResetLastError();
   if(!ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR, 0, bar1))
     {
      Print("ChartGetInteger() failed. Error ", GetLastError());
      return;
     }
//--- количество видимых баров на графике
   if(!ChartGetInteger(chart_id, CHART_VISIBLE_BARS, 0, visible))
     {
      Print("ChartGetInteger() failed. Error ", GetLastError());
      return;
     }
 
//--- корректируем полученные значения и рассчитываем индекс первого видимого справа бара
   bar1-=1;
   visible-=2;
   bar2=bar1-visible;
 
//--- строим равноудалённый канал от High левого видимого бара до Low правого
   if(!CreateChannel(chart_id, (int)bar1, (int)bar2))
      return;
   
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   
//--- в цикле от левого видимого бара до правого видимого бара на графике
//--- получаем значение цены для времени бара цикла каждой линии равноудалённого канала.
//--- полученную цену для каждой линии выводим в журнал
   for(int i=(int)bar1; i>=bar2 && !IsStopped(); i--)
     {
      datetime time=GetTime(symbol, i);
      if(time==0)
         continue;
      
      string time_str=TimeToString(time);
      double value0=ObjectGetValueByTime(chart_id, OBJ_NAME, time, 0);
      double value1=ObjectGetValueByTime(chart_id, OBJ_NAME, time, 1);
      string idx=StringFormat("%03d", i);
      PrintFormat("[%s] For time %s the price value at 0 line of the object: %.*f, at line 1: %.*f",
                  idx, TimeToString(time), digits, value0, digits, value1);
     }
   
//--- подождём 5 секунд и почистим за собой
   Sleep(5000);
   ObjectDelete(chart_id, OBJ_NAME);
   ChartRedraw(chart_id);
   /*
   результат:
   [114] For time 2025.01.02 05:00 the price value at 0 line of the object: 1.03732, at line 1: 1.03393
   [113] For time 2025.01.02 05:30 the price value at 0 line of the object: 1.03694, at line 1: 1.03355
   [112] For time 2025.01.02 06:00 the price value at 0 line of the object: 1.03657, at line 1: 1.03318
   [111] For time 2025.01.02 06:30 the price value at 0 line of the object: 1.03619, at line 1: 1.03280
   [110] For time 2025.01.02 07:00 the price value at 0 line of the object: 1.03581, at line 1: 1.03242
   [109] For time 2025.01.02 07:30 the price value at 0 line of the object: 1.03544, at line 1: 1.03205
   [108] For time 2025.01.02 08:00 the price value at 0 line of the object: 1.03506, at line 1: 1.03167
   [107] For time 2025.01.02 08:30 the price value at 0 line of the object: 1.03468, at line 1: 1.03129
   [106] For time 2025.01.02 09:00 the price value at 0 line of the object: 1.03431, at line 1: 1.03092
   [105] For time 2025.01.02 09:30 the price value at 0 line of the object: 1.03393, at line 1: 1.03054
   [104] For time 2025.01.02 10:00 the price value at 0 line of the object: 1.03355, at line 1: 1.03016
   [103] For time 2025.01.02 10:30 the price value at 0 line of the object: 1.03318, at line 1: 1.02979
   [102] For time 2025.01.02 11:00 the price value at 0 line of the object: 1.03280, at line 1: 1.02941
   [101] For time 2025.01.02 11:30 the price value at 0 line of the object: 1.03242, at line 1: 1.02903
   [100] For time 2025.01.02 12:00 the price value at 0 line of the object: 1.03205, at line 1: 1.02866
   [099] For time 2025.01.02 12:30 the price value at 0 line of the object: 1.03167, at line 1: 1.02828
   [098] For time 2025.01.02 13:00 the price value at 0 line of the object: 1.03129, at line 1: 1.02790
   [097] For time 2025.01.02 13:30 the price value at 0 line of the object: 1.03092, at line 1: 1.02753
   [096] For time 2025.01.02 14:00 the price value at 0 line of the object: 1.03054, at line 1: 1.02715
   [095] For time 2025.01.02 14:30 the price value at 0 line of the object: 1.03016, at line 1: 1.02677
   [094] For time 2025.01.02 15:00 the price value at 0 line of the object: 1.02979, at line 1: 1.02640
   [093] For time 2025.01.02 15:30 the price value at 0 line of the object: 1.02941, at line 1: 1.02602
   [092] For time 2025.01.02 16:00 the price value at 0 line of the object: 1.02903, at line 1: 1.02564
   [091] For time 2025.01.02 16:30 the price value at 0 line of the object: 1.02866, at line 1: 1.02527
   [090] For time 2025.01.02 17:00 the price value at 0 line of the object: 1.02828, at line 1: 1.02489
   [089] For time 2025.01.02 17:30 the price value at 0 line of the object: 1.02790, at line 1: 1.02451
   [088] For time 2025.01.02 18:00 the price value at 0 line of the object: 1.02753, at line 1: 1.02414
   [087] For time 2025.01.02 18:30 the price value at 0 line of the object: 1.02715, at line 1: 1.02376
   [086] For time 2025.01.02 19:00 the price value at 0 line of the object: 1.02677, at line 1: 1.02338
   [085] For time 2025.01.02 19:30 the price value at 0 line of the object: 1.02640, at line 1: 1.02301
   [084] For time 2025.01.02 20:00 the price value at 0 line of the object: 1.02602, at line 1: 1.02263
   */
  }
//+------------------------------------------------------------------+
//| Возвращает время указанного по индексу бара                      |
//+------------------------------------------------------------------+
datetime GetTime(const string symbol_name, const int index)
  {
   if(index<0)
      return(0);
   datetime array[1];
   ResetLastError();
   if(CopyTime(symbol_name, PERIOD_CURRENT, index, 1, array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
      return(0);
     }
   return(array[0]);
  }
//+------------------------------------------------------------------+
//| Строит равноудалённый канал от High левого бара до Low правого   |
//+------------------------------------------------------------------+
bool CreateChannel(const long chart_id, const int bar1, const int bar2)
  {
   long     visible=0;
   datetime time1 =0, time2 =0;
   double   price1=0, price2=0;
 
//--- символ графика
   string symbol=ChartSymbol(chart_id);
   
//--- получаем время первого видимого слева бара графика
   ResetLastError();
   datetime time_array[1];
   if(CopyTime(symbol, PERIOD_CURRENT, (int)bar1, 1, time_array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   time1=time_array[0];
   
//--- получаем время первого видимого справа бара графика
   if(CopyTime(symbol, PERIOD_CURRENT, (int)bar2, 1, time_array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   time2=time_array[0];
   
//--- получаем цену High первого видимого слева бара графика
   double price_array[];
   if(CopyHigh(symbol, PERIOD_CURRENT, (int)bar1, 1, price_array)!=1)
     {
      PrintFormat("%s: CopyHigh() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   price1=price_array[0];
   
//--- получаем цену Low первого видимого справа бара графика
   if(CopyLow(symbol, PERIOD_CURRENT, (int)bar2, 1, price_array)!=1)
     {
      PrintFormat("%s: CopyLow() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
   price2=price_array[0];
   
//--- рассчитываем диапазон цен графика в пунктах
//--- для равноудалённого канала дистанция второй линии будет 1/3 от диапазона цен
   double range=price1-price2;
   double distance=range*0.3;
   
//--- на рассчитанных координатах создаём графический объект-равноудалённый канал
   if(!ObjectCreate(chart_id, OBJ_NAME, OBJ_CHANNEL, 0, time1, price1, time2, price2, time1, price1-distance))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__, GetLastError());
      return(false);
     }
     
//--- обновим график и вернём true
   ChartRedraw(chart_id);
   return(true);
  }

Смотри также

Типы объектов