DRAW_COLOR_HISTOGRAM

DRAW_COLOR_HISTOGRAM-Stil zeichnet ein Histogramm der Farbsäulen von Null bis den angegebenen Wert. Die Werte werden aus den Indikator-Puffer aufgenommen. Jede Säule kann eine eigene Farbe aus einer vorgegebenen Satz von Farben haben.

Die Breite, Farbe und Stil des Histogramms können wie für DRAW_HISTOGRAM 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 des Histogramms je nach der aktuellen Situation zu ändern.

Da wird auf jeden Balken eine Säule von Null-Ebene gezeichnet, dann wird DRAW_COLOR_HISTOGRAM besser für Zeichnung in einem separaten Fenster verwendet. Meistens wird diese Art der graphischen Konstruktion an einen Oszillator Art von Indikatoren, z.B. Awesome Oscillator oder Market Facilitation Index verwendet. Für leere nicht gezeichnete Werte ist es genug Null-Werte anzugeben.

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

  • ein Puffer für die Speicherung von Nicht-Null vertikales Segment an jedem Balken, ist das zweite Ende des Segments immer an der Null-Linie des Indikators;
  • ein Puffer, um die Farbindex des Segments (es its sinnvoll nur für Nicht-leere Werte) zu speichern.

Farben können mit der Compiler-Direktive #property indicator_color1 durch Kommas angegeben werden. Die Anzahl der Farben darf maximal 64 sein.

Ein Beispiel für einen Indikator, der eine Sinuskurve der angegebenen Farbe auf Funktion MathSin() zeichnet. Die Farbe, Breite und Stil aller Säule des Histogramms werden nach dem Zufallsprinzip jede N Ticks verändert. Parameter bars gibt den Zeitraum der Sinuskurve, d.h. in einer bestimmten Anzahl von Balken wird die Sinuskurve ihren Zyklus wiederholen.

Ein Beispiel für DRAW_COLOR_HISTOGRAM

Bitte beachten Sie, dass für plot1 mit dem DRAW_COLOR_HISTOGRAM-Stil ursprünglich 5 Farben mit Compiler-Direktiven #property angegeben werden, und dann, in der OnCalculate()-Funktion, werden die Farben nach dem Zufallsprinzip aus 14 Farben, die in Array colors[] gespeichert sind, ausgewählt. Der Parameter N wird in externen Parametern des Indikators angegeben, damit kann es manuell angegeben werden (die Registerkarte "Einstellungen" im Indikatoreigenschaften-Fenster).

//+------------------------------------------------------------------+
//|                                         DRAW_COLOR_HISTOGRAM.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_COLOR_HISTOGRAM"
#property description "Zeichnet die Sinuskurve als ein Histogram in einem separaten Fenster"
#property description "Farbe und Breite der Säulen werden zufällig"
#property description "jede N Ticks verändert"
#property description "Parameter bars setzt die Anzahl der Balken um die Sinuskurve zu wiederholen"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- Eingabeparameter
input int      bars=30;          // Zeitraum der Sinuskurve in Balken
input int      N=5;              // Anzahl der Ticks um Histogram zu ändern
//--- plot Color_Histogram
#property indicator_label1  "Color_Histogram"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
//--- Definieren wir 8 Farben um Segmente zu färben (sie sind im speziellen Array gespeichert)
#property indicator_color1  clrRed,clrGreen,clrBlue,clrYellow,clrMagenta,clrCyan,clrMediumSeaGreen,clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- Puffer mit Werte
double         Color_HistogramBuffer[];
//--- Puffer mit Farbindizes
double         Color_HistogramColors[];
//--- Faktor für 2Pi Winkel im Bogenmaß durch Multiplikation mit der Parameter bars
double         multiplier;
int            color_sections;
//--- Array, um die Farbe zu speichern, enthält 14 Elemente
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//--- 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()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Color_HistogramBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,Color_HistogramColors,INDICATOR_COLOR_INDEX);
//---- Anzahl der Farben um die Sinuskurve zu färben
   color_sections=8;   //  Sehen Sie Kommentar zur Eigenschaft #property indicator_color1
//--- Berechnen wir den Multiplikator
   if(bars>1)multiplier=2.*M_PI/bars;
   else
     {
      PrintFormat("Geben Sie den Wert von bars=%d größer als 1",bars);
      //--- Vorzeitige Beendigung des Indikators
      return(INIT_PARAMETERS_INCORRECT);
     }  
//---
   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();
      //--- Ändern wir die Farben des Histogramms
      ChangeColors(colors,color_sections);      
      //--- Setzen wir den Zähler der Ticks auf Null
      ticks=0;
     }
 
//--- Berechnen der Indikatorwerte
   int start=0;
//--- Wenn die Berechnung auf einem vorherigen Lauf von OnCalculate gemacht war
   if(prev_calculated>0) start=prev_calculated-1; // Setzen wir den Beginn der Berechnung auf dem vorletzten Balken
//--- Füllen den Indikator-Puffer mit Werte
   for(int i=start;i<rates_total;i++)
     {
      //--- Wert
      Color_HistogramBuffer[i]=sin(i*multiplier);
      //--- Farbe
      int color_index=i%(bars*color_sections);
      color_index/=bars;
      Color_HistogramColors[i]=color_index;
     }
//--- den Wert prev_calculated für den nächsten Anruf der Funktion zurückgeben
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Ändert die Farbe der Linienteile                                 |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- Anzahl der Farben
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- Für jede Farbeindex definieren wir eine neue Farbe zufällig
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- erhalten wir eine Zufallszahl
      int number=MathRand();
      //--- Erhalten wir den Index in Array col[] als den Rest der ganzzahligen Division
      int i=number%size;
      //--- Geben wir die Farbe für jeden Index als Eigenschaft PLOT_LINE_COLOR an
      PlotIndexSetInteger(0,                    //  Nummer der Grafikstile
                          PLOT_LINE_COLOR,      //  Property Identifier
                          plot_color_ind,       //  Farbindex, in dem wir die Farbe schreiben
                          cols[i]);             //  neue Farbe
      //--- schreiben wir die Farbe
      comm=comm+StringFormat("HistogramColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+------------------------------------------------------------------+
//| Ändert das Aussehen der angezeigten Linie im Indikator           |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- String um Informationen über die Eigenschaften der Linie zu erstellen
   string comm="";
//--- Block mit Änderungen der Linienbreite
   int 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+" Width="+IntegerToString(width);
 
//--- Block mit Änderungen des Linienstils
   number=MathRand();
//--- Teiler der Zahl entspricht der Größe des Arrays styles
   int 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=EnumToString(styles[style_index])+", "+comm;
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }