Координаты времени и цены

Для объектов тех типов, которые существуют в системе координат котировок, MQL5 API поддерживает пару свойств для указания привязки ко времени и ценам. В том случае, если у объекта несколько точек привязки, свойства требуют при вызове ObjectSet- и ObjectGet-функций указания параметра-модификатора, содержащего номер точки привязки.

Идентификатор

Описание

Тип значений

OBJPROP_TIME

Координата времени

datetime

OBJPROP_PRICE

Координата цены

double

Эти свойства доступны у абсолютно всех объектов, но их не имеет смысла устанавливать или читать у объектов с экранными координатами.

Для демонстрации работы с координатами разберем безбуферный индикатор ObjectHighLowChannel.mq5. Для заданного отрезка баров он проводит две трендовые линии. Их начальные и конечные точки на оси времени совпадают с первым и последним баром отрезка, а по оси цен значения считаются по разному для каждой из линий: для верхней берутся максимальная и минимальная цены High, а для нижней — максимальная и минимальная цены Low. По мере обновления графика, наш импровизированный канал должен двигаться вслед за ценами.

Диапазон баров задается с помощью двух входных переменных: номер начального бара BarOffset и количество баров BarCount. По умолчанию линии строятся на самых последних ценах, поскольку BarOffset = 0.

input int BarOffset = 0;
input int BarCount = 10;
   
const string Prefix = "HighLowChannel-";

Для объектов определен общий префикс имен "HighLowChannel-".

В обработчике OnCalculate мы отслеживаем появление новых баров по времени iTime 0-го бара. Как только бар формируется, производится анализ цен на заданном отрезке, берутся максимальные и минимальные значения цен каждого из двух типов (MODE_HIGH, MODE_LOW) и для них вызывается вспомогательная функция DrawFigure, где и происходит работа с объектами: создание и модификация координат.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
   static datetime now = 0;
   if(now != iTime(NULL00))
   {
      const int hh = iHighest(NULL0MODE_HIGHBarCountBarOffset);
      const int lh = iLowest(NULL0MODE_HIGHBarCountBarOffset);
      const int ll = iLowest(NULL0MODE_LOWBarCountBarOffset);
      const int hl = iHighest(NULL0MODE_LOWBarCountBarOffset);
   
      datetime t[2] = {iTime(NULL0BarOffset + BarCount), iTime(NULL0BarOffset)};
      double ph[2] = {iHigh(NULL0fmax(hhlh)), iHigh(NULL0fmin(hhlh))};
      double pl[2] = {iLow(NULL0fmax(llhl)), iLow(NULL0fmin(llhl))};
    
      DrawFigure(Prefix + "Highs"tphclrBlue);
      DrawFigure(Prefix + "Lows"tplclrRed);
   
      now = iTime(NULL00);
   }
   return rates_total;
}

А вот и сама функция DrawFigure.

bool DrawFigure(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   if(ArraySize(t) != ArraySize(p)) return false;
   
   ObjectCreate(0nameOBJ_TREND000);
   
   for(int i = 0i < ArraySize(t); ++i)
   {
      ObjectSetInteger(0nameOBJPROP_TIMEit[i]);
      ObjectSetDouble(0nameOBJPROP_PRICEip[i]);
   }
   
   ObjectSetInteger(0nameOBJPROP_COLORclr);
   return true;
}

После вызова ObjectCreate, который гарантирует наличие объекта, вызываются соответствующие ObjectSet-функции для OBJPROP_TIME и OBJPROP_PRICE во всех точках привязки (в данном случае, в двух).

На изображении ниже приведен результат работы индикатора.

Канал на двух трендовых линиях по ценам High и Low

Канал на двух трендовых линиях по ценам High и Low

Вы можете запустить индикатор в визуальном тестере, чтобы убедиться, как координаты линий меняются на лету.