Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы - страница 62

 
fxsaber:

1. В папку с чистым Терминалом распаковать архив.


2. Запустить скрипт fxsaber\CreateSymbol.ex5.


Через несколько секунд появится график кастомного символа.


2. Открыть Тестер (CTRL+R) и выбрать помеченную настройку.



3. В появившемся окне Тестера нажать Старт.



4. После первых результатов Оптимизации нажать Стоп.


5. В Настройках Тестера поменять начальную дату интервала на 2019.11.01 и нажать Старт.


6. В результатах Оптимизации бредовые значения (из исходника видно, что они не могут отличаться между собой больше, чем на 50).


Неоднократно повторял эти шаги. 100% воспроизводилась проблема. Кто будет пробовать, дайте знать.

Попробую.

Вы в свою очередь попробуйте с теми тиками, с которыми я пытался воспроизвести. Сервер MetaQuotes-Demo

1. Создал из диалога терминала кастомный символ на основе CHFJPY (поменял только имя)

2. Экспортировал тики CHFJPY за несколько лет в csv-файл

3. Импортировал эти тики в CHFJPY.custom

4. Запустил вашего эксперта на генетическую оптимизацию. В разных комбинациях

 
Slava:

Вы в свою очередь попробуйте с теми тиками, с которыми я пытался воспроизвести. Сервер MetaQuotes-Demo

Воспроизводится. С таким диапазоном входных


Результаты не должны отличаться больше, чем на 50, друг от друга.


Отсортируйте по-возрастанию, а потом сравните самую верхнюю и нижнюю строки.


ЗЫ Повторил шаги 3-6 отсюда. С теми же датами.

 

На MQ-Demo попробовал оригинальный CHFJPY. Воспроизвел!

  1. Выставил временной интервал и запустил ГА.
  2. Когда первые несколько результатоа от всех Агентов пришли, жму Стоп.
  3. Если бредовых результатов нет, перехожу в п.1, меняя временной интервал (только начальную дату).
Три попытки, и вот результат.

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:

На MQ-Demo попробовал оригинальный CHFJPY. Воспроизвел!

  1. Выставил временной интервал и запустил ГА.
  2. Когда первые несколько результатоа от всех Агентов пришли, жму Стоп.
  3. Если бредовых результатов нет, перехожу в п.1, меняя временной интервал (только начальную дату).
Три попытки, и вот результат.

Делаю всё то же самое. Не воспроизводится.

Давайте логи тестерных агентов!

 
Slava:

Делаю всё то же самое. Не воспроизводится.

Давайте логи тестерных агентов!

Приложил все логи.

Файлы:
TesterLogs.zip  56 kb
 
fxsaber:

Приложил все логи.

Вы воспроизвели проблему на обычном форексном CHFJPY, даже не на кастомном
 
Slava:
Вы воспроизвели проблему на обычном форексном CHFJPY, даже не на кастомном

Да, на обычном. Стало интересно, что за тики там в проходах, поэтому добавил несколько строк в советник.

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

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


Затем взял два файла и сравнил через скрипт.

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


Результат.

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


Оптимизация проводилась с 2019.06.01. В результатах отлично видно, что первые тики идут с другой даты. И эти даты отличаются друг от друга.


ЗЫ Сделал дополнительную проверку. Записанные тики в каждом бредовом проходе не меняются: первый тик равен последнему. В общем, ГА-проходы идут по каким-то странным последовательностям тиков.

 
fxsaber:

В общем, ГА-проходы идут по каким-то странным последовательностям тиков.

Воспроизвел в режиме полного перебора. Проблема касается всех режимов Оптимизации.

 
fxsaber:

Да, на обычном. Стало интересно, что за тики там в проходах, поэтому добавил несколько строк в советник.


Затем взял два файла и сравнил через скрипт.


Результат.


Оптимизация проводилась с 2019.06.01. В результатах отлично видно, что первые тики идут с другой даты. И эти даты отличаются друг от друга.

Эффект проявляется только при досрочном завершении предыдущей оптимизации от кнопки "Стоп"? Или при обычном завершении тоже?
 
Slava:
Эффект проявляется только при досрочном завершении предыдущей оптимизации от кнопки "Стоп"? Или при обычном завершении тоже?

Перед нажатием на Стоп вижу в логах и в таблице Оптимизации, что уже посчитались ошибочные проходы. Тогда и жму Стоп, т.к. продолжать нет смысла.

Неправильно понял вопрос.

Да, как правило, нужно хотя бы один раз нажать Стоп на предыдущей Оптимизации. Но как только нарываешься на ошибочную Оптимизацию, то все следующие так же становятся ошибочными (не меняю уже временной интервал).


Возможно, кто-то подключится к воспроизведению. Странно, что у Вас не получается, а у меня на чистом Терминале быстро воспроизводится.


ЗЫ Хорошо бы какую-нибудь закрытую бету с максимальным количеством логов на стороне Агентов. Тогда логи на моей машине, может быть, локализовали проблему.

Причина обращения: