//+------------------------------------------------------------------+ //| 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(messages) PrintFormat("%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(messages) Print(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); } |