DRAW_ARROW

Der DRAW_ARROW-Stil zeichnet Pfeile (Zeichen aus dem Wingdings-Satz) der angegebenen Farbe auf den Wert des Indikator-Puffers. Die Breite und die Farbe der Symbole können wie für 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, den Aussehens eines Indikators zu ändern je nach der aktuellen Situation.

Der Symbolcode wird mit der PLOT_ARROW-Eigenschaft eingegeben.

//--- Den Szmbolcode aus Wingdings-Satz für PLOT_ARROW definieren
   PlotIndexSetInteger(0,PLOT_ARROW,code);

Der Standardwert ist PLOT_ARROW=159 (Kreis).

Jeder Pfeil ist eigentlich ein Zeichen, dass die Höhe und den Ankerpunkt hat, und kann einige wichtige Information über den Chart (z. B. der Schlusskurs am Balken) bedecken. Daher können Sie optional den vertikalen Verschiebung in Pixel, die nicht auf der Skala des Charts abhängig ist, angeben. Bei dieser Anzahl von Pixeln werden die Pfeile visuell vertikal verschoben, obwohl der Wert des Indikators gleich bleiben wird:

//--- Definieren wir vertikale Verschiebung der Pfeile in Pixel
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);

Ein negativer Wert von PLOT_ARROW_SHIFT bedeutet Verschiebung des Pfeils nach oben, ein positiver Wert verschiebt den Pfeil nach unten.

DRAW_ARROW-Stil kann in einem separaten Grafikfenster und im Hauptfenster verwendet werden. Leere Werte werden nicht gezeichnet und nicht in den "Data Window" angezeigt, alle Werte in Indikator-Puffern müssen explizit angegeben werden. Puffer werden nicht mit einem leeren Wert initialisiert.

//--- Leerer Wert setzen
   PlotIndexSetDouble(Index_der_Darstellung_DRAW_ARROW,PLOT_EMPTY_VALUE,0);

Die erforderliche Anzahl der Puffer für den Bau von DRAW_ARROW ist 1.

Ein Beispiel des Indikators, der Pfeile auf jeder Balken, dessen Schlussprice Close mehr als Schlusspries des vorherigen Balkens ist, zeichnet.  Die Farbe, Breite, Verschiebung und Zeichencode aller Pfeile werden nach dem Zufallsprinzip jede N Ticks verändert.

Ein Beispiel für den DRAW_ARROW-Stil

In diesem Beispiel, für plot1 mit dem DRAW_ARROW-Stil werden Farbe und Größe mithilfe Compiler-Direktive #Property angegeben, und dann in der Funktion OnCalculate() werden 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_ARROW.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 "Indikator zeigt DRAW_ARROW"
#property description "Auf dem Chart zeichnet es Pfeile, die durch Unicode-Symbole definiert werden"
#property description "Die Farbe, Größe, Verschiebung und Zeichencode des Pfeils werden nach dem Zufallsprinzip"
#property description "jede N Ticks verändert"
#property description "Parameter code gibt den Basiswert an: Code=159 (Kreis)"
 
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Arrows
#property indicator_label1  "Arrows"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen
#property indicator_width1  1
//--- Eingabeparameter
input int      N=5;         // Anzahl der Ticks für Änderung
input ushort   code=159;    // Zeichencode zu zeichnen in DRAW_ARROW
//--- Indicator-Puffer
double         ArrowsBuffer[];
//--- Array, um die Farbe zu speichern
color colors[]={clrRed,clrBlue,clrGreen};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ArrowsBuffer,INDICATOR_DATA);
//--- Geben wir Zeichencode um in PLOT_ARROW zu zeichnen an
   PlotIndexSetInteger(0,PLOT_ARROW,code);
//--- Definieren wir vertikale Verschiebung der Pfeile in Pixel
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5);
//--- Setzen wir 0 als ein leerer Wert
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
   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 die Farbe, Größe, Verschiebung und Code des Pfeils 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;
     }
 
//--- Block mit Berechnung der Indikatorwerte
   int start=1;
   if(prev_calculated>0) start=prev_calculated-1;
//--- Berechnungzyklus
   for(int i=1;i<rates_total;i++)
     {
 //--- Wenn der aktuelle Close-Preis ist höher als der vorherige Close-price, dann setzen den Pfeil
      if(close[i]>close[i-1])
         ArrowsBuffer[i]=close[i];
      //---Ansonsten geben einen leeren Wert an
      else
         ArrowsBuffer[i]=0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Ändert das Aussehen der Zeichen im Indikator                     |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- String um Informationen über die Eigenschaften des Indikators zu erstellen
   string comm="";
//--- Block mit Änderungen der Pfeilfarbe
   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 Pfeilgröße
   number=MathRand();
//--- Erhalten wir die Breite als den Rest der ganzzahligen Division
   int width=number%5;   // die Größe wird von 0 bis 4 angegeben
//--- Geben wir die Farbe als Eigenschaft PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Schreiben wir die Größe der Pfeile
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Block mit Änderungen von Pfeilcode (PLOT_ARROW)
   number=MathRand();
//--- Erhalten wir den Rest aus Integer-Division, um den neuen Pfeilcode zu berechnen (von 0 bis 19)
   int code_add=number%20;
//--- Setzen wir einen neuen Zeichnencode als die Summe von code+code_add
   PlotIndexSetInteger(0,PLOT_ARROW,code+code_add);
//--- Schreiben wir den Zeichencode PLOT_ARROW
   comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;
 
//--- Block mit vertikaler Verschiebung der Pfeile in Pixel
   number=MathRand();
//--- Erhalten wir die Verschiebung als den Rest der ganzzahligen Division
   int shift=20-number%41;
//--- Einstellen wir wine neue Verschiebung von -20 bis 20
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);
//--- Screiben wir die Verschiebung PLOT_ARROW_SHIFT
   comm="\r\n"+"PLOT_ARROW_SHIFT="+IntegerToString(shift)+comm;
 
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }