DRAW_CANDLES

Le style DRAW_CANDLES dessine les chandeliers japonais selon les valeurs de quatre tampons d'indicateur, qui contiennent les prix Open, High, Low et Close. Il est destiné à la création des indicateurs personnels en forme des bougies, y compris dans une sous- fenêtre séparée du graphique et selon d'autres financiers financiers.

On peut spécifier la couleur des barres 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 "vivifier" les indicateurs pour qu'ils changent l'aspect en fonction de la situation actuelle.

L'indicateur est dessiné seulement pour ces barres, pour lesquelles on a spécifié les valeurs non vides de tous les quatre tampons d'indicateur. Pour spécifier quelle valeur doit être considérée comme "vide", établissez cette valeur dans la propriété PLOT_EMPTY_VALUE:

//---la valeur 0 (la valeur vide) ne participera pas au rendu 
   PlotIndexSetDouble(индекс_построения_DRAW_CANDLES,PLOT_EMPTY_VALUE,0);

Remplissez toujours évidemment par les valeurs les tampons d'indicateur, indiquez une valeur vide dans le tampon sur les barres manquées.

Le nombre de tampons nécessaires pour la construction DRAW_CANDLES – 4. Tous les tampons pour la construction doivent aller successivement un après l'autre en ordre donné: Open, High, Low et Close. Aucun des tampons ne peut pas contenir seulement les valeurs vides, puisque dans ce cas le dessin ne passe pas.

You can set up to three colors for the DRAW_CANDLES style affecting the candle look. If only one color is set, it is applied to all candles on a chart.

//--- identical candles with a single color applied to them
#property indicator_label1  "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- only one color is specified, therefore all candles are of the same color
#property indicator_color1  clrGreen  

If two comma-separated colors are specified, the first one is applied to candle outlines, while the second one is applied to the body.

//--- different colors for candles and wicks
#property indicator_label1  "Two color candles"
#property indicator_type1   DRAW_CANDLES
//--- green is applied to wicks and outlines, while white is applied to the body
#property indicator_color1  clrGreen,clrWhite 

Specify three comma-separated colors so that rising and falling candles are displayed differently. In that case, the first color is applied to the candle outlines, while the second and third ones — to bullish and bearish candles.

//--- different colors for candles and wicks
#property indicator_label1  "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- wicks and outlines are green, bullish candle body is white, while bearish candle body is red
#property indicator_color1  clrGreen,clrWhite,clrRed

Thus, the DRAW_CANDLES style allows you to create custom candle coloring options. Besides, all colors can be changed dynamically during the indicator operation using the PlotIndexSetInteger function (composition_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_index, color), where modifier_index may have the following values:

  • 0 — colors of outlines and wicks
  • 1— bullish candle body color
  • 2 — bearish candle body color

//--- set the color of outlines and wicks
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
//--- set the bullish body color
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
//--- set the bearish body color
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);

L'exemple de l'indicateur dessinant les chandeliers japonaises selon l'instrument financier indiqué dans la fenêtre séparée. La couleur des chandeliers se change chaquesN ticks par hasard. Le paramètre N est porté auxparamètres extérieurs de l'indicateur pour la possibilité de l'installation manuelle (l'onglet "Paramètres" dans les propriétés de l'indicateur).

L'exemple du style DRAW_CANDLES

Prêtez attention que primordialement à la construction graphique plot1on spécifie la couleur à l'aide de la directive du compilateur #property, et puis dans la fonction OnCalculate() une nouvelle couleur est spécifiée par hasard de la liste d'avance préparée.

//+------------------------------------------------------------------+
//|                                                 DRAW_CANDLES.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              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_CANDLES."
#property description "Dessine dans la fenêtre séparée par les couleurs différentes les bougies selon le symbole choisi par hasard de MarketWatch."
#property description " "
#property description "La couleur et l'épaisseur et le symbole des bougies se changent"
#property description "par hasard par chaque N ticks."
 
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot Bars
#property indicator_label1  "DRAW_CANDLES1"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- les paramètres input
input int      N=5;              // le nombre de ticks pour le changement de l'aspect
input int      bars=500;         // combien de barres montrer
input bool     messages=false;   // l'affichage des messages dans le journal "Experts"
//--- les tampons d'indicateur
double         Candle1Buffer1[];
double         Candle1Buffer2[];
double         Candle1Buffer3[];
double         Candle1Buffer4[];
//--- le nom du symbole
string symbol;
//--- le tableau pour le stockage des couleurs
color colors[]={clrRed,clrBlue,clrGreen,clrPurple,clrBrown,clrIndianRed};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- s'il y a trop peu de barres - terminons le travail avant terme
   if(bars<50)
     {
      Comment("Spécifiez un plus grand nombre de barres! Le travail de l'indicateur est cessé");
      return(INIT_PARAMETERS_INCORRECT);
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,Candle1Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Candle1Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Candle1Buffer3,INDICATOR_DATA);
   SetIndexBuffer(3,Candle1Buffer4,INDICATOR_DATA);
