MT5-Strategietester bleibt stehen

 

Moin allerseits,

bei einigen selbstentwickelten EAs habe ich hin und wieder das Problem, dass der Strategietester bei der genetischen Optimierung mittendrin "stehenbleibt".

D.h., er rechnet an einer Stelle x nicht mehr weiter, ist jedoch noch lange nicht fertig. Die Anzeige der einzelnen CPU-Kerne im Tester bleibt dann auch mittendrin stehen. Es deutet nichts auf eine Endlosschleife hin, da die entsprechenden Prozesse in der CPU-Anzeige des OS (Linux) keine/kaum Last anzeigen.

Im Journal steht nichts außergewöhnliches. Kein Hinweis.

Der MT5 reagiert einwandfrei und der Testlauf lässt sich auch problemlos beenden.


Es scheint so, dass es den Tester an irgendeiner Stelle stört, wenn ich das prozentuale Risiko (Lotgröße) und den Take Profit (%) gleichzeitig optimiere. Wahrscheinlich spielen andere Faktoren auch noch eine Rolle ... *kopfkratz*


Die EAs laufen sonst problemlos und einwandfrei, CPU-Last auch normal niedrig. Es gibt auch keinen eingebauten OnTest-Event im EA.

Hat hier jemand dieses Problem auch schon mal gehabt?

Irgendein Tip?


Vielen Dank für die Aufmerksamkeit.

 

Stell mal im Log Full ... an:


Und warte bis einer der 'langen' sich beendet und dann starte den im visuellen Modus. Dann kannst Du sehen zu welchem Zeitpunkt sich etwas verändert und gezielt dort mit dem Debugger starten....

 

Hallo Carl,

danke für die Info.

Ich habe das eben mal auf Log Full umgestellt.


Nur sind die Logs da auch nicht sehr gesprächig - vorsichtig ausgedrückt.

Was bis jetzt aufgefallen ist: Manche Durchläufe (genetic pass) macht der Tester nicht, sondern stellt sie hinten an. Bis er diese Meldung ins Log schreibt vergehen dann schonmal 6min, was für einen einzigen Durchlauf und fast 5*10^56 Möglichkeiten eine Ewigkeit ist und Stillstand bedeutet:

2023.05.12 17:41:36.909 Core 5  genetic pass (8, 382) returned result 40.68 in 0:00:04.470
2023.05.12 17:41:37.577 Core 6  genetic pass (8, 383) returned result 0.00 in 0:00:03.167
2023.05.12 17:47:18.376 Tester  genetic pass (8, 360) not processed and added to task queue
2023.05.12 17:47:18.376 Tester  genetic pass (8, 361) not processed and added to task queue
2023.05.12 17:47:18.376 Tester  genetic pass (8, 362) not processed and added to task queue
2023.05.12 17:47:18.376 Core 2  genetic pass (8, 360, 1) started
2023.05.12 17:47:18.376 Core 4  genetic pass (8, 361, 1) started
2023.05.12 17:47:18.377 Core 5  genetic pass (8, 362, 1) started
2023.05.12 17:47:20.764 Core 5  genetic pass (8, 362) returned result 37.02 in 0:00:02.381
2023.05.12 17:47:25.243 Core 4  genetic pass (8, 361) returned result 0.00 in 0:00:06.861
2023.05.12 17:53:02.343 Tester  genetic pass (8, 360) not processed and added to task queue
2023.05.12 17:53:02.343 Core 4  genetic pass (8, 360, 1) started 
2023.05.12 17:58:46.310 Tester  genetic pass (8, 360) not processed and added to task queue
2023.05.12 17:58:46.310 Core 5  genetic pass (8, 360, 1) started
2023.05.12 18:04:30.283 Tester  genetic pass (8, 360) not processed and added to task queue
2023.05.12 18:04:30.283 Core 6  genetic pass (8, 360, 1) started

Warum er das macht, bzw. welche Parameter er an dieser Stelle anwendet sieht man nicht.

