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

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

  • вилы Эндрюса 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(NULL00))
   {
      const int hh = iHighest(NULL0MODE_HIGHBarCountBarOffset);
      const int ll = iLowest(NULL0MODE_LOWBarCountBarOffset);
   
      datetime t[2] = {iTime(NULL0hh), iTime(NULL0ll)};
      double p[2] = {iHigh(NULL0hh), iLow(NULL0ll)};
    
      DrawFibo(Prefix + "Fibo"tpclrGray);
   
      now = iTime(NULL00);
   }
   return rates_total;
}

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

bool DrawFibo(const string nameconst datetime &t[], const double &p[],
   const color clr)
{
   if(ArraySize(t) != ArraySize(p)) return false;
   
   ObjectCreate(0nameOBJ_FIBO000);
   // точки привязки
   for(int i = 0i < ArraySize(t); ++i)
   {
      ObjectSetInteger(0nameOBJPROP_TIMEit[i]);
      ObjectSetDouble(0nameOBJPROP_PRICEip[i]);
   }
   // общие настройки
   ObjectSetInteger(0nameOBJPROP_COLORclr);
   ObjectSetInteger(0nameOBJPROP_RAY_RIGHTtrue);
   // настройки уровней
   const int n = (int)ObjectGetInteger(0nameOBJPROP_LEVELS);
   for(int i = 0i < n; ++i)
   {
      const color gradient = ColorMix::RotateColors(ColorMix::HSVtoRGB(0),
         ColorMix::HSVtoRGB(359), ni);
      ObjectSetInteger(0nameOBJPROP_LEVELCOLORigradient);
      const double level = ObjectGetDouble(0nameOBJPROP_LEVELVALUEi);
      if(level - (int)level > DBL_EPSILON * level)
      {
         ObjectSetInteger(0nameOBJPROP_LEVELSTYLEiSTYLE_DOT);
         ObjectSetInteger(0nameOBJPROP_LEVELWIDTHi1);
      }
      else
      {
         ObjectSetInteger(0nameOBJPROP_LEVELSTYLEiSTYLE_SOLID);
         ObjectSetInteger(0nameOBJPROP_LEVELWIDTHi2);
      }
   }
   
   return true;
}

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

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

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