MetaTrader 5 Strategy Tester: bug, errori, suggerimenti per il miglioramento - pagina 62

 
fxsaber:

1. Decomprimere l'archivio nella cartella vuota di Terminal.


2. Esegui lo script fxsaber\CreateSymbol.ex5.


In pochi secondi apparirà il grafico del simbolo personalizzato.


2. aprire Tester (CTRL+R) e selezionare l'impostazione contrassegnata.



3. Fare clic su Start nella finestra del Tester apparso.



4. Quando i primi risultati di Ottimizzazione sono disponibili, premere Stop.


5. Cambia la data di inizio dell'intervallo a 2019.11.01 nelle impostazioni del Tester e premi Start.


6. Valori deliranti nei risultati di Optimization (dalla fonte, si può vedere che non possono differire l'uno dall'altro di più di 50).


Ripetete questi passaggi più volte. Il 100% ha riprodotto il problema. Chi lo proverà, me lo faccia sapere.

Ci proverò.

Voi a vostra volta provate con le zecche con cui ho provato a riprodurre. Server MetaQuotes-Demo

1. Creato un simbolo personalizzato basato su CHFJPY dalla finestra di dialogo del terminale (cambiato solo il nome)

2. esportato tick CHFJPY per diversi anni in un file csv

3. importato questi tick in CHFJPY.custom

4. Esegui il tuo Expert Advisor per l'ottimizzazione genetica. In diverse combinazioni

 
Slava:

Voi a vostra volta provate con le zecche con cui ho provato a riprodurre. Server MetaQuotes-Demo

Riprodotto. Con questa gamma di ingressi.


I risultati non dovrebbero differire di più di 50 l'uno dall'altro.


Ordina in ordine crescente, poi confronta le linee più alte e più basse.


SZZ Ripetete i passi 3-6 da qui. Con le stesse date.

 

Ho provato l'originale CHFJPY su MQ-Demo. Giocato!

  1. Impostare l'intervallo di tempo e il GA iniziato.
  2. Quando arrivano i primi risultati di tutti gli agenti, premo Stop.
  3. Se non ottengo alcun risultato, vado al passo 1, cambiando il lasso di tempo (solo la data di inizio).
Tre tentativi e questo è il risultato.

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:

Ho provato l'originale CHFJPY su MQ-Demo. Giocato!

  1. Impostare l'intervallo di tempo e il GA iniziato.
  2. Quando arrivano i primi risultati di tutti gli agenti, premo Stop.
  3. Se non ottengo alcun risultato, vado al passo 1, cambiando il lasso di tempo (solo la data di inizio).
Tre tentativi e questo è il risultato.

Facendo la stessa cosa. Non si riproduce.

Vediamo un po' di registri di agenti tester!

 
Slava:

Facendo la stessa cosa. Non sta giocando.

Datemi i registri degli agenti tester!

In allegato tutti i registri.

File:
TesterLogs.zip  56 kb
 
fxsaber:

Ho allegato tutti i log.

Hai riprodotto il problema su un normale forex CHFJPY, nemmeno su uno personalizzato
 
Slava:
Hai riprodotto il problema su un normale forex CHFJPY, nemmeno su uno personalizzato

Sì, in modo regolare. Mi hanno incuriosito i ticchettii nei passaggi, così ho aggiunto alcune linee all'EA.

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

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);
  }
}


Poi ho preso due file e li ho confrontati usando lo script.

#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++;
    }
}


Risultato.

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


L'ottimizzazione è stata eseguita dal 2019.06.01. Nei risultati si vede chiaramente che le prime zecche sono di una data diversa. E queste date sono diverse l'una dall'altra.


ZS Ha fatto un controllo extra. I tick registrati in ogni passaggio di delirio non cambiano: il primo tick è uguale all'ultimo. In generale, i passaggi di GA seguono una strana sequenza di ticchettii.

 
fxsaber:

In generale, i passaggi di GA seguono alcune strane sequenze di tick.

Riprodotto in modalità forza bruta completa. Il problema riguarda tutte le modalità di ottimizzazione.

 
fxsaber:

Sì, in modo regolare. Mi hanno incuriosito i ticchettii nei passaggi, così ho aggiunto alcune linee all'EA.


Poi ho preso due file e li ho confrontati attraverso lo script.


Risultato.


L'ottimizzazione è stata eseguita dal 2019.06.01. Nei risultati si vede chiaramente che le prime zecche sono di una data diversa. E queste date sono diverse l'una dall'altra.

L'effetto appare solo quando si completa l'ottimizzazione precedente in anticipo dal pulsante "Stop"? O anche con la terminazione normale?
 
Slava:
L'effetto si verifica solo quando si completa l'ottimizzazione precedente in anticipo dal pulsante "Stop"? O anche con la terminazione normale?

Prima di premere Stop, vedo nei log e nella tabella Optimization che i passaggi errati sono già stati contati. Poi premo Stop, perché non ha senso continuare.

Hai frainteso la domanda.

Sì, come regola, si dovrebbe premere Stop almeno una volta sulla precedente Ottimizzazione. Ma non appena si colpisce un'ottimizzazione errata, tutte le successive diventano errate (non cambio più l'intervallo di tempo).


Forse qualcuno si collegherà al replay. Strano che non funzioni per te, ma per me su un terminale pulito gioca velocemente.


ZS Sarebbe bene avere una sorta di beta chiusa con il massimo di registrazione sul lato Agents. Allora i log della mia macchina possono aver localizzato il problema.