DRAW_SECTION

Stil DRAW_SECTION zeichnet Segmente der angegebenen Farbe auf die Werte des Indikator-Puffers. Die Breite, Stil und Farbe der Linie können ebenso wie für den Stil DRAW_LINE – 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_Zeichnung_DRAW_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_SECTION ist 1.

Ein Beispiel für einen Indikator, der Segmente zwischen den Preisen von High und Low zeichnet. Farbe, Breite und Stil aller Sektionen werden zufällig jede N Ticks geändert.

Ein Beispiel des Stils DRAW_SECTION

Bitte beachten Sie, dass für plot1 mit dem DRAW_SECTION-Stil werden Eigenschaften mithilfe Compiler-Direktive #property angegeben, und dann in der Funktion OnCalculate() werden diese drei Eigenschaften nach dem Zufallsprinzip angegeben. Der Parameter N wird in externen Parametern des Indikators angegeben, damit kann es manuell angegeben werden (die Registerkarte "Einstellungen" im Indikatoreigenschaften-Fenster).

//+------------------------------------------------------------------+
//|                                                 DRAW_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_SECTION"
#property description "Zeichnet gerade Linien durch jede bars 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 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
//--- Eingabeparameter
input int      bars=5;           // Länge der Sektionen in Balken
input int      N=5;              // Anzahl der Ticks um Stil der Sektionen zu ändern
//--- Indicator-Puffer
double         SectionBuffer[];
//--- Hilfsvariable, um Ende der Sektionen zu berechnen
int            divider;
//--- Array, um die Farbe zu speichern
color colors[]={clrRed,clrBlue,clrGreen};
//--- 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,SectionBuffer,INDICATOR_DATA);
//--- Der Leerer Wert (0) wird nicht in der Zeichnung teilnehmen
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Überprüfen wir die Indikator-Parameter
   if(bars<=0)
     {
      PrintFormat("Invalid Parameterwert 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;
//--- 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();
      //--- 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++)
     {
      //--- Wir bekommen Rest nach der Division der Nummer des Balkens durch 2*bars
      int rest=i%divider;
      //--- Wenn die Nummer des Balken ohne Rest durch 2*bars teilbar ist
      if(rest==0)
        {
         //--- Ende der Segment ist auf den High-Preis dieses Balkens gesetzt
         SectionBuffer[i]=high[i];
        }
      //--- Wenn der Rest der Division gleich bars ist, 
      else
        {
         //--- Ende der Segment ist auf den High-Preis dieses Balkens gesetzt
         if(rest==bars) SectionBuffer[i]=low[i];
 //--- Wenn etwas nicht passt, dann überspringen wir diesen Balken - setzen 0
         else SectionBuffer[i]=0;
        }
     }
//--- den Wert prev_calculated für den nächsten Anruf der Funktion zurückgeben
   return(rates_total);
 ;}
//+------------------------------------------------------------------+
//| Ändert das Aussehen der Sektionen im Indikator                   |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- String um Informationen über die Eigenschaften der Linie zu erstellen
   string comm="";
//--- Block mit Änderungen der Linienfarbe
   int number=MathRand(); // Erhalten wir Zufallszahl
//--- Teiler der Zahl entspricht der Größe des Arrays colors[]
   int size=ArraySize(colors);
//--- Erhalten wir den Index als den Rest der ganzzahligen Division, um eine neue Farbe wählen
   int color_index=number%size;
//--- Geben wir die Farbe als Eigenschaft PLOT_LINE_COLOR an
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Schreiben wir die Linienfarbe
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- Block mit Änderungen der Linienbreite
   number=MathRand();
//--- Erhalten wir die Breite als den Rest der ganzzahligen Division
   int width=number%5;   // Breite ist von 0 bis 4
//--- Breite angeben
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Schreiben wir die Linienbreite
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Block mit Änderungen des Linienstils
   number=MathRand();
//--- Teiler der Zahl entspricht der Größe des Arrays styles
   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;
//--- Linienart angeben
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Schreiben wir den Linienstil
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }