DRAW_COLOR_HISTOGRAM

Le style DRAW_COLOR_HISTOGRAM dessine l'histogramme par les colonnes du zéro jusqu'à la valeur indiquée. Les valeurs sont tirées du tampon de l'indicateur. Chaque colonne peut avoir sa propre couleur de l'ensemble des couleurs d'avance prédéterminé.

n peut spécifier l'épaisseur, la couleur et le style du histogramme comme pour le style DRAW_HISTOGRAMpar les directives du compilateur ou dynamiquement à l'aide de la fonction PlotIndexSetInteger(). Le changement dynamique des propriétés de la construction graphique permet de changer l'aspect de l'histogramme en fonction de la situation actuelle.

Puisque sur chaque barre se dessine la colonne du niveau nul, alors il est mieux d'utiliser DRAW_COLOR_HISTOGRAM pour l'affichage dans une sous- fenêtre séparée du graphique. Le plus souvent ce type de la construction graphique est utilisé pour la création des indicateurs du type d'oscillateur, par exemple, Awesome Oscillator ou Market Facilitation Index. Il suffit de spécifier la valeur nulle pour les valeurs vides non affichées.

Le nombre de tampons nécessaires pour la construction DRAW_COLOR_HISTOGRAM – 2:

  • un tampon pour stocker de la valeur non nulle du segment vertical sur chaque barre, la deuxième fin du segment se trouve toujours sur la ligne zéro de l'indicateur;
  • un tampon pour stocker l'index de la couleur, par lequel la section est dessinée (il faut spécifier seulement pour les valeurs non vides).

On peut spécifier les couleurs par la directive du compilateur #property indicator_color1 par la virgule. Le nombre de couleurs ne peut pas dépasser 64.

L'exemple de l'indicateur, dessinant la sinusoïde selon la fonctionMathSin()par la couleur spécifiée.  La couleur, l'épaisseur et le style detoutes colonnes de l'histogramme se changent chaques N ticks par hasard. Le paramètre "bars" spécifie la période de la sinusoïde, c'est-à-dire dans le nombre spécifié de barres la sinusoïde se répétera selon la boucle.

L'exemple du style DRAW_COLOR_HISTOGRAM

Pretez attention que primordialement pour la construction graphique plot1 avec le style DRAW_COLOR_HISTOGRAM on spécifie 5 couleurs à l'aide de la directive du compilateur#property indicator_color1, et puis dans la fonction OnCalculate() les couleurs sont choisies par hasard parmi 14 couleurs stockées dans le tableau colors[]. Le paramètre N est sorti dans les paramètres extérieurs de l'indicateur pour la possibilité de l'installation manuelle (l'onglet "Paramètres" dans la fenêtre des propriétés de l'indicateur).

//+------------------------------------------------------------------+
//|                                         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 "L'indicateur pour la démonstration DRAW_COLOR_HISTOGRAM"
#property description "Dessine la sinusoïde par l'histogramme dans la fenêtre séparée"
#property description "La couleur, l'épaisseur des colonnes se changent par hasard"
#property description "dans chaques N ticks"
#property description "Le paramètre "bars" spécifie le nombre de barres dans la boucle de la sinusoïde"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- les paramètres input
input int      bars=30;          // la période de la sinusoïde dans les barres
input int      N=5;              // le nombre de ticks pour le changement de l'histogramme
//--- plot Color_Histogram
#property indicator_label1  "Color_Histogram"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
//--- spécifions 8 couleurs pour colorer les sections (ils se trouvent dans un tableau spécial)
#property indicator_color1  clrRed,clrGreen,clrBlue,clrYellow,clrMagenta,clrCyan,clrMediumSeaGreen,clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- le tampon des valeurs
double         Color_HistogramBuffer[];
//--- le tampon des index de la couleur
double         Color_HistogramColors[];
//--- le multiplicateur pour la réception de l'angle 2Pi dans les radians à la multiplication par le paramètre "bars"
double         multiplier;
int            color_sections;
//--- le tableau pour le stockage des couleurs contient 14 éléments
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- le tableau pour le stockage des styles du dessin de la ligne
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);
//---- le nombre de couleurs pour colorier la sinusoïde
   color_sections=8;   //  regarder le commentaire pour la propriété #property indicator_color1   
//--- calculerons le multiplicateur
   if(bars>1)multiplier=2.*M_PI/bars;
   else
     {
      PrintFormat("Spécifiez la valeur "bars"=%d plus que 1",bars);
      //--- une cessation anticipée du travail de l'indicateur
      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;
//--- calculons les ticks pour le changement du style, de la couleur et de l'épaisseur de la ligne
   ticks++;
//--- si le nombre critique des ticks est accumulé
   if(ticks>=N)
     {
      //--- changeons les propriétés de la ligne
      ChangeLineAppearance();
      //--- changeons les couleurs, par lesquelles l'histogramme est dessiné
      ChangeColors(colors,color_sections);      
      //---oblitérons le compteur des ticks au zéro
      ticks=0;
     }
 
//--- les calculs des valeurs de l'indicateur
   int start=0;
//--- si le calcul est déjà fait pendant le lancement précédent de OnCalculate
   if(prev_calculated>0) start=prev_calculated-1; // établissons le début des calculs de la barre avant-dernière
//--- remplissons le tampon d'indicateur par les valeurs
   for(int i=start;i<rates_total;i++)
     {
      //--- la valeur
      Color_HistogramBuffer[i]=sin(i*multiplier);
      //--- la couleur
      int color_index=i%(bars*color_sections);
      color_index/=bars;
      Color_HistogramColors[i]=color_index;
     }
//--- rendons la valeur prev_calculated pour un appel suivant de la fonction
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Change la couleur des sections de la ligne                       |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- le nombre de couleurs
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- spécifions une nouvelle couleur par l'image accidentelle pour chaque index de couleur
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- recevrons le nombre accidentel
      int number=MathRand();
      //--- recevrons l'index dans le tableau col[] comme le reste de la division entière
      int i=number%size;
      //--- installons la couleur pour chaque index comme la propriété PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  le numéro du style graphique
                          PLOT_LINE_COLOR,      //  l'identificateur de la propriété
                          plot_color_ind,       //  l'index de la couleur, où nous inscrirons la couleur
                          cols[i]);             //   une nouvelle couleur
      //--- inscrirons les couleurs 
      comm=comm+StringFormat("HistogramColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Modifie l'apparence de la ligne affichée dans l'indicateur       |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- la ligne pour la formation de l'information sur les propriétés de la ligne
   string comm="";
//--- le bloc du changement de l'épaisseur de la ligne
   int number=MathRand();
//--- recevrons l'épaisseur comme le reste de la division entière
   int width=number%5; // l'épaisseur est spécifiée de 0 jusqu'à 4
//--- définissons la couleur comme la propriété PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- inscrirons l'épaisseur de la ligne
   comm=comm+" Width="+IntegerToString(width);
 
//--- le bloc du changement du style de la ligne
   number=MathRand();
//--- le diviseur du nombre est égal à la taille du tableau styles
   int size=ArraySize(styles);
//--- recevrons l'index pour le choix de la nouvelle couleur comme le reste de la division entière
   int style_index=number%size;
//--- définissons la couleur comme la propriété PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- inscrirons le style de la ligne
   comm=EnumToString(styles[style_index])+", "+comm;
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }