DRAW_COLOR_HISTOGRAM

Стиль DRAW_COLOR_HISTOGRAM рисует гистограмму цветными столбиками от нуля до указанного значения. Значения берутся из индикаторного буфера. Каждый столбик может иметь свой собственный цвет из заранее предопределенного набора цветов.

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

Так как  на каждом баре рисуется столбик от нулевого уровня, то DRAW_COLOR_HISTOGRAM лучше использовать для отображения в отдельном подокне графика. Чаще всего этот тип графического построения используется для создания индикаторов осцилляторного типа, например, Awesome Oscillator  или Market Facilitation Index. Для пустых неотображаемых значений достаточно указывать нулевое значение.

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

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

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

Пример индикатора, рисующего заданным цветом синусоиду по функции MathSin().  Цвет, толщина и стиль всех столбиков гистограммы меняются случайным образом каждые N тиков. Параметр bars задает период синусоиды, то есть через заданное количество баров синусоида будет повторяться по циклу.

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

Обратите внимание, что первоначально для графического построения plot1 со стилем DRAW_COLOR_HISTOGRAM задается 5 цветов с помощью директивы компилятора #property indicator_color1, а затем в функции OnCalculate() эти цвета выбираются случайным образом из 14 цветов, хранящихся в массиве colors[]. Параметр N вынесен во внешние параметры индикатора для возможности ручной установки (закладка "Параметры" в окне свойств индикатора).

//+------------------------------------------------------------------+
//|                                         DRAW_COLOR_HISTOGRAM.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_HISTOGRAM"
#property description "Рисует синусоиду гистограммой в отдельном окне"
#property description "Цвет и толщина столбиков меняется случайным образом"
#property description "через каждые N тиков"
#property description "Параметр bars задает количество баров для повторяемости синусоиды"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- input параметры
input int      bars=30;          // период синусоиды в барах
input int      N=5;              // кол-во тиков для изменения гистограммы
//--- plot Color_Histogram
#property indicator_label1  "Color_Histogram"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
//--- зададим 8 цветов для раскраски секций (они хранятся в специальном массиве)
#property indicator_color1  clrRed,clrGreen,clrBlue,clrYellow,clrMagenta,clrCyan,clrMediumSeaGreen,clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- буфер значений
double         Color_HistogramBuffer[];
//--- буфер индексов цветов
double         Color_HistogramColors[];
//--- множитель для получения угла 2Pi в радианах при умножении на параметр bars
double         multiplier;
int            color_sections;
//--- массив для хранения цветов содержит 14 элементов
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- массив для хранения стилей отрисовки линии
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Color_HistogramBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,Color_HistogramColors,INDICATOR_COLOR_INDEX);
//---- количество цветов для раскраски синусоиды
   color_sections=8;   //  см. комментарий к свойству #property indicator_color1   
//--- вычислим множитель
   if(bars>1)multiplier=2.*M_PI/bars;
   else
     {
      PrintFormat("Задайте значение bars=%d больше 1",bars);
      //--- досрочное прекращение работы индикатора
      return(INIT_PARAMETERS_INCORRECT);
     }   
//---
   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,color_sections);      
      //--- сбрасываем счетчик тиков в ноль
      ticks=0;
     }
 
//--- вычисления значений индикатора
   int start=0;
//--- если расчет уже производился на предыдущем запуске OnCalculate
   if(prev_calculated>0) start=prev_calculated-1; // установим начало расчетов с предпоследнего бара
//--- заполняем индикаторный буфер значениями
   for(int i=start;i<rates_total;i++)
     {
      //--- значение
      Color_HistogramBuffer[i]=sin(i*multiplier);
      //--- цвет
      int color_index=i%(bars*color_sections);
      color_index/=bars;
      Color_HistogramColors[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("HistogramColorIndex[%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);
  }