DRAW_CANDLES

DRAW_CANDLES-Stil zeichnet Kerzen auf den Werten der vier Indikator-Puffer, die die Preise Open, High, Low und Close enthalten. Es erlaubt individuelle Indikatoren in Form von Kerzen, darunter ein in separates Grafikfenster und andere Finanzinstrumente, zu erstellen.

Kerzenfarbe 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 "wiederzubeleben" so, dass sie ihr Aussehen ändern je nach der aktuellen Situation.

Der Indikator wird nur für die Balken, für die nicht leere Werte aller vier Indikator-Puffer angegeben werden, gezeichnet. Um anzugeben, welcher Wert als "leer" betrachtet werden soll, setzen Sie diesen Wert in der Eigenschaft PLOT_EMPTY_VALUE:

//--- Der leere Wert (0) wird nicht beim Zeichnen berücksichtigt
   PlotIndexSetDouble(Index_der_Darstellung_DRAW_CANDLES,PLOT_EMPTY_VALUE,0);

Füllen Sie die Indikator-Puffer immer explizit mit Werten aus; geben Sie den leeren Wert auf den Balken in Puffern ein, die übersprungen werden müssen.

Die erforderliche Anzahl der Puffer für den Bau von DRAW_CANDLES ist 4. Alle Puffer sollen in dieser Reihenfolge erscheinen: Open, High, Low und Close. Keiner der Puffer darf nur leere Werte beinhalten, denn in diesem Fall wird nicht gezeichnet.

Für den Stil DRAW_CANDLES kann man eine bis drei Farben setzen, davon hängt das Aussehen von Kerzen ab. Wenn nur eine Farbe angegeben ist, werden alle Farben auf dem Chart diese Farbe haben.

//--- gleiche Kerzen, die die gleiche Farbe haben
#property indicator_label1  "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- es wurde nur eine Farbe angegeben, deswegen haben alle Kerzen die gleiche Farbe
#property indicator_color1  clrGreen  

Wenn man zwei Farben (durch Komma getrennt) angibt, dann werden der Umriss der Kerze mit der ersten Farbe und der Körper - mit der zweiten gezeichnet.

//--- die Farbe der Kerzen unterscheidet sich von der Farbe der Schatten
#property indicator_label1  "Two color candles"
#property indicator_type1   DRAW_CANDLES
//--- Schatten und Umriss - grün, Körper - weiss
#property indicator_color1  clrGreen,clrWhite 

Damit bärische und bullische Kerzen unterschiedlich angezeigt werden, muss man drei Farben, getrennt durch Komma, angeben. In diesem Fall wird der Umriss der Kerze die erste Farbe, bullische Kerze - die zweite und bärische Kerze - die dritte Farbe haben.

//--- die Farbe der Kerzen unterscheidet sich von der Farbe der Schatten
#property indicator_label1  "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- die Schatten und der Umriss sind grün, der Körper der bärischen Kerze ist weiß, der Körper der bärischen Kerze ist rot
#property indicator_color1  clrGreen,clrWhite,clrRed

Auf diese Weise kann man mithilfe des Stils DRAW_CANDLES eigene benutzerdefinierte Varianten der Kerzenfarben gestalten. Alle Farben können beim Laufen des Indikators mithilfe der Funktion PlotIndexSetInteger(Index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_nummer, Farbe) geändert werden, wobei:

  • 0 – Farbe des Umrisses und der Schatten
  • 1– Farbe des Körpers der bullischen Kerze
  • 2 – Farbe des Körpers der bärischen Kerze

//--- setzen wir die Farbe für den Umriss und die Schatten
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
//--- setzen wir die Farbe für den Körper der bullischen Kerze
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
//--- setzen wir die Farbe für den Körper der bärischen Kerze
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);

Ein Beispiel für einen Indikator, der Kerzen des Finanzinstrumenten in einem separaten Fenster zeichnet. Die Kerzenfarbe wird zufällig alle N Ticks verändert. Der Parameter N wird in externen Parameter des Indikators angegeben, damit kann es manuell angegeben werden (die Registerkarte "Einstellungen" im Indikatoreigenschaften-Fenster).

Ein Beispiel für den DRAW_CANDLES-Stil

Bitte beachten Sie, dass für Plot1 die Farbe mit Compiler-Direktiven #property angegeben wird, und dann in der Funktion OnCalculate() wird die Farbe nach dem Zufallsprinzip aus einer vorbereiteten Liste ausgewählt.

//+------------------------------------------------------------------+
//|                                                 DRAW_CANDLES.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 zeigt DRAW_CANDLES."
#property description "Zeichnet in einem separaten Fenster verschiedenfarbige Kerzen des ausgewählten Symbols"
#property description " "
#property description "Die Farbe und Größe der Kerzen und der Symbol werden nach dem Zufallsprinzip "
#property description "jede N Ticks verändert."
 
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot Bars
#property indicator_label1  "DRAW_CANDLES1"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
 