//--- une valeur vide
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---le nom du symbole, selon lequel les barres se dessinent
   symbol=_Symbol;
//--- établissons l'affichage du symbole
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_CANDLES("+symbol+")");
//---
   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=INT_MAX-100;
//--- calculons les ticks pour le changement du style, de la couleur et de l'épaisseur de la ligne
   ticks++;
//---si s'est accumulé le nombre suffisant des ticks
   if(ticks>=N)
     {
      //--- choisirons un nouveau symbole de la fenêtre "Aperçu du marché"
      symbol=GetRandomSymbolName();
      //--- remplaçons l'aspect
      ChangeLineAppearance();
      //--- choisirons un nouveau symbole de la fenêtre "Aperçu du marché"
      int tries=0;
      //--- faisons 5 tentatives de remplir les tampons plot1 par les prix du symbol
      while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
            Candle1Buffer1,Candle1Buffer2,Candle1Buffer3,Candle1Buffer4)
            && tries<5)
        {
         //--- le compteur des appels de la fonction CopyFromSymbolToBuffers()
         tries++;
        }
      //---oblitérons le compteur des ticks au zéro
      ticks=0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Remplit une bougie indiquée                                      |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
                             int total,
                             int plot_index,
                             double &buff1[],
                             double &buff2[],
                             double &buff3[],
                             double &buff4[]
                             )
  {
//--- copions les prix Open, High, Low et Close au tableau rates[]
   MqlRates rates[];
//--- le compteur des tentatives
   int attempts=0;
//--- combien on a été copié
   int copied=0;
//--- faisons 25 tentatives de recevoir la série temporelle selon le symbole nécessaire
   while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
     {
      Sleep(100);
      attempts++;
      if(messagesPrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
     }
//--- si on n'a pas réussi à copier le nombre suffisant des barres
   if(copied!=bars)
     {
      //--- formons la chaîne du message
      string comm=StringFormat("On a réussi à recevoir seulement %d barres de %d barres demandées pour le symbole %s",
                               name,
                               copied,
                               bars
                               );
      //--- déduisons le message au commentaire sur une principale fenêtre du graphique
      Comment(comm);
      //--- déduisons les messages
      if(messagesPrint(comm);
      return(false);
     }
   else
     {
      //--- établissons l'affichage du symbole 
      PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
     }
//--- initialisons les tampons par les valeurs vides
   ArrayInitialize(buff1,0.0);
   ArrayInitialize(buff2,0.0);
   ArrayInitialize(buff3,0.0);
   ArrayInitialize(buff4,0.0);
//--- copions les prix aux tampons sur chaque tick
   for(int i=0;i<copied;i++)
     {
      //--- calculons l'index correspondant pour les tampons
      int buffer_index=total-copied+i;
      //--- inscrivons les prix aux tampons
      buff1[buffer_index]=rates[i].open;
      buff2[buffer_index]=rates[i].high;
      buff3[buffer_index]=rates[i].low;
      buff4[buffer_index]=rates[i].close;
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Rend accidentellement le symbole du Market Watch                 |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
  {
//--- le nombre de symboles montrés dans la fenêtre "Aperçu du marché"
   int symbols=SymbolsTotal(true);
//--- la position du symbole dans la liste - le nombre accidentel de 0 jusqu'aux symbols
   int number=MathRand()%symbols;
//--- rendons le nom du symbole selon la position indiquée
   return SymbolName(number,true);
  }
//+------------------------------------------------------------------+
//| Modifie l'apparence des barres                                   |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- la ligne pour la formation de l'information sur les propriétés des barres
   string comm="";
//--- le bloc du changement de la couleur des barres
   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
   comm=comm+"\r\n"+(string)colors[color_index];
//--- inscrirons le nom du symbole
   comm="\r\n"+symbol+comm;
//--- déduisons l'information sur le graphique par le commentaire
   Comment(comm);
  }