DRAW_COLOR_ARROW

Le style DRAW_COLOR_ARROW dessine les flèches sur le graphique par la couleur (les symboles de l'ensemble Wingdings) selon la valeur du tampon d'indicateur. A la différence du style DRAW_ARROW, on y peut spécifier la couleur pour chaque symbole de l'ensemble des couleurs prédéterminé, spécifiées par la propriété indicator_color1.

On peut spécifier l'épaisseur et la couleur des symboles de la meme façon que pour le style DRAW_ARROW par 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.

Le code du symbole pour la sortie sur le graphique est spécifié à l'aide de la propriété PLOT_ARROW.

//--- - spécifions le code du symbole de l'ensemble Wingdings pour le dessin dans PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,code);

Par défaut la valeur PLOT_ARROW=159 (le cercle).

Chaque flèche représente en réalité le symbole, qui a la hauteur et le point du rattachement, et peut fermer par lui-même une certaine importante information sur le graphique (par exemple, le prix de la clôture de la barre). C'est pourquoi on peut spécifier en supplément un décalage vertical en pixels, qui ne dépend pas de l'échelle du graphique. Les flèches seront visuellement déplacées selon la verticale sur le nombre indiqué de pixels, bien que les valeurs de l'indicateur restent les mêmes:

//--- spécifions le décalage des flèches selon le vertical en pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);

La valeur négative PLOT_ARROW_SHIFT signifie le décalage des flèches en haut, la valeur positive déplace les flèches en bas.

On peut utiliser le style DRAW_COLOR_ARROW dans une sous- fenêtre séparée du graphique, ainsi que dans une fenêtre principale.. Les valeurs vides ne se dessinent pas et ne s'affichent pas dans "la Fenêtre des données", 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.

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

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

  • un tampon pour stocker la valeur du prix selon lequel se dessine le symbole (en plus le décalage en pixels, spécifié par la propriété PLOT_ARROW_SHIFT);
  • un tampon pour stocker l'index de la couleur, par lequel se dessine la flèche (il faut spécifier seulement pour les valeurs non vides).

L'exemple de l'indicateur dessinant les flèches sur chaque barre, qui a le prix de la clôture Close plus grand que le prix de la clôture de la barre précédente. L'épaisseur, le décalage et le code du symbole detoutes les flèches se changent chaques N ticks par hasard. La couleur du symbole dépend du numéro de la barre, sur lequelle il est dessiné.

L'exemple du style DRAW_COLOR_ARROW

Dans l'exemple les propriétés la couleur et la taille pour la construction graphique plot1 avec le style DRAW_COLOR_ARROW sont spécifiés primordialement à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate()les 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).

Pretez attention que primordialement on spécifie 8 couleurs à l'aide de la directive du compilateur#property, et puis dans la fonctionOnCalculate() la couleur est choisie par hasard parmi 14 couleurs stockées dans le tableau colors[].

//+------------------------------------------------------------------+
//|                                             DRAW_COLOR_ARROW.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_ARROW"
#property description "Dessine sur le graphique par les différentes couleurs les flèches spécifiées par les symboles Unicode"
#property description "La couleur, la taille, le décalage et le code du symbole de la flèche se changent"
#property description " par hasard par chaque N ticks"
#property description "Le paramètre code spécifie la valeur de base: le code = 159 (cercle)"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorArrow
#property indicator_label1  "ColorArrow"
#property indicator_type1   DRAW_COLOR_ARROW
//--- spécifions 8 couleurs pour colorer l'histogramme selon les jours de la semaine (ils se trouvent dans un tableau spécial)
#property indicator_color1  clrRed,clrBlue,clrSeaGreen,clrGold,clrDarkOrange,clrMagenta,clrYellowGreen,clrChocolate
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- les paramètres input
input int      N=5;         // le nombre de ticks pour le changement
input ushort   code=159;    // le code du symbole pour le dessin dans DRAW_ARROW
int            color_sections;
//--- le tampon d'indicateur pour la construction
double         ColorArrowBuffer[];
//--- le tableau pour le stockage des index de la couleur
double         ColorArrowColors[];
//--- 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
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorArrowBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorArrowColors,INDICATOR_COLOR_INDEX);
//--- spécifions le code du symbole pour le dessin dans PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,code);
//--- spécifions le décalage des flèches selon le vertical en pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5);
//--- définissons 0 comme une valeur vide
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);   
//---- le nombre de couleurs pour colorier la sinusoïde
   color_sections=8;   //  regarder le commentaire pour 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 de la couleur, de la taille, de la confusion et du code de la flèche
   ticks++;
//--- si le nombre critique des ticks est accumulé
   if(ticks>=N)
     {
      //--- changeons les propriétés des flèches
      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;
     }
 
//--- le bloc du calcul des valeurs de l'indicateur
   int start=1;
   if(prev_calculated>0) start=prev_calculated-1;
//--- la boucle du calcul
   for(int i=1;i<rates_total;i++)
     {
      //--- si le prix courant Close est plus grand que le précédent, mettons la flèche
      if(close[i]>close[i-1])
         ColorArrowBuffer[i]=close[i];
      //--- dans le cas contraire spécifions la valeur nulle
      else
         ColorArrowBuffer[i]=0;
      //--- la couleur de la flèche
      int index=i%color_sections;
      ColorArrowColors[i]=index;
     }
//--- return value of prev_calculated for next call
   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("ArrowColorIndex[%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 code de la flèche (PLOT_ARROW)
   number=MathRand();
//---recevrons le reste de la division entière pour le calcul du nouveau code de la flèche (de 0 jusqu'à 19)
   int code_add=number%20;
//---définissons un nouveau code du symbole comme la somme code+code_add
   PlotIndexSetInteger(0,PLOT_ARROW,code+code_add);
//--- inscrirons le code du symbole PLOT_ARROW
   comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;   
 
//--- le bloc du changement du décalage des flèches selon la verticale en pixels
   number=MathRand();
//--- recevrons le décalage comme le reste de la division entière
   int shift=20-number%41;
//--- définissons un nouveau décalage 
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);
//--- inscrirons le décalage PLOT_ARROW_SHIFT
   comm="\r\n"+"PLOT_ARROW_SHIFT="+IntegerToString(shift)+comm;
 
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }