Свойства лучей для объектов с прямыми линиями

Среди графических объектов есть несколько типов, в которых линии между точками привязки могут отображаться либо в виде отрезков (то есть строго между парой точек) либо как бесконечные прямые линии, продолжающиеся в ту или иную сторону по всей области видимости окна. К подобным объектам относятся:

  • трендовая линия,
  • трендовая линия по углу,
  • все типы каналов (равноудаленный, стандартных отклонений, регрессии, вилы Эндрюса),
  • линия Ганна,
  • линии Фибоначчи,
  • канал Фибоначчи,
  • расширение Фибоначчи.

Для них можно раздельно включить продолжение линии влево или вправо с помощью свойств OBJPROP_RAY_LEFT и OBJPROP_RAY_RIGHT, соответственно. Кроме того, для вертикальной линии можно указать, следует ли её рисовать по всем подокнам графика или только по текущему (где находится точка привязки): за это отвечает свойство OBJPROP_RAY. Все свойства являются логическими, то есть могут быть включены (true) или выключены (false).

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

Описание

OBJPROP_RAY_LEFT

Луч продолжается влево

OBJPROP_RAY_RIGHT

Луч продолжается вправо

OBJPROP_RAY

Вертикальная линия продолжается на все окна графика

Проверить работу лучей можно с помощью скрипта ObjectRays.mq5. Он создает 3 канала стандартных отклонений с различными настройками лучей.

Один конкретный объект создает и настраивает вспомогательная функция SetupChannel. Через её параметры задается длина канала в барах и ширина канала (девиация), а также опции показа лучей влево и вправо, и цвет.

#include "ObjectPrefix.mqh"
   
void SetupChannel(const int length, const double deviation = 1.0,
   const bool right = false, const bool left = false,
   const color clr = clrRed)
{
   const string name = ObjNamePrefix + "Channel"
      + (right ? "R" : "") + (left ? "L" : "");
   // NB: 0-я точка привязки должна иметь более раннее время, чем 1-я,
   // иначе канал получится вырожденным
   ObjectCreate(0, name, OBJ_STDDEVCHANNEL, 0, iTime(NULL, 0, length), 0);
   ObjectSetInteger(0, name, OBJPROP_TIME, 1, iTime(NULL, 0, 0));
   // девиация
   ObjectSetDouble(0, name, OBJPROP_DEVIATION, deviation);
   // цвет и описание
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetString(0, name, OBJPROP_TEXT, StringFormat("%2.1", deviation)
      + ((!right && !left) ? " NO RAYS" : "")
      + (right ? " RIGHT RAY" : "") + (left ? " LEFT RAY" : ""));
   // свойства лучей
   ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, right);
   ObjectSetInteger(0, name, OBJPROP_RAY_LEFT, left);
   // подсвечиваем объекты путем выделения
   // (кроме того, так их проще удалить пользователю)
   ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true);
   ObjectSetInteger(0, name, OBJPROP_SELECTED, true);
}

В функции OnStart вызываем SetupChannel для 3-х разных каналов.

void OnStart()
{
   SetupChannel(24, 1.0, true);
   SetupChannel(48, 2.0, false, true, clrBlue);
   SetupChannel(36, 3.0, false, false, clrGreen);
}

В результате получим график примерно следующего вида.

Каналы с различными настройками свойств OBJPROP_RAY_LEFT и OBJPROP_RAY_RIGHT

Каналы с различными настройками свойств OBJPROP_RAY_LEFT и OBJPROP_RAY_RIGHT

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