DRAW_ZIGZAG

Stil DRAW_ZIGZAG zeichnet Segmente der angegebenen Farbe auf die Werte der zwei Indikator-Puffer. Dieser Stil ist dem Stil DRAW_SECTION sehr ähnlich, aber im Gegensatz zu diesen können Sie die vertikale Segmente innerhalb eines Balkens zeichnen, wenn für diesen Balken Werte für die beiden Indikator-Puffer angegeben sind. Die Segmente werden vom dem Wert im ersten Puffer bis dem Wert im zweiten Indikator-Puffer gezeichnet. Keiner der Puffer darf nicht nur leere Werte erhalten, da in diesem Fall nichts gezeichnet wird.

Die Breite, Stil und Farbe der Linie können ebenso wie für den Stil 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 Segmente werden vom nicht leeren Wert eines Puffers zum nicht leeren Wert anderes Indikator-Puffers gezeichnet. Um anzugeben, welchen Wert als "leer" betrachtet werden soll, setzen Sie diesen Wert in der Eigenschaft PLOT_EMPTY_VALUE:

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

Immer füllen Sie die Indikator-Puffer mit Werten expliziert aus, geben Sie den leeren Wert in Puffer der Balken zu überspringen.

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

Ein Beispiel für einen Indikator, der eine Säge auf die High und Low Priese zeichnet. Farbe, Breite und Linienart des Zigzags werden nach dem Zufallsprinzip jede N Ticks geändert.

Ein Beispiel des Stils DRAW_ZIGZAG

Bitte beachten Sie, dass für plot1 mit dem DRAW_ZIGZAG-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_ZIGZAG.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_ZIGZAG"
#property description "Zeichnet "Säge" aus den geraden Linien, überspringt Balken eines Tages"
#property description "Der Tag zu überspringen wird zufällig beim Start des Indikators gewählt"
#property description "Farbe, Breite und Stil der Segmente variieren zufällig"
#property description " jede N Ticks"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ZigZag
#property indicator_label1  "ZigZag"
#property indicator_type1   DRAW_ZIGZAG
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- Eingabeparameter
input int      N=5;              // Anzahl der Ticks für Änderung 
//--- indicator buffers
double         ZigZagBuffer1[];
double         ZigZagBuffer2[];
//--- der Wochentag, für den der Indikator nicht gezeichnet wird
int invisible_day;
//--- 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 von Arrays und Indikator-Puffer
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);
//--- Erhalten eine Zufallszahl von 0 bis 6, für diesen Tag wird der Indikator nicht gezeichnet
   invisible_day=MathRand()%6;
//--- Der Leerer Wert (0) wird nicht in der Zeichnung teilnehmen
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Der Leerer Wert (0) wird nicht in der Zeichnung teilnehmen
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2");
//---
   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 ausreichende 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;
     }
 
//--- Die Zeitstruktur ist benötigt, um den Wochentag jedes Balkens zu erhalten
   MqlDateTime dt;
 
//--- Startposition der Berechnungen
   int start=0;
//--- Wenn der Indikator wurde auf dem vorherigen Tick berechnet, dann beginnen wir Berechnung auf der vorletzten Tick
   if(prev_calculated!=0) start=prev_calculated-1;
//--- Berechnungzyklus
   for(int i=start;i<rates_total;i++)
     {
      //--- Schreiben die Balkenöffnungszeit in die Struktur
      TimeToStruct(time[i],dt);
      //--- Wen der Wochentag dieses Balken invisible_day ist
      if(dt.day_of_week==invisible_day)
        {
         //--- Wir schreiben leere Werte des Puffers für diesen Balken
         ZigZagBuffer1[i]=0;
         ZigZagBuffer2[i]=0;
        }
      //--- Wen der Wochentag entspricht, füllen wir die Puffer
      else
        {
         //--- Wenn die Nummer des Balkens ist gerade
         if(i%2==0)
           {
            //---  Wir schreiben High in den ersten Puffer und Low in den zweiten Puffer
            ZigZagBuffer1[i]=high[i];
            ZigZagBuffer2[i]=low[i];
           }
         //--- Die Nummer des Balkens ist ungerade
         else
           {
            //--- Wir füllen den Balken in der umgekehrten Reihenfolge
            ZigZagBuffer1[i]=low[i];
            ZigZagBuffer2[i]=high[i];
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Ändert das Aussehen der Segmente in Zigzag                       |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- String um Informationen über Egenschaften von ZigZag zu erstellen
   string comm="";
//--- Block mit Änderungen der Farbe des ZigZags
   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
//--- Geben wir die Farbe als Eigenschaft PLOT_LINE_WIDTH
   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;
//--- Geben wir die Farbe als Eigenschaft PLOT_LINE_COLOR an
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Schreiben wir den Linienstil
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Informationen über den Tag, der in den Berechnungen ignoriert wird, hinzufügen
   comm="\r\nUngezeichneter Tag - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }