DRAW_COLOR_LINE

Stil DRAW_COLOR_LINE ist eine Farbversion von DRAW_LINE, er zeichnet eine Linie von den Werten des Indikator-Puffers. Aber dieser Stil, wie in allen farbigen Stile, mit einem Namen COLOR, hat auch ein besonderer Indikator-Puffer, der den Index (Nummer) der Farbe aus dem angegebenen Farbarray erhielt. So kann die Farbe jedes Liniensegment eingestellt werden, wenn Sie die Farbindex der Linie auf diesem Balken angeben.

Die Breite, Stil und Farben um die Linie zu färben kann 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 erforderliche Anzahl der Puffer für den Bau von DRAW_COLOR_LINE ist 2.

  • einen Puffer für Speicherung die Werte des Indikators, auf denen die Linie gezeichnet wird;
  • einen Puffer, um die Farbindex der Linie auf jedem Balken.

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

//--- Definieren wir 5 Farben um Balken zu färben (sie sind im speziellen Array gespeichert)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Sie können bis zu 64 Farben abgeben)

Ein Beispiel für einen Indikator, der eine Linie auf die Close Priese der Balken zeichnet. Breite und Stil der Linie werden nach dem Zufallsprinzip jede N=5 Ticks geändert.

Ein Beispiel für den Stil DRAW_COLOR_LINE

Farben der Liniensegmente werden nach dem Zufallsprinzip in der benutzerdefinierten Funktion ChangeColors() geändert.

//+------------------------------------------------------------------+
//| Ä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("LineColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }

Das Beispiel zeigt die Besonderheit der Farbe-Versionen der Indikatoren - um die Farbe des Liniensegments zu ändern, brauchen Sie nicht die Werte im Puffer ColorLineColors[] (die Farbeindizes enthält) zu ändern. Es genügt, neue Farben in einem speziellen Array zu definieren. Dies ermöglicht Ihnen, schnell die Farbe für die grafische Konstruktion zu ändern, indem Sie nur eine kleine Array von Farben mit der PlotIndexSetInteger() Funktion ändern.

Bitte beachten Sie, dass für plot1 mit dem DRAW_COLOR_LINE-Stil werden Eigenschaften mithilfe Compiler-Direktive #property angegeben, und dann in der Funktion OnCalculate() werden diese drei Eigenschaften nach dem Zufallsprinzip angegeben.

Die Parameter N und Länge (Länge der farbigen Segmente der Balken) sind in externen Parametern des Indikators angegeben, damit kann es manuell angegeben werden (die Registerkarte "Einstellungen" im Indikatoreigenschaften-Fenster).

//+------------------------------------------------------------------+
//|                                              DRAW_COLOR_LINE.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_LINE"
#property description "Zeichnet eine Linie mit farbigen Segmenten von 20 Balken auf Close-Preise"
#property description "Breite, Stil und Farbe der Liniensegmente werden zufällig"
#property description "jede N Ticks verändert
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_COLOR_LINE
//--- Definieren wir 5 Farben um Balken zu färben (sie sind im speziellen Array gespeichert)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrOrange,clrDeepPink // (Sie können bis zu 64 Farben abgeben)
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- Eingabeparameter
input int      N=5;           // Anzahl der Ticks für Änderung 
input int      Length=20;     // Länge der Farbsegmente in Balken
int            line_colors=5; // Anzahl der angegebenen Farben ist 5 - Sehen Sie #property indicator_color1
//--- Buffer für das Rendering
double         ColorLineBuffer[];
//--- Puffer zu speichern Farben der Liniensegmente auf jedem Balken
double         ColorLineColors[];
 
//--- Array, um die Farbe zu speichern, enthält 7 Elemente
color colors[]={clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod};
//--- 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()
  {
//--- Bindung vom Array und Indikator-Puffer
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//--- Initialisierung des Zufallszahlengenerators
   MathSrand(GetTickCount());
//---
   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 Liniensegmente
      ChangeColors(colors,5);
      //--- Setzen wir den Zähler der Ticks auf Null
      ticks=0;
     }
 
//--- Block mit Berechnung der Indikatorwerte
   for(int i=0;i<rates_total;i++)
     {
      //--- Schreiben wir den Wert des Indikators in den Puffer
      ColorLineBuffer[i]=close[i];
      //--- Nun definieren wir eine zufällige Farbeindex für diesen Balken
      int color_index=i%(5*Length);
      color_index=color_index/Length;
      //--- Auf diesem balken wird die Linie mit der Farbe Nummer color_index gezeichnet wird
      ColorLineColors[i]=color_index;
     }
 
//--- 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("LineColorIndex[%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);
  }