Bibliotheken: TesterBenchmark

 

TesterBenchmark:

Misst den Nettoerfolg im Strategie Tester von MetaTrader 4/5.

Autor: fxsaber

 

Wir nehmen den Expert Advisor aus der Auslieferung und lassen ihn im Tester laufen, wobei wir diese Leistungsdaten erhalten

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214 s.
iMax = 0 Results[iMax] = 2.231 s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

Nun lassen wir denselben Expert Advisor laufen, aber mit Trade.mqh

------
OnTesterInit
i = 0 Pass = 0 OnTester = 3.330 s.: Count = 3387955, 1017403.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 3.475 s.: Count = 3387955, 974951.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 0 Results[iMin] = 3.330 s.
iMax = 1 Results[iMax] = 3.475 s.
Amount = 2 Mean = 3.402 s. - 89.73%
OnTesterDeinit
------
Interval = 7.584 s., Count = 0, 0.0 unit/sec

Es stellt sich heraus, dass Trade.mqh 1,5 Mal langsamer ist als reines MQL5!

Ich nahm an, dass dies der Grund war und nahm eine kleine Änderung an Trade.mqh vor.

//+------------------------------------------------------------------+
//| Zugriffsfunktionen PositionSelect(...) |
//+------------------------------------------------------------------+
bool CPositionInfo::Select(const string & symbol)
  {
   return(PositionSelect(symbol));
  }

Aber die Bremsen der SB-Variante sind nicht verschwunden.

Wo ist der Hund begraben, dass die SB so langsam ist?

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: TesterBenchmark

fxsaber, 2017.07.24 14:13

Wir nehmen den EA aus der Auslieferung und lassen ihn im Tester laufen und erhalten solche Leistungsdaten.

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214 s.
iMax = 0 Results[iMax] = 2.231 s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

Das war der Optimierungsmodus. Und nun DIESER gleiche EA, aber im Einzellaufmodus

Core 1  2017.07.21 23:59:59   Interval = 5.140 s., Count = 3387955, 659135.2 unit/sec
Core 1  EURUSD,M1: 3387955 ticks, 52608 bars generated. Test passed in 0:00:05.164.

Ein einzelner Lauf auf dem lokalen Agenten ist 2,3 Mal langsamer als auf dem gleichen Agenten, aber im Optimierungsmodus!


Vielleicht sind es die Bremsen des Testers, also schauen wir mal, was das OnTick-Profiling im Optimierungs- und im Einzelausführungsmodus zeigt (Ausführungsprobleme und andere Handelsumgebungen beeinflussen das Ergebnis nicht).


Optimierung

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.910 s.: OnTick Profiler: Count = 3387955, Interval = 0.969 s., 3496753.0 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.862 s.: OnTick Profiler: Count = 3387955, Interval = 0.952 s., 3559797.1 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.862 s.
iMax = 0 Results[iMax] = 2.910 s.
Amount = 2 Mean = 2.886 s. - 78.06%
OnTesterDeinit
------
Interval = 7.394 s., Count = 0, 0.0 unit/sec


Einzelne

Core 1  2017.07.21 23:59:59   Interval = 6.149 s. (Profiler: Count = 3387955, Interval = 4.018 s., 843148.2 unit/sec)
Core 1  EURUSD,M1: 3387955 ticks, 52608 bars generated. Test passed in 0:00:06.162.


Die Nettoausführung von OnTick selbst ist im Einzelausführungsmodus bis zu 4,2 Mal langsamer als im Optimierungsmodus. Und das bei demselben lokalen Agenten!

 
fxsaber:

Ein einzelner Lauf auf dem lokalen Agenten ist 2,3 Mal langsamer als auf dem gleichen Agenten, aber während der Optimierung!

Die gleiche Situation in MT4. Wahrscheinlich sind die Bremsen in MT4 auf die Protokollerstellung während des Einzellaufs zurückzuführen.

 
Die Moral von der Geschicht' ist also: Anstelle eines einzelnen Tests sollten wir eine imaginäre Optimierung für einen einzelnen Wert durchführen?
 

Ich habe mich immer gefragt, welche Handels-API schneller ist - reine MQL4 oder reine MQL5.

Lassen Sie uns daher ein OnTick-Profiling desselben Expert Advisors in MT4/5 durchführen, um den Einfluss der Leistung der Tester selbst auszuschließen.