Es gibt im EA auch die Möglichkeit nur halbautomatisch zu handeln, in dem man z.B. Trendlinien einzeichnet, welche dann ein Ereignis auslösen. Diese Möglichkeit ist auch in den zu iterierenden Testparametern mit enthalten, jedoch müsste der Tester ja merken, dass an dieser Stelle kein Trade zustande kommt, so dass er diesen Zweig dann nicht weiter verfolgt.


Der obige Durchlauf (8, 360) taucht in den Optimierungsergebnissen natürlich nicht auf, so dass man hier auch keine Parameter abgreifen kann, um einen Hinweis zu erhalten.


Die Frage ist: wie komme ich an die angewendeten Parameter des Testdurchlaufes (8, 360)?


ABER:

Das mit dem visuellen Modus im Anschluss ist ein echt guter Hinweis. Danke!

 

Leider wird nicht protokolliert welcher Durchlauf mit welchem Parametersatz gestartet wurde, aber wenn er beendet wurde gibt es so einen Eintrag:

GL    0    23:58:54.122    MQL5 Cloud USA    genetic pass (16, 474) returned result 190.846251 in 0:04:05.210 (PR 232)

Dann kann man mit Ergebnis (hier 190.846251 ) oder pass (16, 474) die Parameter in der Ergebnistabelle finden. Umständlich zwar, aber es geht.

Noch ein Tipp, wenn der Saldo zB. 10% vom Anfangssaldo erreicht hat, mach einen ExpertRemove(). Das beendet den Lauf und spart Zeit und CO² :)

 

Die ExpertRemove-Funktion kannte ich noch nicht. Danke.

Die "rechenaufwendigeren" Funktionen laufen jedoch nur 1x pro neuer Kerze. Mit einem ExpertRemove würde der Lauf dann bei Deinem Beispiel bei 10% abbrechen, ich hätte jedoch auch gerne mehr - oder habe ich da einen Denkfehler?

 
paul3000 #:

Die ExpertRemove-Funktion kannte ich noch nicht. Danke.

Die "rechenaufwendigeren" Funktionen laufen jedoch nur 1x pro neuer Kerze. Mit einem ExpertRemove würde der Lauf dann bei Deinem Beispiel bei 10% abbrechen, ich hätte jedoch auch gerne mehr - oder habe ich da einen Denkfehler?

Naja in OnInit() Abbruchkriterium bestimmen: XRmv = AccountInfoDouble(ACCOUNT_BALANCE) * 0.1; // <= initial deposit

Und dann in OnTick(): if ( XRmv > AccountInfoDouble(ACCOUNT_BALANCE) ) ExpertRemove().

Es könnte doch sein, dass durch eine seltene Konfiguration plötzlich eine Art Endlosschleife entsteht.

Da im Tester alle Zeiten Testzeiten sind müsste man auf kernel32.dll von Windows zurückgreifen: https://www.mql5.com/en/forum/159797/page2#comment_24891782
Dann könntest Du auch ein ExpertRemove() machen, wenn ein Durchlauf zu lange dauert, also zB 10 Mal die Durchschnittszeit eines Durchlaufs - müsst man aber vorher messen und 'hart' programmieren.#

Du könntest es aber auch hiermit ausprobieren: https://www.mql5.com/en/docs/common/getmicrosecondcount - da steht nix, dass der Tester die Zeit modelliert.

Ich hoffe, dass auch bei ExpertRemove ein entsprechender Eintrag in der Tabelle erfolgt - das habe ich noch nicht getestet.

Does anyone know how to use the GetSystemTime() function from kernel32.dll ? - How to change computer clock and local time?
Does anyone know how to use the GetSystemTime() function from kernel32.dll ? - How to change computer clock and local time?
  • 2016.08.04
  • www.mql5.com
I need to change the computer clock to the broker time automatically. I would to write setlocaltime() on the title and not getsystemtime(). But i just found about how to use  getsystemtime()/ getlocaltime()  in mql4, but nothing about   setsystemtime()/ setsystemtime()