|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Ein Zwei meines EA wird anscheinend nie erreicht
Hallo,
Ich habe den unten geposteten EA geschrieben. Es handelt sich um einen kleinen EA, den ich lediglich zu Übungszwecken geschrieben habe. Ein Zweig des EA wird dabei anscheinend nie erreicht. Was der EA machen soll: Zitat:
Im Großen und Ganzen funktioniert der EA, z.B. erhalte ich die Bildschirmausgaben: "Es wurde ein Trade eröffnet!" und "OnInit() Methodenrumpf wurde durchlaufen!" Getestet habe ich das, indem ich die Systemzeit auf 9:xx Uhr eingestellt habe. --- Lediglich das Rücksetzen der Flag-Variablen ab 10 Uhr klappt noch nicht. Das Rücksetzen habe ich getestet, indem ich die Systemzeit auf 09:58 Uhr eingestellt, dann den EA gestartet und bis 10:01 gewartet habe. Es wird dann zunächst, wie erwartet, ein Trade eröffnet. Jedoch funktioniert das Rücksetzen der Flag-Variable offenbar nicht. Konsolenausgaben die bislang nämlich nicht auf der Konsole ausgegeben werden, sind diese: "Zweite IF-Anweisung Ausführungsteil wurde erreiche!" und Flag-Variable wurde wieder zurückgesetzt auf: 0 Der Zweig der offenbar nicht funktioniert oder nicht erreicht wird, ist in dem geposteten Code rot markiert. Daher habe ich den vermeintlich nicht funktionierenden oder nie erreichten Code in einen extra EA ausgelagert um ihn dort zu testen (das ist der zweite von mir gepostete Code). Der Code funktioniert dort bedingt. Ich habe zwei Sachen ausprobiert: Die Systemzeit auf 10 Uhr gestellt, den neuen EA gestartet. DER EA hat dann funktioniert, es kam die folgende Ausgabe: "Stelle 1 wurde erreicht!" "Stelle 2 wurde erreicht!" "Flag-Variable zurückgestellt auf: 0" Dann habe ich noch was probiert: Die Systemzeit auf 9:58 gestellt, den EA erneut gestartet und bis 10:02 gewartet. Ergebnis dann: Sofort nach dem Starten des EA (also um 9:58 Uhr) kam die Ausgabe "Stelle 1 wurde erreicht!" nach bzw. ab 10 Uhr kamen allerdings keine weiteren Ausgaben mehr. Insbesondere wurde offenbar die Flag-Variable nicht zurückgesetzt. Demnach wird womöglich vom EA, aus welchen Gründen auch immer, die Uhrzeit nicht richtig erkannt? Wie könnte ich das Problem lösen? (Worin besteht das Problem?) Die Uhrzeit zum Debuggen in einer globalen Konstante halten, wie in einem anderen Zusammenhang vorgeschlagen, möchte ich nur sehr ungern. Weil ich nach dem Debuggen den EA dann noch mal umstricken müsste (ebenjene Konstante durch TimeLocal() ersetzen. So wie ich mich kenne, würde ich dabei nur witere/neue Fehler einbauen. --- Es folgt noch der angekündige Quellcode. Zunächst der ursprünglich zu debuggende EA, der Zwei der offenbar nie erreicht wird, ist in roter Schrift: Code:
//+------------------------------------------------------------------+ //| Hausaufgabe v17 ab jetzt debuggen.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ // Deklaration und Initialisierung globale Konstanten input int global_BeginnDerHeissenStunde = 9; input double global_SL = 0.95 ; input double global_TP = 1.033; input int global_PositionGroesse = 1; input int global_Slippage = 5; // Deklaration globale Variablen int order_id; bool Flag_Variable; // OnInit() macht hier nichts außer Flag_Variable zu initialisieren und onTick() zu starten. void OnInit() { // Initialisierung Flag_Variable. Die Flaf_Variable signalisiert, ob an dem Tag ab 9 Uhr // bereits ein Trade geöffnet wurde. Flag_Variable = false; OnTick(); Print("OnInit() Methodenrumpf wurde durchlaufen"); } int OnTick() // Der erste Tick ab neun Uhr führt zum öffnen eines Trades, sofern an diesem Tag noch // kein Trade ab neun Uhr geöffnet wurde. { Print("OnTick() Methodenaufruf hat funktioniert und Kopf des Methodenrumpfs wurde erreicht!"); if ((TimeHour(TimeLocal()) == global_BeginnDerHeissenStunde)&& Flag_Variable == false) { Print("Erste IF-Anweisung Ausführunsteil wurde erreicht!"); order_id = OrderSend( Symbol(), OP_BUY, global_PositionGroesse, Bid, global_Slippage, global_SL, global_TP, NULL, 0, 0, clrNONE); Print("Soeben wurde ein Trade geöffnet!"); // Nachdem ein Trade eröffnet wurde, wird die Flag_Variable auf true gesetzt. Flag_Variable = true; Print("Flag-Variable wurde ein neuer Wert zugewiesen: " + Flag_Variable); Print("Ausführungsteil der ersten IF-Anweisung wurde jetzt vollständig durchlaufen!"); } // Nachdem die "heiße" Stunde vorüber ist, wird die Flag_Varaibel wieder auf false gesetzt. if ((TimeHour(TimeLocal()) > global_BeginnDerHeissenStunde) && Flag_Variable == true) { Print("Zweite IF-Anweisung Ausführunsteil wurde erreicht!"); Flag_Variable = false; Print("Flag-Variable wieder zurückgesetzt auf:" + Flag_Variable); } } Und hier noch der Code eines weitern EA. Der oben rot gehaltene Code wurde in diesen EA zu Testzwecken überführt: Code:
int global_BeginnDerHeissenStunde = 9; bool Flag_Variable = true; void OnInit() { Print("Stelle 1 wurde erreicht"); OnTick(); } int OnTick() { //--- if ((TimeHour(TimeLocal()) > global_BeginnDerHeissenStunde) && Flag_Variable == true) { Flag_Variable = false; Print("Flag-Variable wieder zurückgesetzt auf:" + Flag_Variable); Print("Stelle 2 wurde erreicht"); } } Ich freue mich über jeden konstruktiven Hinweis! Besten Dank und Grüße LQK |
|
|||
int OnTick() ?
Warum ist der bool, ob an dem Tag schon ne Order geöffnet wurde, bei init? |
|
|||
Zitat:
Besten Dank für Deine Hilfe. Ich wäre nie von alleine auf die Idee gekommen, dass ein falscher Rückgabewert für OnTick() ein solches Phänomen verursacht. Ist mir im Grunde auch jetzt nicht klar, warum das so ist. Aber Hauptsache, das Problem ist gelöst. Besten Dank noch mal! |
|
|||
Zitat:
Danke aber für den Hinweis, dass der harte Aufruf eigentlich unangemessen ist. Habe das jetzt beseitigt. Durch die Lösung des Grundproblems (siehe mein Post von gerade eben) ist der harte Aufruf auch nicht mehr erforderlich. Alle damit in Zusammenhang stehenden Bugs sind jetzt offenbar dauerhaft verschwunden. |
Lesezeichen |
|
|