DRAW_HISTOGRAM2

Le style DRAW_HISTOGRAM2 dessine l'histogramme par la couleur spécifiée — les segments verticaux selon les valeurs de deux tampons d'indicateur. On peut spécifier l'épaisseur, la couleur et le style de l'affichage des segments comme pour le style DRAW_LINEpar 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_HISTOGRAM 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_HISTOGRAM2 – 2.

L'exemple de l'indicateur dessinant sur chaque barre le segment vertical de la couleur spécifiée et les épaisseurs entre les prix Open et Close.  La couleur, l'épaisseur et le style de toutes colonnes de l'histogramme se changent chaques N ticks par hasard. Au lancement de l'indicateur dans la fonction OnInit()le numéro du jour de la semaine s'établit par l'image accidentelle, auquel l'histogramme ne sera pas dessiné — invisible_day. La valeur vide PLOT_EMPTY_VALUE=0: est spécifiée pour cela

//---établissons la valeur vide
   PlotIndexSetDouble(l'index_de la construction_DRAW_SECTION,PLOT_EMPTY_VALUE,0);

L'exemple du style DRAW_HISTOGRAM2

Prêtez attention que primordialement à la construction graphique plot1 avec le style DRAW_HISTOGRAM2 on spécifie les propriétés à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate() ces trois propriétés sont spécifiées par hasard. 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_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_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 2
#property indicator_plots   1
//--- plot Histogram_2
#property indicator_label1  "Histogram_2"
#property indicator_type1   DRAW_HISTOGRAM2
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      N=5;              // le nombre de ticks pour le changement de l'histogramme
//--- indicator buffers
double         Histogram_2Buffer1[];
double         Histogram_2Buffer2[];
//--- le jour de la semaine, pour lequel l'indicateur n'est pas dessiné
int invisible_day;
//--- le tableau pour le stockage des couleurs
color colors[]={clrRed,clrBlue,clrGreen};
//--- 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,Histogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Histogram_2Buffer2,INDICATOR_DATA);
//---établissons la valeur vide
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- recevrons le nombre accidentel de 0 jusqu'à 5
   invisible_day=MathRand()%6;
//---
   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();
      //---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);
      if(dt.day_of_week==invisible_day)
        {
         Histogram_2Buffer1[i]=0;
         Histogram_2Buffer2[i]=0;
        }
      else
        {
         Histogram_2Buffer1[i]=open[i];
         Histogram_2Buffer2[i]=close[i];
        }
     }
//--- rendons la valeur prev_calculated pour un appel suivant de la fonction
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| modifie l'apparence des lignes 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 la couleur de la ligne
   int number=MathRand(); // recevrons le nombre accidentel
//--- le diviseur du nombre est égal au montant du tableau colors[]
   int size=ArraySize(colors);
//--- recevrons l'index pour le choix de la nouvelle couleur comme le reste de la division entière
   int color_index=number%size;
//--- définissons la couleur comme la propriété PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- inscrirons la couleur de la ligne
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- le bloc du changement de l'épaisseur de la ligne
   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
//--- établissons l'épaisseur des lignes
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- inscrirons l'épaisseur de la ligne
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- le bloc du changement du style de la ligne
   number=MathRand();
//--- le diviseur du nombre est égal à la taille du tableau styles
   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;
//--- établissons le style des lignes
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- inscrirons le style de la ligne
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//---ajoutons l'information sur le jour, qui est manqué dans les calculs
   comm="\r\nLe jour non-dessiné - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }