Analyse der Testergebnisse und Optimierung im MetaTrader 5 Strategie-Tester - Seite 2

 
Anatoli Kazharski:

Der lange Parameter (lparam) wird geprüft. Die Kennung des Tick-Ereignisses ist darin enthalten.

Die Kennung des Benutzerereignisses (int id) ist gleich Null.

Sie kann so geschrieben werden, um sie klarer zu machen:

Ich verstehe, dass alles umgeschrieben werden muss, damit es richtig funktioniert. Ich werde es Ihnen jetzt zeigen.

 
fxsaber:

Ich habe festgestellt, dass alles neu geschrieben werden muss, damit es richtig funktioniert. Ich bin dabei, es zu tun.

Und das kann ich nicht, weil diese Scheiße passiert.

2018.01.28 12:37:23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01.28 12:37:24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0:00.998 (0.09 Kb/sec)
2018.01.28 12:37:24.692 Tester  EURUSD: ticks data begins from 2017.09.01 00:00
2018.01.28 12:37:24.692 Core 1  agent process started
2018.01.28 12:37:33.425 Core 1  connecting to 127.0.0.1:3000
2018.01.28 12:37:50.450 Core 1  tester agent authorization error
2018.01.28 12:37:50.456 Core 1  connection closed
und ich kann das Testprogramm nicht zum Laufen bringen.
 

Indikator

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Expert Advisor

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    Sum2 += GetBid(Symbols[(int)lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, no lag, nur Core1-Agent, echte Ticks 01.09.2017 - 28.01.2018.


Ein Symbol

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677, 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s.: Count = 9986677, 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Zwei Symbole

i = 0 Pass = 0 OnTester = 25.747 s.: Count = 9986677, 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677, 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Drei Symbole

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677, 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s.: Count = 9986677, 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


  1. Im Einzelsymbolmodus ist der "Spion" 2,5 Mal langsamer als der reine OnTick. D.h. der leere Indikator (der auf PERIOD_W1 aufbaut, so dass die Balkenhistorie minimal ist) hat einen enormen Overhead im Tester!
  2. Zwei Symbole sind 3,5 Mal langsamer als ein Symbol.
  3. Aber drei Symbole sind nur 1,8 Mal langsamer als zwei Symbole. D.h. der Übergang von zwei zu drei ist auf die Skalierbarkeit zurückzuführen. im Gegensatz zu Punkt 2.
 

Anatoly, ich schlage vor, das Thema zu Forex-Experten, Handelsrobotern und Expert Advisors zu verschieben und es dort an den Anfang zu stellen.

Auf diese Weise haben Sie es immer im Blick. Es gibt bereits viele Themen, die hier veröffentlicht wurden

 
Rashid Umarov:

Anatoly, ich schlage vor, das Thema zu Forex-Experten, Handelsrobotern und Expert Advisors zu verschieben und es dort an den Anfang zu stellen.

Auf diese Weise haben Sie es immer im Blick. Es gibt bereits viele Themen, die hier veröffentlicht wurden

Ich habe nichts dagegen, wenn das Thema nützlich sein könnte.
 
fxsaber:

...

  1. Im Einzelsymbolmodus ist Spy 2,5 Mal langsamer als reines OnTick. D.h. ein leerer Indikator (der auf PERIOD_W1 aufbaut, so dass die Balkenhistorie minimal ist) hat einen großen Overhead im Tester!
  2. Zwei Symbole sind 3,5 Mal langsamer als ein Symbol.
  3. Aber drei Symbole sind nur 1,8 Mal langsamer als zwei Symbole. Das heißt, der Übergang von zwei zu drei ist auf die Skalierbarkeit zurückzuführen, anders als in Punkt 2.

Ihr Ergebnis ist 6, 25, 46. Warum nicht 6, 12 und 18?

Sie müssen die Verzögerung im Verhältnis zu einem einzelnen Zeichen betrachten. Dann sind drei Zeichen fast 8 Mal langsamer als eines, nicht 3 wie erwartet.

Die Frage ist genau diese. Warum gibt es ein solches Ergebnis bei der Skalierbarkeit? Und wenn das Ergebnis nicht verbessert werden kann, wurde die Option eines neuen Testmodus vorgeschlagen. Dies würde das Problem der langen Tests bei Verwendung mehrerer Zeichen lösen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Analyse der Tests und Optimierung im MetaTrader 5 Strategy Tester

Anatoli Kazharski, 2018.01.27 20:15

Frage:

Ist es möglich, ein solches Multisymbol-Expert Advisor-Schema in MQL zu erstellen, so dass die Dauer der Tests nicht wiederholt ansteigt, wenn Symbole zum Test hinzugefügt werden?

//---

Wenn dies nicht möglich ist, besteht eine der Optionen für die Entwickler des Terminals darin, einen weiteren Modus hinzuzufügen, in dem der Test Symbol für Symbol und nicht alle Symbole auf einmal durchgeführt werden können. Dies würde am Ende die erwartete Testzeit ergeben. Der Punkt ist, dass Multisymbol-EAs sehr oft einfach für die Fälle verwendet werden, in denen:

  1. Für Tests werden mehr Daten benötigt.
  2. Testen des Handelsalgorithmus bei einer größeren Anzahl von Kursverläufen, Bedingungen (Spread, Stop/Limit-Levels) usw. mit denselben Parametern.

Für solche Fälle brauchen wir einen neuen Modus, der es uns ermöglicht, die Dauer der Tests erheblich zu verkürzen und die Parameter zu optimieren. Und schon für den letzten Test, um alle Symbole gleichzeitig zu testen.


 
Anatoli Kazharski:

Ihr Ergebnis ist 6, 25, 46. Warum nicht 6, 12 und 18?

Die Verlangsamung muss in Bezug auf ein Symbol betrachtet werden.

Zwei Charaktere mit Stacheln sind ein ganz anderer Testmodus als ein einzelner Charakter. Daher ist es logisch, die Skalierbarkeit im Verhältnis zu zwei zu betrachten.

Außerdem ist der Indikator über dem Kopf so wild, dass die Arbeit mit den Spionen eine Krücke ist. Waiting for Services, wo die Skalierbarkeit nahezu perfekt sein sollte, bezogen auf ein einziges Symbol. Das gilt auch für den Timer. Nur dass es dort keine Zeckensprünge geben wird.

 
Erheblich beschleunigt
#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnTick( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}


Ein Symbol

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677, 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s.: Count = 9986677, 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Zwei Ziffern

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677, 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s.: Count = 9986677, 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Drei Symbole

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677, 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s.: Count = 9986677, 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Vier Symbole

i = 0 Pass = 0 OnTester = 68.459 s.: Count = 9986677, 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677, 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
 
fxsaber:

Zwei Figuren mit Spionen sind eine ganz andere Arbeitsweise für einen Prüfer als eine einzelne Figur. Daher ist es logisch, die Skalierbarkeit im Verhältnis zu zwei zu betrachten.

Darüber hinaus ist der Indikator oben so wild, dass die Arbeit mit Spionen eine Krücke ist. Waiting for Services, wo die Skalierbarkeit nahezu perfekt sein sollte, bezogen auf ein einziges Symbol. Das gilt auch für den Timer. Nur dass es dort keine Zeckensprünge geben wird.

fxsaber:
Erheblich beschleunigt

Ein Symbol

Zwei Symbole

Drei Zeichen

Vier Zeichen

Wenn wir die Ergebnisse im Verhältnis zu zwei Symbolen betrachten, dann ist das Ergebnis von zwei Symbolen geteilt durch zwei: 17 / 2 = 8,5

Wenn wir dann Symbole hinzufügen, multiplizieren wir diesen Wert mit der Anzahl der Symbole, um die erwartete Testzeit zu erhalten.

  • drei Zeichen: 8,5 * 3 = 25, und die tatsächliche Zeit beträgt35,462 s.
  • vier Zeichen: 8,5 * 4 = 34, während die tatsächliche Zeit68,459 s beträgt.

Aber das ist auf jeden Fall das bisher beste Ergebnis. Eine interessante Variante ist die Verwendung des aktuellen Symbols in OnTick, während der Rest in benutzerdefinierten Ereignissen verwendet wird.

Sie können es benutzen, wenn keine Dienste vorhanden sind.

Dies ist ein Forum für Handel, automatisierte Handelssysteme und Strategietests.

Init() und DeInit() Ausführungsreihenfolge

Slawa, 2017.04.14 10:18

Die Dienste werden u.a. über Handelsfunktionen und die Möglichkeit der Verwaltung von Objekten verfügen. Und Diagramme.

Marktdatenanbieter sind nur eine Möglichkeit.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Init() und DeInit() Ausführungsreihenfolge

Slawa, 2017.04.14 10:21

Die Dienste werden OnTick(string symbol) haben. Aber die Ticks eines bestimmten Symbols müssen abonniert werden

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Init() und DeInit() Ausführungsreihenfolge

fxsaber, 2017.04.14 10:46

Es stellt sich heraus, dass die Dienste fast alle Funktionen von On haben werden: OnInit, OnDeinit, OnTick(string),OnTimer,OnTrade,OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...), OnCalculate, ...

Und wenn Sie keine Indikatorpuffer brauchen und sich nicht mit Indikatoren/Advisoren herumschlagen wollen, schreiben Sie einen neuen Programmtyp - Services -, der keine Einschränkungen hat (die sich aus den früheren Versionen von MT ergeben).

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Reihenfolge der Ausführung von Init() und DeInit()

Slawa, 2017.04.14 10:56

Ganz genau.

Es wird kein OnCalculate geben.

Es gibt noch keine Lösung mit OnChartEvent.

 
Grund der Beschwerde: