DRAW_SECTION

Le style DRAW_SECTION dessine par la couleur spécifiée les segments selon les valeurs du tampon d'indicateur. On peut spécifier l'épaisseur, la couleur et le style de l'affichage de la ligne 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 créer les indicateurs "vivants", qui changent leur aspect en fonction de la situation actuelle.

Les sections se dessinent d'une valeur non vide à l'autre valeur non vide du tampon d'indicateur, les valeurs vides sont manquées. Pour indiquer, quelle valeur doit être considérée comme "vide", établissez cette valeur dans la propriété PLOT_EMPTY_VALUE. Par exemple, si l'indicateur doit se dessiner par les segments selon les valeurs non nulles, il faut spécifier la valeur nulle comme vide:

//---la valeur 0 (la valeur vide) ne participera pas au rendu 
   PlotIndexSetDouble(l'index_de la construction_DRAW_SECTION,PLOT_EMPTY_VALUE,0);

Remplissez toujours évidemment par les valeurs tous les éléments du tampon d'indicateur, spécifiez aux éléments non-rendus la valeur vide.

Le nombre de tampons nécessaires pour la construction DRAW_SECTION – 1.

L'exemple de l'indicateur dessinant les segments entre les prix High et Low. La couleur, l'épaisseur et le style de toutes les sections se changent chaquesN ticks par hasard.

L'exemple du style DRAW_SECTION

Prêtez attention que primordialement à la construction graphique plot1 avec le style DRAW_SECTION 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_SECTION.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_SECTION"
#property description "Dessine par les segments directs dans chaque "bars" barres"
#property description "La couleur, l'épaisseur et le style des sections se changent par hasard"
#property description "dans chaques N ticks"
 
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Section
#property indicator_label1  "Section"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- le paramètre input
input int      bars=5;           // la longueur des sections dans les barres
input int      N=5;              // le nombre de ticks pour le changement du style des sections
//--- le tampon d'indicateur pour la construction
double         SectionBuffer[];
//---la variable auxiliaire pour le calcul des fins des sections
int            divider;
//--- 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()
  {
//--- le binding du tableau et du tampon d'indicateur
   SetIndexBuffer(0,SectionBuffer,INDICATOR_DATA);
//---la valeur 0 (la valeur vide) ne participera pas au rendu 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---vérifions le paramètre de l'indicateur
   if(bars<=0)
     {
      PrintFormat("La valeur inadmissible du paramètre bar=%d",bars);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=2*bars;
//---+
   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;
     }
 
//--- le numéro de la barre, par laquelle nous commencerons le calcul des valeurs de l'indicateur
   int start=0;
//--- si l'indicateur a été déjà calculé, établissons start sur la barre précédente
   if(prev_calculated>0) start=prev_calculated-1;
//--- Tous les calculs des valeurs de l'indicateur se trouvent ici
   for(int i=start;i<rates_total;i++)
     {
      //--- recevrons le reste de la division du numéro de la barre sur 2*bars
      int rest=i%divider;
      //--- si le numéro de la barre se divise sans reste sur 2*bars
      if(rest==0)
        {
         //---fixerons la fin du segment sur le prix High de cette barre
         SectionBuffer[i]=high[i];
        }
      //--- si le reste de la division est égal aux barres, 
      else
        {
         //---fixerons la fin du segment sur le prix High de cette barre
         if(rest==bars) SectionBuffer[i]=low[i];
         //--- si rien n'est pas convenu, manquons cette barre - mettons la valeur 0
         else SectionBuffer[i]=0;
        }
     }
//--- rendons la valeur prev_calculated pour un appel suivant de la fonction
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| modifie l'apparence des sections 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
   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;
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }