Перемещение объектов

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

bool ObjectMove(long chartId, const string name, int index, datetime time, double price)

Параметр chartId задает идентификатор графика (0 — текущий график). Имя объекта передается в параметре name. Номер точки привязки и координаты указываются в параметрах index, time и price, соответственно.

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

Функция возвращает признак того, была ли команда успешно поставлена в очередь (в этом случае результат равен true). О фактическом положении объекта следует узнавать с помощью вызовов ObjectGet-функций.

Модифицируем в индикаторе ObjectHighLowFibo.mq5 функцию DrawFibo таким образом, чтобы задействовать ObjectMove. Вместо двух вызовов ObjectSet-функций в цикле по точкам привязки теперь будет один вызов ObjectMove:

bool DrawFibo(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   ...
   for(int i = 0i < ArraySize(t); ++i)
   {
      // было:
      // ObjectSetInteger(0, name, OBJPROP_TIME, i, t[i]);
      // ObjectSetDouble(0, name, OBJPROP_PRICE, i, p[i]);
      // стало:
      ObjectMove(0nameit[i], p[i]);
   }
   ...
}

Функцию ObjectMove имеет смысл применять, где меняются обе координаты точки привязки. В некоторых случаях эффект имеет лишь одна координата (например, в каналах стандартного отклонения и линейной регрессии в точках привязки важны только начальная и конечная даты/время, а значение цен в этих точках каналы рассчитывают автоматически) — тогда единственный вызов ObjectSet-функции более уместен, чем ObjectMove.