Diskussion zum Artikel "MQL5 Cookbook: Position-Eigenschaften im MetaTrader 5 Strategietester analysieren"
Guten Abend, bitte helfen Sie mir, in der Funktion CheckNewBar wird die statische Variable new_bar in der ersten Zeile auf Null gesetzt, und dann basiert die Logik der Funktion darauf, ob sie gleich Null ist oder nicht. Könnten Sie mir bitte sagen, wo ich etwas nicht verstehe?!?!?!
bool CheckNewBar() { //--- Variable für die aktuelle Öffnungszeit des Balkens static datetime new_bar=NULL; //--- Array zum Abrufen der aktuellen Öffnungszeit des Balkens static datetime time_last_bar[1]={0}; //--- Ermitteln der Eröffnungszeit des aktuellen Balkens // Wenn beim Empfang ein Fehler auftrat, wird dieser gemeldet if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1) { Print(__FUNCTION__,"Fehler beim Kopieren der Öffnungszeit des Balkens: "+IntegerToString(GetLastError())+""); } //--- Wenn dies der erste Funktionsaufruf ist if(new_bar==NULL) { // Einstellen der Uhrzeit new_bar=time_last_bar[0]; Print(__FUNCTION__,": Initialisierung ["+_Symbol+"][TF: "+TimeframeToString(Period())+"][" +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); return(false); // Falsch zurückgeben und beenden } //--- Wenn die Uhrzeit anders ist if(new_bar!=time_last_bar[0]) { new_bar=time_last_bar[0]; // Uhrzeit einstellen und beenden return(true); // Die Uhrzeit merken und true zurückgeben } //--- Wir sind bis zu diesem Punkt gekommen - der Balken ist also nicht neu, also geben wir false zurück return(false); }
Guten Abend, bitte helfen Sie mir, in der Funktion CheckNewBar wird die statische Variable new_bar in der ersten Zeile auf Null gesetzt, und dann basiert die Logik der Funktion darauf, ob sie gleich Null ist oder nicht. Könnten Sie mir bitte sagen, wo ich etwas nicht verstehe?!?!?!
In der Hilfe steht:
Lokale Variablen, die mit dem Schlüsselwort static deklariert sind, behalten ihre Werte für die gesamte Zeit der Existenz der Funktion. Bei jedem nächsten Aufruf der Funktion enthalten solche lokalen Variablen die Werte, die sie beim vorherigen Aufruf hatten.
Das heißt, bei einem neuen Aufruf der Funktion CheckNewBar() behält die Variable new_bar den Wert, den sie beim vorherigen Aufruf der Funktion erhalten hat, aber in der ersten Zeile wird ihr ein neuer Wert NULL...... zugewiesen, und dann ist mir nicht klar, warum all dies und wie es funktioniert. Bitte zerstreuen Sie meine Verwirrung, höchstwahrscheinlich bin ich irgendwo dumm, aber WO ?????
Guten Abend, bitte helfen Sie mir, in der Funktion CheckNewBar wird die statische Variable new_bar in der ersten Zeile auf Null gesetzt, und dann basiert die Logik der Funktion darauf, ob sie gleich Null ist oder nicht. Könnten Sie mir bitte sagen, wo ich etwas nicht verstehe?!?!?!
Wenn ich die Hilfe richtig verstanden habe, heißt es in der Zeilestatic datetimenew_bar=NULL; " Wenn die Anfangswerte nicht angegeben werden, nehmen die Variablen der statischen Speicherklasse Anfangswerte von Null an". Es hätte also gar nicht mit null initialisiert werden dürfen und dann wäre die Logik einwandfrei. Oder nicht ????
Wenn ich die Hilfe richtig verstanden habe, ist die Zeilestatic datetimenew_bar=NULL; " Wenn keine Anfangswerte angegeben werden, nehmen statische Speicherklassenvariablen Null-Anfangswerte an." Es hätte also gar nicht mit null initialisiert werden dürfen und dann wäre die Logik einwandfrei. Oder nicht?
Variablen MÜSSEN immer initialisiert werden. Das ist ein ungeschriebenes Gesetz. Wer es nicht einhält, fängt sich früher oder später sehr schwer zu findende Fehler ein :)
Wie eine statische Variable funktioniert:
//+------------------------------------------------------------------+ //|Test EA.mq5 | //|Copyright © 2018, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" //+------------------------------------------------------------------+ //| Experteninitialisierungsfunktion| //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Experten-Deinitialisierungsfunktion| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Experten-Tick-Funktion| //+------------------------------------------------------------------+ void OnTick() { //--- wir arbeiten nur zum Zeitpunkt der Geburt eines neuen Balkens static datetime PrevBars=0; Print("PrevBars ",PrevBars); datetime time_0=iTime(Symbol(),Period(),0); if(time_0==PrevBars) return; PrevBars=time_0; Print("New bar. PrevBars ",PrevBars); } //+------------------------------------------------------------------+
Ausdrucken auf der Registerkarte Experten. Die allererste Eingabe in OnTick() ist die Initialisierung einer statischen Variablen, eines neuen Balkens.
2018.01.08 00:00:00 PrevBars 1970.01.01 00:00:00 2018.01.08 00:00:00 New bar. PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:30 PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:59 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 New bar. PrevBars 2018.01.08 00:01:00 2018.01.08 00:01:30 PrevBars 2018.01.08 00:01:00 2018.01.08 00:02:00 PrevBars 2018.01.08 00:01:00
Variablen MÜSSEN immer initialisiert werden. Dies ist ein ungeschriebenes Gesetz. Wer es nicht einhält, fängt sich früher oder später sehr schwer zu findende Fehler ein :)
Wie eine statische Variable funktioniert:
Ausdruck auf der Registerkarte Experten. Die allererste Eingabe in OnTick() ist die Initialisierung einer statischen Variablen, eines neuen Balkens.
OK, ich hab's, danke für die knappe und sehr klare Antwort.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel MQL5 Cookbook: Position-Eigenschaften im MetaTrader 5 Strategietester analysieren :
Wir präsentieren hier eine veränderte Version des Expert Advisors aus dem vorangegangenen Beitrag "MQL5 Cookbook: Position-Eigenschaften auf dem Angepassten Info-Panel". Einige der Themen, die wir ansprechen werden, sind: Daten von Bars bekommen, nach neuen Bar-Ereignissen auf dem aktuellen Symbol suchen, eine Handelsklasse der Standard-Library in eine Datei aufnehmen, eine Suchfunktion für Handelssignale und eine Funktion zur Ausführung von Handelsoperationen erzeugen sowie Handelsereignisse in der OnTrade() Funktion festlegen.
So im Grunde ist nun alles fertig und wir können uns dem Testen zuwenden. Mit dem Strategietester können Sie rasch einen Test im Visualisierungsmodus durchführen und Fehler finden, sollten welche vorhanden sein. Die Verwendung des Strategietesters ist auch deshalb von Vorteil, weil Sie Ihre Programme auch an Wochenenden weiter entwickeln können, wenn alle Märkte geschlossen sind.
Richten Sie den Strategietester ein, aktivieren Sie den Visualisierungsmodus und klicken auf 'Start'. Der Expert Advisor beginnt mit dem Handel im Strategietester und Sie sehen ein Bild, das dem unten gezeigten sehr ähnlich ist:
Abb. 2 Visualisierungsmodus im MetaTrader 5 Strategietester.
Autor: Anatoli Kazharski