DRAW_COLOR_HISTOGRAM2

Le style DRAW_COLOR_HISTOGRAM2 dessine l'histogramme par la couleur spécifiée — les segments verticaux selon les valeurs de deux tampons d'indicateur. Mais à la différence de DRAW_HISTOGRAM2 monochrome on peut spécifier la couleur propre de l'ensemble prédéterminé dans ce style à chaque colonne de l'histogramme. Les valeurs des fins des segments sont tirées du tampon d'indicateur.

On peut spécifier l'épaisseur, le style et la couleur de l'histogramme comme pour le style DRAW_HISTOGRAM2par 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.

On peut utiliser le style DRAW_COLOR_HISTOGRAM2 dans une sous- fenêtre séparée du graphique, ainsi que dans une fenêtre principale. On ne fait pas le dessin pour les valeurs vides, toutes les valeurs dans les tampons d'indicateur doivent être installés de manière explicite. L'initialisation des tampons par la valeur vide n'est pas produite.

Le nombre de tampons nécessaires pour la construction DRAW_COLOR_HISTOGRAM2 – 3:

  • deux tampons pour stocker l'extrémité supérieure et inférieure du segment vertical sur chaque barre;
  • un tampon pour stocker l'index de la couleur, par lequel le segment est dessiné (il faut spécifier seulement pour les valeurs non vides).

L'exemple de l'indicateur, qui dessine l'histogramme entre les prix High et Low par la couleur spécifiée. Les lignes de l'histogramme se dessinent par sa couleur pour chaque jour de la semaine. La couleur de chaque jour, l'épaisseur et le style de l'histogramme se changent chaquesN ticks par hasard.

L'exemple du style DRAW_COLOR_HISTOGRAM2

Prêtez attention que primordialement à la construction graphique plot1avec le style DRAW_COLOR_HISTOGRAM2 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_HISTOGRAM2.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_HISTOGRAM2"
#property description "Dessine le segment entre Open et Close sur chaque barre"
#property description "La couleur, l'épaisseur et le style se changent par hasard"
#property description "dans chaques N ticks"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot ColorHistogram_2
#property indicator_label1  "ColorHistogram_2"
#property indicator_type1   DRAW_COLOR_HISTOGRAM2
//--- spécifions 5 couleurs pour colorer l'histogramme selon les jours de la semaine (ils se trouvent dans le tableau spécial)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- le paramètre input
input int      N=5;              // le nombre de ticks pour le changement de l'histogramme
int            color_sections;
//--- les tampons des valeurs
double         ColorHistogram_2Buffer1[];
double         ColorHistogram_2Buffer2[];
//--- le tampon des index de la couleur
double         ColorHistogram_2Colors[];
//--- 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,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//---établissons la valeur vide
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- le nombre de couleurs pour colorier la sinusoïde
   color_sections=8;   //  regarder le commentaire à la propriété #property indicator_color1      
//---
   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;
//--- pour la réception du jour de la semaine selon le temps de l'ouverture de chaque barre
   MqlDateTime dt;
//--- 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++)
     {
      TimeToStruct(time[i],dt);
      //--- la valeur
      ColorHistogram_2Buffer1[i]=high[i];
      ColorHistogram_2Buffer2[i]=low[i];
      //---spécifions l'index de la couleur par jour de la semaine
      int day=dt.day_of_week;
      ColorHistogram_2Colors[i]=day;
     }
//--- 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);
  }