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

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

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

Для них можно раздельно включить продолжение линии влево или вправо с помощью свойств 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 lengthconst double deviation = 1.0,
   const bool right = falseconst bool left = false,
   const color clr = clrRed)
{
   const string name = ObjNamePrefix + "Channel"
      + (right ? "R" : "") + (left ? "L" : "");
   // NB: 0-я точка привязки должна иметь более раннее время, чем 1-я,
   // иначе канал получится вырожденным
   ObjectCreate(0nameOBJ_STDDEVCHANNEL0iTime(NULL0length), 0);
   ObjectSetInteger(0nameOBJPROP_TIME1iTime(NULL00));
   // девиация
   ObjectSetDouble(0nameOBJPROP_DEVIATIONdeviation);
   // цвет и описание
   ObjectSetInteger(0nameOBJPROP_COLORclr);
   ObjectSetString(0nameOBJPROP_TEXTStringFormat("%2.1"deviation)
      + ((!right && !left) ? " NO RAYS" : "")
      + (right ? " RIGHT RAY" : "") + (left ? " LEFT RAY" : ""));
   // свойства лучей
   ObjectSetInteger(0nameOBJPROP_RAY_RIGHTright);
   ObjectSetInteger(0nameOBJPROP_RAY_LEFTleft);
   // подсвечиваем объекты путем выделения
   // (кроме того, так их проще удалить пользователю)
   ObjectSetInteger(0nameOBJPROP_SELECTABLEtrue);
   ObjectSetInteger(0nameOBJPROP_SELECTEDtrue);
}

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

void OnStart()
{
   SetupChannel(241.0true);
   SetupChannel(482.0falsetrueclrBlue);
   SetupChannel(363.0falsefalseclrGreen);
}

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

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

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

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