DRAW_FILLING

Stil DRAW_FILLING zeichnet Farbbereich zwischen den Werten der zwei Indikator-Puffer. In der Tat zeichnet dieser Stil zwei Zeilen und füllt den Raum zwischen ihnen mit einem der zwei angegebenen Farben. Es wird für Indikatoren, diw die Kanäle zeichnen, benutzt. Keiner der Puffer darf nicht nur leere Werte erhalten, da in diesem Fall auch für die Erbringung nicht der Fall ist.

Sie können zwei Farbe für Füllen angeben:

  • die erste Farbe ist für die Bereiche, wo die Werte im ersten Indikatorpuffer größer als jene im zweiten Indikator-Puffer sind;
  • die zweite Farbe ist für die Bereiche, wo die Werte im zweiten Indikatorpuffer größer als jene im ersten Indikator-Puffer sind.

Füllfarbe 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.

Der Indikator wird für alle Bars, für die die Werte der beiden Indikatorpuffer nicht gleich 0 sind und nicht gleich dem leeren Wert sind, berechnet. Um anzugeben, welcher Wert als "leer" betrachtet werden sollte, setzen Sie diesen Wert in Eigenschaft PLOT_EMPTY_VALUE:

   #define INDICATOR_EMPTY_VALUE -1.0
   ...
//--- Wert INDICATOR_EMPTY_VALUE (leerer Wert) wird nicht in Berechnungen teil nehmen
   PlotIndexSetDouble(Plot_Index_DRAW_FILLING,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);

Zeichnung auf die Bars, die nicht in die Berechnung des Indikators beteiligt sind, sind von den Werten in den Indikatorpuffern abhängig:

  • Die Bars, für die die Werte der beiden Indikatorpuffer 0 sind, beteiligen nicht in der Zeichnung des Indikators. Das ist ein Bereich mit Null-Werte wird nicht übermalt werden.

DRAW_FILLING_without_drawing

  • Die Bars, für die die Werte der Indikatorpuffer dem leeren Wert gleich sind, beteiligen in der Zeichnung des Indikators. Bereich mit leeren Werten wird übermalt, um die Bereiche mit sinnvollen Werten zu verbinden.

DRAW_FILLING_with_drawing

Es ist wichtig zu beachten, dass, wenn ein "leerer Wert" Null gleich ist, dann werden die Bars, die nicht in die Berechnung des Indikators beteiligen, auch übermalt.

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

Ein Beispiel für einen Indikator, der einen Kanal zwischen zwei MAs mit verschiedenen Perioden der Mitteilung in einem separaten Fenster zeichnet. Farbwechsel beim Überschreiten der MAs zeigt Veränderung der aufsteigenden und absteigenden Trends. Farben variieren zufällig jede N Ticks. Der Parameter N wird in externen Parameter des Indikators angegeben, damit kann es manuell angegeben werden (die Registerkarte "Einstellungen" im Indikatoreigenschaften-Fenster).

DRAW_FILLING

Bitte beachten Sie, dass für plot1 mit dem DRAW_FILLING-Stil werden zwei Farben mithilfe Compiler-Direktive #property angegeben, und dann in der Funktion OnCalculate() werden neue Farben nach dem Zufallsprinzip angegeben.

//+------------------------------------------------------------------+
//|                                                 DRAW_FILLING.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_FILLING"
#property description "Zeichnet in einem separaten Fenster einen Kanal zwischen zwei MAs"
#property description "Füllfarbe des Kanals variiert zufällig"
#property description "jede N Ticks verändert"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Intersection
#property indicator_label1  "Intersection"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  clrRed,clrBlue
#property indicator_width1  1
//--- Eingabeparameter
input int      Fast=13;          // Periode der schnellen MA
input int      Slow=21;          // Periode der schnellen MA
input int      shift=1;          // Verschiebung nach Zukunft (positive)
input int      N=5;              // Anzahl der Ticks für Änderung 
//--- Indicator-Puffer
double         IntersectionBuffer1[];
double         IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- Array, um die Farbe zu speichern
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSlateGray};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,IntersectionBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,IntersectionBuffer2,INDICATOR_DATA);
//---
   PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//---
   fast_handle=iMA(_Symbol,_Period,Fast,0,MODE_SMA,PRICE_CLOSE);
   slow_handle=iMA(_Symbol,_Period,Slow,0,MODE_SMA,PRICE_CLOSE);
//---
   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 erste Berechnung des Indikators, oder Daten haben geändert haben und eine vollständige Neuberechnung ist gebraucht
   if(prev_calculated==0)
     {
      //--- Kopieren wir alle Werte der Indikatoren in die entsprechende Puffer
      int copied1=CopyBuffer(fast_handle,0,0,rates_total,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,rates_total,IntersectionBuffer2);
     }
   else // sparsam füllen nur die Daten, die aktualisiert wurden 
     {
      //--- Erhalten wir die Differenz in Balken zwischen aktuellen und früheren Lauf der OnCalculate()-Funktion
      int to_copy=rates_total-prev_calculated;
      //--- Wenn es keinen Unterschied gibt, kopieren wir nur einen Wert - das Wert auf Null-Balken
      if(to_copy==0) to_copy=1;
      //--- Koperen to_copy Werte an das Ende der Indikator-Puffern
      int copied1=CopyBuffer(fast_handle,0,0,to_copy,IntersectionBuffer1);
      int copied2=CopyBuffer(slow_handle,0,0,to_copy,IntersectionBuffer2);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Ändert die Füllfarbe des Kanals                                  |
//+------------------------------------------------------------------+
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_index1=number%size;
//--- Geben wir die erste Farbe als Eigenschaft PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- Schreiben wir die erste Farbe
   comm=comm+"\r\nColor1 "+(string)colors[color_index1];
 
//--- Erhalten wir den Index als den Rest der ganzzahligen Division, um eine neue Farbe wählen
   number=MathRand(); // Erhalten eine Zufallszahl
   int color_index2=number%size;
//--- Geben wir die zweite Farbe als Eigenschaft PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- Schreiben wir die zweite Farbe
   comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }