MetaTrader 5 Strategy Tester: bugs, bugs, sugestões para melhorias - página 62

 
fxsaber:

1. Descompacte o arquivo para a pasta Terminal vazia.


2. Executar o guião fxsaber\ Crie o Símbolo.ex5.


Dentro de alguns segundos aparecerá o gráfico do símbolo personalizado.


2. abrir o Testador (CTRL+R) e seleccionar a configuração marcada.



3. Clique em Start na janela Apareceu o Testador.



4. Quando os primeiros resultados da Optimização estiverem disponíveis prima Stop.


5. Alterar a data de início do intervalo para 2019.11.01 nas Definições do Testador e premir Start.


6. Delirious values in Optimization results (da fonte, pode-se ver que eles não podem diferir um do outro em mais de 50).


Repetidos estes passos repetidamente. 100% reproduziu o problema. Quem o vai experimentar, avise-me.

Vou tentar.

Por sua vez, tente com os carrapatos com que tentei reproduzir. MetaQuotes-Demo server

1. Criado a partir do diálogo terminal um símbolo personalizado baseado em CHFJPY (alterou apenas o nome)

2. exportou carraças CHFJPY durante vários anos para o arquivo csv-file

3. importaram estas carraças em CHFJPY.custom

4. Dirigiu o seu Expert Advisor para a optimização genética. Em diferentes combinações

 
Slava:

Por sua vez, tente com os carrapatos com que tentei reproduzir. MetaQuotes-Demo server

Reproduzido. Com esta gama de entradas.


Os resultados não devem diferir mais de 50 um do outro.


Ordenar por ordem ascendente, depois comparar as linhas mais altas e mais baixas.


SZZ Repetição dos passos 3-6 a partir daqui. Com as mesmas datas.

 

Experimentei o CHFJPY original no MQ-Demo. Reproduziu-o!

  1. Definir o intervalo de tempo e iniciar a AG.
  2. Quando chegam os primeiros resultados de todos os Agentes, carrego em Stop.
  3. Se não obtiver quaisquer resultados, passo ao passo 1, alterando o período de tempo (apenas a data de início).
Três tentativas e este é o resultado.

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:

Experimentei o CHFJPY original no MQ-Demo. Reproduziu-o!

  1. Definir o intervalo de tempo e iniciar a AG.
  2. Quando chegam os primeiros resultados de todos os Agentes, carrego em Stop.
  3. Se não obtiver quaisquer resultados, passo ao passo 1, alterando o período de tempo (apenas a data de início).
Três tentativas e este é o resultado.

Fazendo a mesma coisa. Não se reproduz.

Vamos ter alguns registos de agentes de teste!

 
Slava:

Fazendo a mesma coisa. Não está a tocar.

Dê-me os registos dos agentes de ensaio!

Anexou todos os registos.

Arquivos anexados:
TesterLogs.zip  56 kb
 
fxsaber:

Anexei todos os registos.

Reproduziu o problema num CHFJPY normal, nem sequer num personalizado
 
Slava:
Reproduziu o problema num CHFJPY normal, nem sequer num personalizado

Sim, numa regular. Fiquei curioso sobre as carraças nos passes ali, por isso acrescentei algumas linhas à 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);
  }
}


Depois peguei em dois ficheiros e comparei-os utilizando o guião.

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


Resultado.

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


A optimização foi realizada a partir de 2019.06.01. Nos resultados vê-se claramente que os primeiros ticks são de uma data diferente. E estas datas são diferentes umas das outras.


ZS Fez uma verificação extra. Os carrapatos registados em cada delírio não mudam: o primeiro carrapato é igual ao último. Em geral, os passes GA seguem uma estranha sequência de carraças.

 
fxsaber:

Em geral, os passes GA seguem algumas estranhas sequências de carrapatos.

Reproduzido em modo de força bruta total. O problema afecta todos os modos Optimizar.

 
fxsaber:

Sim, numa regular. Fiquei curioso sobre as carraças nos passes ali, por isso acrescentei algumas linhas à EA.


Depois peguei em dois ficheiros e comparei-os utilizando o guião.


Resultado.


A optimização foi realizada a partir de 2019.06.01. Nos resultados vê-se claramente que os primeiros ticks são de uma data diferente. E estas datas são diferentes umas das outras.

O efeito só aparece quando se completa a optimização anterior com antecedência a partir do botão "Stop"? Ou também com rescisão normal?
 
Slava:
O efeito ocorre apenas quando se completa a optimização anterior antecipadamente a partir do botão "Stop"? Ou também com rescisão normal?

Antes de pressionar Stop, vejo nos registos e na tabela de Optimização que os passes errados já foram contados. Depois pressiono Stop, porque não vale a pena continuar.

Interpretei mal a pergunta.

Sim, como regra, deve carregar em Stop pelo menos uma vez na Optimização anterior. Mas assim que se atinge uma Optimização errônea, todos os próximos se tornam errôneos também (não altero mais o intervalo de tempo).


Talvez alguém se ligue à repetição. Estranho que não funcione para si, mas para mim num Terminal limpo joga rapidamente.


ZS Seria bom ter algum tipo de beta fechado com o máximo de exploração no lado dos Agentes. Então, os registos na minha máquina podem ter localizado o problema.