MT5x64 (Optimierung)

i = 1 Pass = 1 OnTester = 2.862 s.: OnTick Profiler: Count = 3387955, Interval = 0.952 s., 3559797.1 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641


MT4x86 (Einzellauf)

2017.07.24 15:38:10.770 EURUSD,M1: 1044487 tick events (39659 bars, 1045534 bar states) processed in 0:00:01.903 (total time 0:00:01.997)
2017.07.24 15:38:10.770 2017.07.08 22:10:23  TesterBenchmark_Example EURUSD,M1: Interval = 1.878 s. (Profiler: Count = 1044487, Interval = 1.284 s., 813504.6 unit/sec)


Wir können feststellen, dass die gleiche Handelslogik, die in MT4 auf seiner reinen Handels-API und in MT5 auf seiner reinen Handels-API geschrieben wurde, sich in der Geschwindigkeit wie folgt unterscheidet.

MT5 ist 4,4 Mal schneller als MT4! Beachten Sie, dass wir nicht die Geschwindigkeiten der Sprachen, sondern die Geschwindigkeiten der Handels-APIs für denselben TS vergleichen.

 
Stanislav Korotky:
Die Moral von der Geschicht' ist also: Anstelle von Einzeltests sollten wir eine imaginäre Optimierung mit einem einzigen Wert durchführen?

Ja, wenn man will, dass es schnell geht. Gleichzeitig sollte der Handelsbericht vom Agenten übermittelt werden.

Aber ich denke, das ist ein Fehler und sollte behoben werden.


Die Scheinoptimierung auf einen Wert wird nur durch eine weitere Stelle implementiert - man braucht mindestens zwei Durchgänge, um den Optimierer korrekt auszuführen. Der zweite (imaginäre) Durchlauf sollte in OnInit mit INIT_PARAMETERS_INCORRECT return (oder ExpertRemove()) abgefangen werden .

 
fxsaber:

MT5 ist 4,4 Mal schneller als MT4! Beachten Sie, dass wir nicht die Geschwindigkeiten der Sprachen, sondern die Geschwindigkeiten der Handels-APIs für denselben TS vergleichen.

Aber dennoch ist es interessant, wie viel und welcher Tester produktiver ist. Der TS aus der Auslieferung nutzt nicht die Kurshistorie, daher ist er für einen solchen Vergleich besonders gut geeignet.

Wir werden beide Tester im Optimierungsmodus messen, um verschiedene Nuancen zu vermeiden.


MT5 (Optimierung)

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Bibliotheken: TesterBenchmark

fxsaber, 2017.07.24 14:13

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214 s.
iMax = 0 Results[iMax] = 2.231 s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

MT4 (Single).

2017.07.24 15:58:50.775 EURUSD,M1: 1044487 tick events (39659 bars, 1045534 bar states) processed in 0:00:01.513 (total time 0:00:01.607)
2017.07.24 15:58:50.775 2017.07.08 22:11:32  TesterBenchmark_Example EURUSD,M1: Interval = 1.486 s., Count = 1044487, 702884.9 unit/sec


Da Single auch im MT4 langsamer wird, machen wir eine Optimierung und schauen uns die Nettozeit im OnTester an.

Wir erhalten, dass die Geschwindigkeit des MT4-Testers 702884,9 * 1,486 / 0,607 = 1720736,3 Ticks/Sekunde beträgt.


Fazit: MT4-Tester ist ~12% schneller als MT5-Tester.

 
fxsaber:

Aber immer noch fragen, wie viel und welche Tester ist produktiver. Der TS aus der Auslieferung nutzt nicht die Historie der Zitate, daher ist er besonders gut für einen solchen Vergleich geeignet.

D.h. es wird nur ein kugelförmiges Pferd im Vakuum verglichen ) Was ist der Sinn eines Testers ohne Zitate?
 
Alexey Navoykov:
D.h. es wird einfach ein kugelförmiges Pferd im Vakuum verglichen). Was ist der Sinn eines Testers ohne Anführungszeichen?

Der Tester generiert Anführungszeichen, aber der TS selbst verwendet sie nicht, um das Ergebnis nicht durch die Unterschiede in der Implementierung von High[] und CopyHigh zu beeinträchtigen.

Der Tester erstellt die Handelsumgebung, einschließlich der Historie. Und es ist der Tester, den wir gemessen haben, nicht die Benutzeranfragen (nicht zu verwechseln mit der Bildung) der Historie, die in den Plattformen auf grundlegend unterschiedliche Weise implementiert sind.

Das gleiche Problem stellt sich bei der Messung der Leistung von Handels-APIs.

 
fxsaber:

Wir nehmen den Expert Advisor aus der Lieferung und lassen ihn im Tester laufen, wobei wir diese Leistungsdaten erhalten

Nun lassen wir denselben Expert Advisor laufen, aber mit Trade.mqh

Es stellt sich heraus, dass Trade.mqh 1,5 Mal langsamer ist als reines MQL5!

Ich nahm an, dass dies der Grund war und nahm eine kleine Änderung an Trade.mqh vor.

Aber die Bremsen der SB-Variante sind nicht verschwunden.

Wo ist der Hund begraben, dass die SB so langsam ist?

Die Entwickler haben in 1648 etwas nachgebessert und einige Fehler behoben, so dass es mir gelungen ist, die Leistung einer weiteren Handelsbibliothek zu schätzen.

Die aktuelle Situation ist wie folgt.


Reines MQL5

------
OnTesterInit
i = 0 Pass = 0 OnTester = 13.451 s.: Count = 19469844, 1447464.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 10.904 s.: Count = 19469844, 1785569.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 10.895 s.: Count = 19469844, 1787044.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 10.898 s.: Count = 19469844, 1786552.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 10.889 s.: Count = 19469844, 1788028.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 4 Results[iMin] = 10.889 s.
iMax = 0 Results[iMax] = 13.451 s.
Amount = 5 Mean = 11.407 s. - 89.58%
OnTesterDeinit
------
Interval = 63.675 s., Count = 0, 0.0 unit/sec


#include <Trade\Trade.mqh>

------
OnTesterInit
i = 0 Pass = 0 OnTester = 14.390 s.: Count = 19469844, 1353012.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 13.044 s.: Count = 19469844, 1492628.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 13.016 s.: Count = 19469844, 1495839.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 13.014 s.: Count = 19469844, 1496069.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 13.039 s.: Count = 19469844, 1493200.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 3 Results[iMin] = 13.014 s.
iMax = 0 Results[iMax] = 14.390 s.
Amount = 5 Mean = 13.301 s. - 94.05%
OnTesterDeinit
------
Interval = 70.713 s., Count = 0, 0.0 unit/sec


#include <MT4Orders.mqh>

------
OnTesterInit
i = 0 Pass = 0 OnTester = 14.385 s.: Count = 19469844, 1353482.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 11.434 s.: Count = 19469844, 1702802.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 11.459 s.: Count = 19469844, 1699087.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 11.440 s.: Count = 19469844, 1701909.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 11.426 s.: Count = 19469844, 1703994.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 4 Results[iMin] = 11.426 s.
iMax = 0 Results[iMax] = 14.385 s.
Amount = 5 Mean = 12.029 s. - 91.20%
OnTesterDeinit
------
Interval = 65.946 s., Count = 0, 0.0 unit/sec


Die Plätze wurden wie folgt verteilt

  1. Reines MQL5 - 100% Leistung.
  2. MT4Orders.mqh - ~95% Leistung.
  3. SB Trade\Trade.mqh - ~84% Leistung.
SB begann, weniger zu verzögern.


ZЫ Ich frage mich, wie viel andere Handelsbibliotheken zeigen ...

ZЫ2 Was sind das für Bremsen im Jahr 1648 beim ersten Durchlauf eines jeden Pakets? Im Jahr 1643 sah es so aus

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Merkmale der mql5 Sprache, Feinheiten und Techniken der Arbeit

fxsaber, 2017.08.15 17:16

Im ersten Durchlauf eines Stapels von Agentenaufträgen (z. B. in einem einzigen Testlauf) kann die Zeit zwischen dem Start des Expert Advisors und dem ersten NewTick-Ereignis mehrere Sekunden betragen. Bei den nächsten Durchläufen des Stapels ist diese Zeit gleich Null.

Es ist, als ob der Tester sofort ein NewTick-Ereignis im Jahr 1648 erzeugt. Das ist natürlich falsch.