Настройка уровней в объектах с их поддержкой

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

  • вилы Эндрюса OBJ_PITCHFORK,
  • инструменты Фибоначчи:
    • уровни OBJ_FIBO,
    • временные зоны OBJ_FIBOTIMES,
    • веер OBJ_FIBOFAN,
    • дуги OBJ_FIBOARC,
    • канал OBJ_FIBOCHANNEL,
    • расширение OBJ_EXPANSION.

Для них MQL5 позволяет задать свойства уровней — их количество, цвет, значения, надписи.

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

Описание

Тип

OBJPROP_LEVELS

Количество уровней

int

OBJPROP_LEVELCOLOR

Цвет линии-уровня

color

OBJPROP_LEVELSTYLE

Стиль линии-уровня

ENUM_LINE_STYLE

OBJPROP_LEVELWIDTH

Толщина линии-уровня

int

OBJPROP_LEVELTEXT

Описание уровня

string

OBJPROP_LEVELVALUE

Значение уровня

double

Для всех свойств кроме OBJPROP_LEVELS при вызове ObjectGet- и ObjectSet-функций требуется указание дополнительного параметра-модификатора с номером конкретного уровня.

В качестве примера рассмотрим индикатор ObjectHighLowFibo.mq5. Для заданного диапазона баров, который определяется как номер последнего бара (BarOffset) и количество баров (BarCount) слева от него, индикатор находит максимальную цену High и минимальную цену Low, после чего создает для этих точек объект OBJ_FIBO. По мере формирования новых баров уровни Фибоначчи будут сдвигаться вправо на более актуальные цены.

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
   
#include <MQL5Book/ColorMix.mqh>
   
input int BarOffset = 0;
input int BarCount = 24;
   
const string Prefix = "HighLowFibo-";
   
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
   static datetime now = 0;
   if(now != iTime(NULL, 0, 0))
   {
      const int hh = iHighest(NULL, 0, MODE_HIGH, BarCount, BarOffset);
      const int ll = iLowest(NULL, 0, MODE_LOW, BarCount, BarOffset);
   
      datetime t[2] = {iTime(NULL, 0, hh), iTime(NULL, 0, ll)};
      double p[2] = {iHigh(NULL, 0, hh), iLow(NULL, 0, ll)};
    
      DrawFibo(Prefix + "Fibo", t, p, clrGray);
   
      now = iTime(NULL, 0, 0);
   }
   return rates_total;
}

Непосредственная настройка объекта производится во вспомогательной функции DrawFibo. В ней, в частности, уровни раскрашиваются в радужные цвета, а их стиль и толщина определяются на основе того, являются ли соответствующие значения "круглыми" (без дробной части).

bool DrawFibo(const string name, const datetime &t[], const double &p[],
   const color clr)
{
   if(ArraySize(t) != ArraySize(p)) return false;
   
   ObjectCreate(0, name, OBJ_FIBO, 0, 0, 0);
   // точки привязки
   for(int i = 0; i < ArraySize(t); ++i)
   {
      ObjectSetInteger(0, name, OBJPROP_TIME, i, t[i]);
      ObjectSetDouble(0, name, OBJPROP_PRICE, i, p[i]);
   }
   // общие настройки
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, true);
   // настройки уровней
   const int n = (int)ObjectGetInteger(0, name, OBJPROP_LEVELS);
   for(int i = 0; i < n; ++i)
   {
      const color gradient = ColorMix::RotateColors(ColorMix::HSVtoRGB(0),
         ColorMix::HSVtoRGB(359), n, i);
      ObjectSetInteger(0, name, OBJPROP_LEVELCOLOR, i, gradient);
      const double level = ObjectGetDouble(0, name, OBJPROP_LEVELVALUE, i);
      if(level - (int)level > DBL_EPSILON * level)
      {
         ObjectSetInteger(0, name, OBJPROP_LEVELSTYLE, i, STYLE_DOT);
         ObjectSetInteger(0, name, OBJPROP_LEVELWIDTH, i, 1);
      }
      else
      {
         ObjectSetInteger(0, name, OBJPROP_LEVELSTYLE, i, STYLE_SOLID);
         ObjectSetInteger(0, name, OBJPROP_LEVELWIDTH, i, 2);
      }
   }
   
   return true;
}

Вот вариант того, что как может выглядеть объект на графике.

Объект Фибоначчи с настройками уровней

Объект Фибоначчи с настройками уровней