DRAW_HISTOGRAM

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

Так как  на каждом баре рисуется столбик от нулевого уровня, то DRAW_HISTOGRAM лучше использовать для отображения в отдельном подокне графика. Чаще всего этот тип графического построения используется для создания индикаторов осцилляторного типа, например, Bears Power  или OsMA. Для пустых неотображаемых значений достаточно указывать нулевое значение.

Количество требуемых буферов для построения DRAW_HISTOGRAM — 1.

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

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

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

//+------------------------------------------------------------------+
//|                                               DRAW_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_HISTOGRAM"
#property description "Рисует синусоиду гистограммой в отдельном окне"
#property description "Цвет и толщина столбиков меняется случайным образом"
#property description "через каждые N тиков"
#property description "Параметр bars задает количество баров в цикле синусоиды"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Histogram
#property indicator_label1  "Histogram"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input параметры
input int      bars=30;          // период синусоиды в барах
input int      N=5;              // кол-во тиков для изменения гистограммы
//--- indicator buffers
double         HistogramBuffer[];
//--- множитель для получения угла 2Pi в радианах при умножении на параметр bars
double    multiplier;
//--- массив для хранения цветов
color colors[]={clrRed,clrBlue,clrGreen};
//--- массив для хранения стилей отрисовки линии
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,HistogramBuffer,INDICATOR_DATA);
//--- вычислим множитель
   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();
      //--- сбрасываем счетчик тиков в ноль
      ticks=0;
     }
 
//--- вычисления значений индикатора
   int start=0;
//--- если расчет уже производился на предыдущем запуске OnCalculate
   if(prev_calculated>0) start=prev_calculated-1; // установим начало расчетов с предпоследнего бара
//--- заполняем индикаторный буфер значениями
   for(int i=start;i<rates_total;i++)
     {
      HistogramBuffer[i]=sin(i*multiplier);
     }
//--- вернем значение prev_calculated для следующего вызова функции
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Изменяет внешний вид линий в индикаторе                          |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- строка для формирования информации о свойствах линии
   string comm="";
//--- блок изменения цвета линии
   int number=MathRand(); // получим случайное число
//--- делитель числа равен размеру массива colors[]
   int size=ArraySize(colors);
//--- получим индекс для выбора нового цвета как остаток от целочисленного деления
   int color_index=number%size;
//--- установим цвет как свойство PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- запишем цвет линии
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- блок изменения толщины линии
   number=MathRand();
//--- получим толщину как остаток от целочисленного деления
   int width=number%5;   // толщина задается от о до 4
//--- установим толщину
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- запишем толщину линии
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- блок изменения стиля линии
   number=MathRand();
//--- делитель числа равен размеру массива styles
   size=ArraySize(styles);
//--- получим индекс для выбора нового стиля как остаток от целочисленного деления
   int style_index=number%size;
//--- установим стиль линий
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- запишем стиль линии
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- выведем информацию на график через комментарий
   Comment(comm);
  }