MetaTrader 5 Strategy Tester: Bugs, Bugs, Verbesserungsvorschläge - Seite 62

 
fxsaber:

1. Entpacken Sie das Archiv in den leeren Terminal-Ordner.


2. Führen Sie das Skript fxsaber\CreateSymbol.ex5 aus.


In wenigen Sekunden wird das Diagramm des benutzerdefinierten Symbols angezeigt.


2. Öffnen Sie den Tester (CTRL+R) und wählen Sie die markierte Einstellung.



3. Klicken Sie im erschienenen Tester-Fenster auf Start.



4. Wenn die ersten Optimierungsergebnisse verfügbar sind, drücken Sie Stopp.


5. Ändern Sie das Startdatum des Intervalls in den Testereinstellungen auf 2019.11.01 und drücken Sie auf Start.


6. Irreführende Werte in den Optimierungsergebnissen (aus der Quelle können Sie ersehen, dass sie sich nicht um mehr als 50 unterscheiden dürfen).


Wiederholen Sie diese Schritte wiederholt. Das Problem wurde zu 100 % reproduziert. Wer es ausprobieren will, soll es mir sagen.

Ich werde es versuchen.

Sie wiederum versuchen es mit den Zecken, mit denen ich versucht habe, zu reproduzieren. MetaQuotes-Demo-Server

1. Ein benutzerdefiniertes Symbol basierend auf CHFJPY aus dem Terminal-Dialog erstellt (nur den Namen geändert)

2. exportierte CHFJPY-Ticks für mehrere Jahre in eine csv-Datei

3. diese Ticks in CHFJPY.custom importiert

4. Führen Sie Ihren Expert Advisor für genetische Optimierung aus. In verschiedenen Kombinationen

 
Slava:

Sie wiederum versuchen es mit den Zecken, mit denen ich versucht habe, zu reproduzieren. MetaQuotes-Demo-Server

Vervielfältigt. Mit dieser Auswahl an Eingängen.


Die Ergebnisse sollten um nicht mehr als 50 voneinander abweichen.


Sortieren Sie in aufsteigender Reihenfolge und vergleichen Sie dann die höchsten und niedrigsten Zeilen.


SZZ Wiederholen Sie die Schritte 3-6 ab hier. Mit den gleichen Daten.

 

Ich habe den ursprünglichen CHFJPY auf MQ-Demo ausprobiert. Ich habe es gespielt!

  1. Stellen Sie das Zeitintervall ein und starten Sie GA.
  2. Wenn die ersten Ergebnisse von allen Agenten kommen, drücke ich auf Stopp.
  3. Wenn ich keine Ergebnisse erhalte, gehe ich zu Schritt 1 über und ändere den Zeitrahmen (nur das Startdatum).
Drei Versuche, und das ist das Ergebnis.

2020.02.21 08:38:14.104 Core 5  genetic pass (0, 252) returned result 965118462.000000 in 0:00:01.114
2020.02.21 08:38:14.114 Core 2  genetic pass (0, 111) returned result 686545176.000000 in 0:00:00.999
2020.02.21 08:38:14.114 Core 2  genetic pass (0, 112) returned result 686545168.000000 in 0:00:01.011
2020.02.21 08:38:14.332 Core 4  genetic pass (0, 76) returned result 1953417341.000000 in 0:00:01.342
2020.02.21 08:38:14.332 Core 8  genetic pass (0, 181) returned result 2212155593.000000 in 0:00:01.419
2020.02.21 08:38:14.395 Core 3  genetic pass (0, 146) returned result 1326263652.000000 in 0:00:01.154
2020.02.21 08:38:14.871 Core 1  genetic pass (0, 2) returned result 1143628048.000000 in 0:00:01.324
 
fxsaber:

Ich habe den ursprünglichen CHFJPY auf MQ-Demo ausprobiert. Ich habe es gespielt!

  1. Stellen Sie das Zeitintervall ein und starten Sie GA.
  2. Wenn die ersten Ergebnisse von allen Agenten kommen, drücke ich auf Stopp.
  3. Wenn ich keine Ergebnisse erhalte, gehe ich zu Schritt 1 über und ändere den Zeitrahmen (nur Startdatum).
Drei Versuche, und das ist das Ergebnis.

Das Gleiche tun. Sie lässt sich nicht reproduzieren.

Zeigen Sie uns die Protokolle der Testagenten!

 
Slava:

Das Gleiche tun. Es wird nicht gespielt.

Geben Sie mir die Protokolle der Testagenten!

Alle Protokolle sind beigefügt.

Dateien:
TesterLogs.zip  56 kb
 
fxsaber:

Ich habe alle Protokolle beigefügt.

Sie reproduzierten das Problem auf einem regulären Forex CHFJPY, nicht einmal eine benutzerdefinierte ein
 
Slava:
Sie reproduzierten das Problem auf einem regulären Forex CHFJPY, nicht einmal eine benutzerdefinierte ein

Ja, und zwar regelmäßig. Da ich neugierig auf die Ticks in den Pässen geworden bin, habe ich dem EA einige Zeilen hinzugefügt.

// Критерий оптимизации - сумма входных параметров + сумма нецелых частей секунды каждого тика (в миллисекундах).