//--- Eingabeparameter
input int      N=5;              // Anzahl der Ticks um Art zu ändern
input int      bars=500;         // Anzahl der Balken zu zeigen
input bool     messages=false;   // Ausgabe der Meldungen ins"Experts"-Journal
//--- Indicator-Puffer
double         Candle1Buffer1[];
double         Candle1Buffer2[];
double         Candle1Buffer3[];
double         Candle1Buffer4[];
//--- Symbolname
string symbol;
//--- Array, um die Farbe zu speichern
color colors[]={clrRed,clrBlue,clrGreen,clrPurple,clrBrown,clrIndianRed};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- wenn es gibt zu wenig bars, Arbeit früher vollenden
   if(bars<50)
     {
      Comment("Geben Sie eine größere Anzahl von Bars! Arbeit des Indikators ist beendet");
      return(INIT_PARAMETERS_INCORRECT);
     }
//--- indicator buffers mapping
   SetIndexBuffer(0,Candle1Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Candle1Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Candle1Buffer3,INDICATOR_DATA);
   SetIndexBuffer(3,Candle1Buffer4,INDICATOR_DATA);
//--- Leerer Wert
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Name des Symbols, für das die Balken gezeichnet werden
   symbol=_Symbol;
//--- Einstellen wir Anzeige des Symbols
   PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
   IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_CANDLES("+symbol+")");
//---
   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=INT_MAX-100;
//--- 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)
     {
 //--- Wählen wir ein neues Symbol aus dem "Market Watch"
      symbol=GetRandomSymbolName();
      //--- Ansicht verändern
      ChangeLineAppearance();
 //--- Wählen wir ein neues Symbol aus dem "Market Watch"
      int tries=0;
      //--- Machen wir 5 Versuche, um den Puffer plot1 mit Preise aus symbol zu füllen
      while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
            Candle1Buffer1,Candle1Buffer2,Candle1Buffer3,Candle1Buffer4)
            && tries<5)
        {
         //--- Zähler der CopyFromSymbolToBuffers() Funktionsaufrufe
         tries++;
        }
      //--- Setzen wir den Zähler der Ticks auf Null
      ticks=0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Füllt die angegebene Kerze                                       |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
                             int total,
                             int plot_index,
                             double &buff1[],
                             double &buff2[],
                             double &buff3[],
                             double &buff4[]
                             )
  {
//--- In die Array rates[] kopieren wir Preise Open, High, Low und Close
   MqlRates rates[];
//--- Zähler der Versuche
   int attempts=0;
//--- Wieviel kopiert
   int copied=0;
//--- Machen wir 25 Versuche, um die Zeitreihe für das gewünschten Symbol zu erhalten
   while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
     {
      Sleep(100);
      attempts++;
      if(messagesPrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
     }
//--- Wenn es gelang nicht eine ausreichende Anzahl von Balken zu kopieren
   if(copied!=bars)
     {
      //--- erstellen wir einen Nachrichtenstring
      string comm=StringFormat("Für Symbol %s konnte nur %d Balken von %d gefragten Balken erhalten",
                               name,
                               copied,
                               bars
                               );
      //--- Zeigen wir einer Nachricht in einer Kommentar auf dem Haupt-Chart-Fenster
      Comment(comm);
      //--- Anzeige von Informationen
      if(messagesPrint(comm);
      return(false);
     }
   else
     {
      //--- Einstellen wir Anzeige des Symbols 
      PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
     }
//--- Initialisieren wir den Puffer leere Werte
   ArrayInitialize(buff1,0.0);
   ArrayInitialize(buff2,0.0);
   ArrayInitialize(buff3,0.0);
   ArrayInitialize(buff4,0.0);
//--- Kopieren wir Preise in den Puffer bei jedem Tick
   for(int i=0;i<copied;i++)
     {
 //--- Berechnen wir den entsprechenden Index für den Puffer
      int buffer_index=total-copied+i;
 //--- Schreiben wir die Preise in Puffer
      buff1[buffer_index]=rates[i].open;
      buff2[buffer_index]=rates[i].high;
      buff3[buffer_index]=rates[i].low;
      buff4[buffer_index]=rates[i].close;
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Gibt ein zufälliges Symbol aus dem Market Watch zurück           |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
  {
//--- Anzahl der in dem "Market Watch" Fenster angezeigten Symbole
   int symbols=SymbolsTotal(true);
//--- Position des Symbols in der Liste - eine Zufallszahl zwischen 0 und symbols
   int number=MathRand()%symbols;
//--- Gibt den Namen des Symbols an der angegebenen Position zurück
   return SymbolName(number,true);
  }
//+------------------------------------------------------------------+
//| Ändert das Aussehen von Balken                                   |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- String um Informationen über die Eigenschaften der Balken zu erstellen
   string comm="";
//--- Block mit Änderungen der Balkenfarbe
   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 Farbe
   comm=comm+"\r\n"+(string)colors[color_index];
//--- Schreiben wir den Namen des Symbols
   comm="\r\n"+symbol+comm;
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }