//+------------------------------------------------------------------+ //| 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); } |