DRAW_HISTOGRAM2

DRAW_HISTOGRAM2-Stil zieht ein Histogramm der angegebenen Farbe - die vertikalen Segmente auf die Werte der zwei Indikator-Puffer. Die Breite, Farbe und Stil der Segmenten 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 des Histogramms je nach der aktuellen Situation zu ändern.

DRAW_HISTOGRAM2-Stil kann in einem separaten Grafikfenster und inm Hauptfenster verwendet werden. Leere Werte werden nicht gezeichnet, alle Werte in Indikator-Puffern müssen explizit angegeben werden. Puffer werden nicht mit einem leeren Wert initialisiert.

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

Ein Beispiel für einen Indikator, der zeichnet eine vertikale Säule der angegebenen Farbe und Breite zwischen Open und Close. Die Farbe, Breite und Stil aller Säule des Histogramms werden nach dem Zufallsprinzip jede N Ticks verändert. Beim Start des Indikators in der OnInit()-Funktion wird die Nummer des Wochentags, für den das Histogramm nicht gezeichnet wird, zufällig eingegeben – invisible_day. Dazu wird ein leerer Wert eingegeben PLOT_EMPTY_VALUE=0:

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

Ein Beispiel des Stils DRAW_HISTOGRAM2

Bitte beachten Sie, dass für plot1 mit dem DRAW_HISTOGRAM2-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_HISTOGRAM2.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_HISTOGRAM2"
#property description "Zeichnet ein Segment auf jedem Balken zwischen Open und Close"
#property description "Farbe, Breite und Stil werden zufällig"
#property description "jede N Ticks verändert"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot Histogram_2
#property indicator_label1  "Histogram_2"
#property indicator_type1   DRAW_HISTOGRAM2
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      N=5;              // Anzahl der Ticks um Histogram zu ändern
//--- indicator buffers
double         Histogram_2Buffer1[];
double         Histogram_2Buffer2[];
//--- 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()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Histogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Histogram_2Buffer2,INDICATOR_DATA);
//--- Leerer Wert setzen
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- Erhalten eine Zufallszahl von 0 bis 5
   invisible_day=MathRand()%6;
//---
   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();
      //--- Setzen wir den Zähler der Ticks auf Null
      ticks=0;
     }
 
//--- Berechnen der Indikatorwerte
   int start=0;
//--- Um den Wochentag durch den Öffnungszeiten jedes Balkens
   MqlDateTime dt;
//--- 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++)
     {
      TimeToStruct(time[i],dt);
      if(dt.day_of_week==invisible_day)
        {
         Histogram_2Buffer1[i]=0;
         Histogram_2Buffer2[i]=0;
        }
      else
        {
         Histogram_2Buffer1[i]=open[i];
         Histogram_2Buffer2[i]=close[i];
        }
     }
//--- den Wert prev_calculated für den nächsten Anruf der Funktion zurückgeben
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Ändert das Aussehen der Linien im Indikator                      |
//+------------------------------------------------------------------+
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_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
//--- Linienbreite angeben
   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;
//--- Linienart angeben
   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\nUngezeichnetert Tag - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Zeigen wir Informationen auf dem Chart durch den Kommentar
   Comment(comm);
  }