DRAW_COLOR_LINE

Стиль DRAW_COLOR_LINE является цветным вариантом стиля DRAW_LINE, он также рисует линию по значениям индикаторного буфера. Но у этого стиля, как у всех цветных стилей, имеющих в название COLOR, есть дополнительный специальный индикаторный буфер, который хранит индекс (номер) цвета  из специального заданного массива цветов. Таким образом, цвет каждого участка линии можно задать, если указать индекса цвета, которым линия должна рисоваться на данном баре.

Толщину, стиль и цвета для отображения линии можно задавать как директивами компилятора, так и динамически с помощью функции PlotIndexSetInteger(). Динамическое изменение свойств графического построения позволяет создавать "живые" индикаторы, которые меняют свой вид в зависимости от  текущей ситуации.

Количество требуемых буферов для построения DRAW_COLOR_LINE — 2:

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

Цвета можно задавать директивой компилятора #property indicator_color1 через запятую. Количество цветов не может превышать 64.

//--- зададим 5 цветов для раскраски каждого бара (они хранятся в специальном массиве)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (можно указать до 64 цветов)

Пример индикатора, рисующего линию по ценам закрытия баров Close. Толщина и стиль линии меняются случайным образом каждые N=5 тиков.

Пример стиля DRAW_COLOR_LINE

Цвета, которыми рисуются участки линии, также меняются случайным образом в пользовательской функции ChangeColors().

//+------------------------------------------------------------------+
//| Изменяет цвет участков линии                                     |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- количество цветов 
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- для каждого цветового индекса зададим новый цвет случайным образом
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- получим случайное число
      int number=MathRand();
      //--- получим индекс в массиве col[] как остаток от целочисленного деления
      int i=number%size;
      //--- установим цвет для каждого индекса как свойство PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  номер графического стиля
                          PLOT_LINE_COLOR,      //  идентификатор свойства
                          plot_color_ind,       //  индекс цвета, куда запишем цвет
                          cols[i]);             //  новый цвет
      //--- запишем цвета
      comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }

В примере показана особенность "цветных" версий индикаторов – для смены цвета участка линии не требуется менять значения в буфере ColorLineColors[] (который содержит индексы цветов). Достаточно задать новые цвета в специальном массиве. Это позволяет быстро поменять цвет сразу для всего графического построения, изменяя только небольшой массив цветов с помощью функции PlotIndexSetInteger().

Обратите внимание, первоначально для графического построения plot1 со стилем DRAW_COLOR_LINE свойства задаются с помощью директивы компилятора #property, а затем в функции OnCalculate() эти три свойства задаются случайным образом.

Параметры N и Length (длина цветных участков в барах) вынесены во внешние параметры индикатора для возможности ручной установки (закладка "Параметры" в окне свойств индикатора).

//+------------------------------------------------------------------+
//|                                              DRAW_COLOR_LINE.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "Индикатор для демонстрации DRAW_COLOR_LINE"
#property description "Рисует цветными кусками по 20 баров линию по ценам Close"
#property description "Толщина,стиль и цвет участков линии меняется случайным"
#property description "образом через каждые N тиков"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_COLOR_LINE
//--- зададим 5 цветов для раскраски каждого бара (они хранятся в специальном массиве)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (можно указать до 64 цветов)
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input параметры
input int      N=5;           // кол-во тиков для изменения 
input int      Length=20;     // длина каждого участка цвета в барах
int            line_colors=5; // количество заданных цветов равно 5 - смотри  выше #property indicator_color1
//--- буфер для отрисовки
double         ColorLineBuffer[];
//--- буфер для хранения цвета отрисовки линии на каждом баре
double         ColorLineColors[];
 
//--- массив для хранения цветов содержит 7 элементов
color colors[]={clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod};
//--- массив для хранения стилей отрисовки линии
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- связывание массива и индикаторного буфера
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//--- инициализация генератора псевдослучайных чисел
   MathSrand(GetTickCount());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int ticks=0;
//--- считаем тики для изменения стиля, цвета и толщины линии
   ticks++;
//--- если накопилось критическое число тиков
   if(ticks>=N)
     {
      //--- меняем свойства линии
      ChangeLineAppearance();
      //--- меняем цвета, которыми рисуются цветные участки линии
      ChangeColors(colors,5);
      //--- сбрасываем счетчик тиков в ноль
      ticks=0;
     }
 
//--- блок расчета значений индикатора
   for(int i=0;i<rates_total;i++)
     {
      //--- запишем значение индикатора в буфер
      ColorLineBuffer[i]=close[i];
      //--- теперь случайным образом зададим для этого бара  индекс цвета
      int color_index=i%(5*Length);
      color_index=color_index/Length;
      //--- для этого бара линия будет рисоваться цветом, который хранится под номером color_index
      ColorLineColors[i]=color_index;
     }
 
//--- вернем значение prev_calculated для следующего вызова функции
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Изменяет цвет участков линии                                     |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- количество цветов 
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- для каждого цветового индекса зададим новый цвет случайным образом
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- получим случайное число
      int number=MathRand();
      //--- получим индекс в массиве col[] как остаток от целочисленного деления
      int i=number%size;
      //--- установим цвет для каждого индекса как свойство PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  номер графического стиля
                          PLOT_LINE_COLOR,      //  идентификатор свойства
                          plot_color_ind,       //  индекс цвета, куда запишем цвет
                          cols[i]);             //  новый цвет
      //--- запишем цвета
      comm=comm+StringFormat("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Изменяет внешний вид отображаемой линии в индикаторе             |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- строка для формирования информации о свойствах линии
   string comm="";
//--- блок изменения толщины линии
   int number=MathRand();
//--- получим толщину как остаток от целочисленного деления
   int width=number%5; // толщина задается от о до 4
//--- установим цвет как свойство PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- запишем толщину линии
   comm=comm+" Width="+IntegerToString(width);
 
//--- блок изменения стиля линии
   number=MathRand();
//--- делитель числа равен размеру массива styles
   int size=ArraySize(styles);
//--- получим индекс для выбора нового стиля как остаток от целочисленного деления
   int style_index=number%size;
//--- установим цвет как свойство PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- запишем стиль линии
   comm=EnumToString(styles[style_index])+", "+comm;
//--- выведем информацию на график через комментарий
   Comment(comm);
  }