input int inFakeRange1 = 0;
input int inFakeRange2 = 0;
input int inFakeRange3 = 0;
input int inFakeRange4 = 0;
input int inFakeRange5 = 0;

long Sum = inFakeRange1 + inFakeRange2 + inFakeRange3 + inFakeRange4 + inFakeRange5;

MqlTick Ticks[1000];
int Count = 0;

void OnTick()
{
  MqlTick Tick;

  if (SymbolInfoTick(_Symbol, Tick))
  {
    Sum += Tick.time_msc % 1000;
    
    if (MQLInfoInteger(MQL_TESTER) && (Count < ArraySize(Ticks))) // Запоминаем тики
      Ticks[Count++] = Tick;
  }
}

double OnTester()
{
  FrameAdd(__FILE__, Count, Sum, Ticks); // Отправляем тики через фрейм
  
  return((double)Sum);
}

void OnTesterPass( void )
{
  ulong Pass;
  string Name;
  long id;
  double Value;  

  MqlTick Ticks2[];
  
  while (FrameNext(Pass, Name, id, Value, Ticks2)) // Принимаем фрейм-тики
  {
    FileSave(__FILE__ + "\\" + (string)Pass + ".bin", Ticks2); // Сохраняем на диск
    
    Print((string)Pass + " - " + (string)Value);
  }
}


Dann habe ich zwei Dateien genommen und sie mit Hilfe des Skripts verglichen.

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnStart()
{
  MqlTick Ticks1[];
  MqlTick Ticks2[];
  
  const int Size = (int)MathMin(FileLoad("88021.bin", Ticks1), FileLoad("11921.bin", Ticks2)); // Считали тики из файлов.
  
  int Count = 0;
  
  for (int i = 0; (i < Size) && (Count < 10); i++)
    if (_R(Ticks1[i]) != Ticks2[i]) // Если тики отличаются, выводим их значения.
    {
      Print(i);
      
      ArrayPrint(Ticks1, _Digits, NULL, i, 1);
      ArrayPrint(Ticks2, _Digits, NULL, i, 1);
      
      Print("------------");
      
      Count++;
    }
}


Ergebnis.

0
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
1
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
2
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
3
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
4
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
5
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
6
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
7
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
8
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000
------------
9
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.08.28 23:27:03 108.10400 108.12500 0.0000        0 1567034823177     134       0.00000
                 [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.10.11 21:21:11 108.71800 108.74100 0.0000        0 1570828871198       4       0.00000


Die Optimierung wurde ab dem 01.06.2019 durchgeführt. In den Ergebnissen ist deutlich zu erkennen, dass die ersten Ticks von einem anderen Datum stammen. Und diese Daten unterscheiden sich voneinander.


ZS hat eine zusätzliche Prüfung durchgeführt. Die aufgezeichneten Ticks in jedem Deliriumdurchgang ändern sich nicht: Der erste Tick entspricht dem letzten. Im Allgemeinen folgen die GA-Durchgänge einer seltsamen Abfolge von Ticks.

 
fxsaber:

Im Allgemeinen folgen die GA-Durchgänge einer seltsamen Tick-Sequenz.

Reproduziert im Brute-Force-Modus. Das Problem betrifft alle Optimierungsmodi.

 
fxsaber:

Ja, und zwar regelmäßig. Da ich neugierig auf die Ticks in den Pässen geworden bin, habe ich dem EA einige Zeilen hinzugefügt.


Dann habe ich zwei Dateien genommen und sie mit Hilfe des Skripts verglichen.


Ergebnis.


Die Optimierung wurde ab dem 01.06.2019 durchgeführt. In den Ergebnissen ist deutlich zu erkennen, dass die ersten Ticks von einem anderen Datum stammen. Und diese Daten unterscheiden sich voneinander.

Tritt der Effekt nur auf, wenn die vorherige Optimierung über die Schaltfläche "Stopp" vorzeitig abgeschlossen wird? Oder auch mit normaler Kündigung?
 
Slava:
Tritt der Effekt nur auf, wenn die vorherige Optimierung über die Schaltfläche "Stopp" vorzeitig abgeschlossen wird? Oder auch mit normaler Kündigung?

Bevor ich auf Stopp drücke, sehe ich in den Protokollen und in der Optimierungstabelle, dass die fehlerhaften Durchgänge bereits gezählt wurden. Dann drücke ich auf Stopp, denn es hat keinen Sinn, weiterzumachen.

Ich habe die Frage missverstanden.

Ja, in der Regel sollten Sie bei der vorherigen Optimierung mindestens einmal auf Stopp drücken. Aber sobald man auf eine fehlerhafte Optimierung stößt, werden auch alle folgenden fehlerhaft (ich ändere das Zeitintervall nicht mehr).


Vielleicht wird jemand eine Verbindung zur Wiederholung herstellen. Seltsam, dass es bei Ihnen nicht funktioniert, aber bei mir spielt es auf einem sauberen Terminal schnell.


ZS Es wäre gut, eine Art geschlossene Beta mit maximaler Protokollierung auf der Seite des Agenten zu haben. Dann könnten die Protokolle auf meinem Rechner das Problem lokalisiert haben.