DRAW_COLOR_SECTION

DRAW_COLOR_SECTION ist eine farbige version des Stils DRAW_SECTION, aber es erlaubt jede Sektion mit einer eigenen Farbe zu zeichnen. Stil DRAW_COLOR_SECTION, wie alle farbigen Stile mit COLOR in ihren Namen, hat ein besonderer Indikator-Puffer, der den Index (Nummer) der Farbe aus dem angegebenen Farbarray erhielt. So kann die Farbe jeder Sektion gesetzt werden, wenn Sie die Farbindex für die Balken, auf dem das Sektion ende ist, angeben.

Die Breite, Farbe und Stil der Sektionen können wie für DRAW_SECTION durch Compiler-Direktiven oder dynamisch mit der PlotIndexSetInteger()-Funktion angegeben werden. Dynamische Veränderungen in den Eigenschaften der graphischen Konstruktion ermöglichen es Ihnen, die Indikatoren zu "wiederbeleben" so, dass sie ihr Aussehen ändern je nach der aktuellen Situation.

Die Sektionen werden aus einem nicht leeren Wert zu einem anderen leeren Wert des Indikator-Puffers gezeichnet, leere Werte werden ignoriert. Um anzugeben, welchen Wert als "leer" betrachtet werden soll, setzen Sie diesen Wert in der Eigenschaft PLOT_EMPTY_VALUE. Zum Beispiel, wenn der Indikator wie Sektionen auf nicht leere Werte gezeichnet werden soll, müssen Sie einen Nullwert als leer angeben:

//--- Der Leerer Wert (0) wird nicht in der Zeichnung teilnehmen
   PlotIndexSetDouble(Index_der_Darstellung_DRAW_COLOR_SECTION,PLOT_EMPTY_VALUE,0);

Füllen Sie immer alle Elemente des Indikator-Puffers mit den Werten, geben sie leere Werte für nicht-gezeichnete Elemente.

Die erforderliche Anzahl der Puffer für den Bau von DRAW_COLOR_SECTION ist 2.

  • einen Puffer für Speicherung die Werte des Indikators, auf denen die Linie gezeichnet wird;
  • ein Puffer, um die Farbindex des Segments (es its sinnvoll nur für Nicht-leere Werte) zu speichern.

Farben können mit der Compiler-Direktive #property indicator_color1 durch Kommas angegeben werden. Die Anzahl der Farben darf maximal 64 sein.

Ein Beispiel für einen Indikator, der farbige Sektionen von 5 Balken auf die High-Preise zeichnet. Farbe, Breite und Stil der Sektionen werden nach dem Zufallsprinzip jede N Ticks geändert.

Ein Beispiel für den Stil DRAW_COLOR_SECTION

Bitte beachten Sie, dass für plot1 mit dem DRAW_COLOR_SECTION-Stil werden 8 Farben mithilfe Compiler-Direktive #property angegeben. Dann werden Farben zufällig aus Farbarray colors[] in der Funktion OnCalculate() angegeben.

Der Parameter N ist in externen Parametern des Indikators angegeben, damit kann es manuell angegeben werden (die Registerkarte "Einstellungen" im Indikatoreigenschaften-Fenster).

//+------------------------------------------------------------------+
//|                                           DRAW_COLOR_SECTION.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 "Der Indikator demonstriert DRAW_COLOR_SECTION"
#property description "Zeichnet farbige Sektionen von bestimmten Anzahl der Balken"
#property description "Farbe, Breite und Stil der Sektionen werden zufällig"
#property description "jede N Ticks verändert"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorSection
#property indicator_label1  "ColorSection"
#property indicator_type1   DRAW_COLOR_SECTION
//--- Definieren wir 8 Farben um Segmente zu färben (sie sind im speziellen Array gespeichert)
#property indicator_color1  clrRed,clrGold,clrMediumBlue,clrLime,clrMagenta,clrBrown,clrTan,clrMediumVioletRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- Eingabeparameter
input int      N=5;                      // Anzahl der Balken zu ändern
input int      bars_in_section=5;        // Länge der Sektionen in Balken
//--- Hilfsvariable, um Ende der Sektionen zu berechnen
int            divider;
int            color_sections;
//--- Buffer für das Rendering
double         ColorSectionBuffer[];
//--- Puffer zu speichern Farben der Liniensegmente auf jefem Balken
double         ColorSectionColors[];
//--- Array, um die Farbe zu speichern, enthält 14 Elemente
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- Array für Speicherung der Linienstile
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,ColorSectionBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorSectionColors,INDICATOR_COLOR_INDEX);
//--- Der Leerer Wert (0) wird nicht in der Zeichnung teilnehmen
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---- Anzahl der Farben um die Sektionen zu färben
   color_sections=8;   //  Sehen Sie Kommentar zur Eigenschaft #property indicator_color1
//--- Überprüfen wir die Indikator-Parameter
   if(bars_in_section<=0)
     {
      PrintFormat("Ungültiger Wert für die Länge der Sektion=%d",bars_in_section);
      return(INIT_PARAMETERS_INCORRECT);
     }
   else divider=color_sections*bars_in_section;
//---
   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;
//--- Zählen wir Ticks, um den Stil, die Farbe und Breite der Linie zu ändern
   ticks++;
//--- Wenn eine kritische Anzahl von Ticks angesammelt hat
   if(ticks>=N)
     {
      //--- Ändern wir die Eigenschaften der Linie
      ChangeLineAppearance();
      //--- Ändern wir die Farben der Sektionen
      ChangeColors(colors,color_sections);
      //--- Setzen wir den Zähler der Ticks auf Null
      ticks=0;
     }
 
//--- Anzahl der Balken, mit dem die Berechnung des Indikators beginnt
   int start=0;
//--- Wenn der Indikator bevor berechnet wurde, dann setzen wir start bei dem vorherigen Balken
   if(prev_calculated>0) start=prev_calculated-1;
//--- alle Berechnungen der Indikatorwerte
   for(int i=start;i<rates_total;i++)
     {
      //--- Wenn der Nummer des Balkens ist teilbar durch Sektion_Länge, bedeutet dies das Ende der Sektion
      if(i%bars_in_section==0)
        {
         //--- Ende der Segment ist auf den High-Preis dieses Balkens gesetzt
         ColorSectionBuffer[i]=high[i];
         //--- Rest der Division von Balkennummern durch Sektion_Länge*Anzahl_der_Farben
         int rest=i%divider;
         //Erhalten wir den Farbenummer =  von 0 bis Anzahl_der_Farben-1
         int color_indext=rest/bars_in_section;
         ColorSectionColors[i]=color_indext;
        }
      //--- Wenn der Rest der Division gleich bars ist, 
      else
        {
 //--- Wenn etwas nicht passt, dann überspringen wir diesen Balken - setzen 0
         ColorSectionBuffer[i]=0;
        }
     }
//--- den Wert prev_calculated für den nächsten Anruf der Funktion zurückgeben
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Ändert die Farbe der Linienteile                                 |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- Anzahl der Farben
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- Für jede Farbeindex definieren wir eine neue Farbe zufällig
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- erhalten wir eine Zufallszahl
      int number=MathRand();
      //--- Erhalten wir den Index in Array col[] als den Rest der ganzzahligen Division
      int i=number%size;
      //--- Geben wir die Farbe für jeden Index als Eigenschaft PLOT_LINE_COLOR an
      PlotIndexSetInteger(0,                    //  Nummer der Grafikstile
                          PLOT_LINE_COLOR,      //  Property Identifier
                          plot_color_ind,       //  Farbeindex, in dem wir die Farbe schreiben
                          cols[i]);             //  neue Farbe
      //--- schreiben wir die Farbe
      comm=comm+StringFormat("SectionColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
 ;}
//+------------------------------------------------------------------+
//| Ändert das Aussehen der angezeigten Linie im Indikator           |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- String um Informationen über die Eigenschaften der Linie zu erstellen
   string comm="";
//--- Block mit Änderungen der Linienbreite
   int number=MathRand();
//--- Erhalten wir die Breite als den Rest der ganzzahligen Division
   int width=number%5; // Breite ist von 0 bis 4
//--- Geben wir die Farbe als Eigenschaft PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Schreiben wir die Linienbreite
   comm=comm+" Width="+IntegerToString(width);
 
//--- Block mit Änderungen des Linienstils
   number=MathRand();
//--- Teiler der Zahl entspricht der Größe des Arrays styles
   int size=ArraySize(styles);
//--- Erhalten wir den Index als den Rest der ganzzahligen Division, um ein neuer Stil zu wählen
   int style_index=number%size;
//--- Geben wir die Farbe als Eigenschaft PLOT_LINE_COLOR an
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Schreiben wir den Linienstil
   comm=EnumToString(styles[style_index])+", "+comm;
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }