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

 
fxsaber:

В одиночном проходе нужно узнать свои входные параметры. Вряд ли будут введен такой функционал, поэтому поделитесь мыслями, как это можно сделать? WinAPI подойдет.

Получение последних настроек MT5-Тестера.

#include <WinAPI\fileapi.mqh>
#include <WinAPI\handleapi.mqh>

// Получает имя файла настроек последнего запуска MT5-Тестера.
string GetTesterINIFileName( ulong &Size )
{
  string Str = NULL;
  const string Path = ::TerminalInfoString(TERMINAL_PATH)+ "\\MQL5\\Profiles\\Tester\\";
  
  FIND_DATAW FindData;
  const HANDLE handle = kernel32::FindFirstFileW(Path + "*.ini", FindData);
  
  if (handle != INVALID_HANDLE)
  {     
    ulong MaxTime = 0;
    Size = 0;
    
    do
    {
      const ulong TempTime = ((ulong)FindData.ftLastWriteTime.dwHighDateTime << 32) + FindData.ftLastWriteTime.dwLowDateTime;
      
      if (TempTime > MaxTime)
      {
        MaxTime = TempTime;
        
        Str = ::ShortArrayToString(FindData.cFileName);
        Size = ((ulong)FindData.nFileSizeHigh << 32) + FindData.nFileSizeLow;;
      }      
    }
    while (kernel32::FindNextFileW(handle, FindData));    
    
    kernel32::FindClose(handle);
  }
  
  return((Str == NULL) ? NULL : Path + Str);   
}

#define GENERIC_READ  0x80000000
#define SHARE_READ    1
#define OPEN_EXISTING 3

// Получает настройки последнего запуска MT5-Тестера.
string GetTesterINI( void )
{
  string Str = NULL;
  
  ulong Size;
  const string FileName = GetTesterINIFileName(Size);
  
  if (FileName != NULL)
  {
    const HANDLE handle = kernel32::CreateFileW(FileName, GENERIC_READ, SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    
    if (handle != INVALID_HANDLE)
    {
      uint Read;
      ushort Buffer[];
      
      ::ArrayResize(Buffer, (int)Size / sizeof(ushort));
            
      if (kernel32::ReadFile(handle, Buffer, (int)Size, Read, 0))      
        Str = ::ShortArrayToString(Buffer);
      
      kernel32::CloseHandle(handle);        
    }
  }
  
  return(Str);
}


Применение

// Советник при запуске одиночного прогона возвращает свои настройки.
input int inInput1 = 1;
input int inInput2 = 2;

int OnInit()
{
  if (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION))
    Print(GetTesterINI());
  
  return(INIT_FAILED);
}


Результат

2019.04.01 00:00:00   ;Одиночный тест советника: Test9, EURUSD M1, цены открытия, 2019.04.01 - 2019.09.18
2019.04.01 00:00:00   [Tester]
2019.04.01 00:00:00   Expert=Test9.ex5
2019.04.01 00:00:00   Symbol=EURUSD
2019.04.01 00:00:00   Period=M1
2019.04.01 00:00:00   Optimization=0
2019.04.01 00:00:00   Model=2
2019.04.01 00:00:00   FromDate=2019.04.01
2019.04.01 00:00:00   ToDate=2019.09.18
2019.04.01 00:00:00   ForwardMode=0
2019.04.01 00:00:00   Deposit=10000
2019.04.01 00:00:00   Currency=EUR
2019.04.01 00:00:00   ProfitInPips=1
2019.04.01 00:00:00   Leverage=100
2019.04.01 00:00:00   ExecutionMode=0
2019.04.01 00:00:00   OptimizationCriterion=6
2019.04.01 00:00:00   Visual=0
2019.04.01 00:00:00   [TesterInputs]
2019.04.01 00:00:00   inInput1=123||1||1||10||N
2019.04.01 00:00:00   inInput2=2||2||1||20||N
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1640: создание и тестирование собственных финансовых инструментов

fxsaber, 2017.08.04 19:55

Во время Оптимизации возможно ли сделать какую-то защиту (хотя бы в виде предупреждения со звуковым сигналом) от увода компа в Сон?

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

Так же во время Оптимизации единственный признак, что идет Оптимизация в Терминале при скрытом Тестере - зеленая полоска на иконке (как при скачивании файлов в браузере). При закрытии Терминала никакого предупреждения нет, что идет Оптимизация.

 

Воспроизведение проблемы с отображением bool-входных параметров в Тестере.

Этот советник

input int i = 0;
input bool b = false;

double OnTester() { return(i); }


оптимизируем, как на скрине.


Выбираем запуск одного из проходов.


В Параметрах видим ноль вместо false.


 

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


Получается так, что запускаешь одиночный из Оптимизации - отлично (совпадает с результатом Оптимизации).

Затем входишь в режим Одиночного и запускаешь этот же проход через кнопку Старт - получаешь другие значения (потому что некоторые входные имеют другие значения, чем на предыдущем шаге).

 

Про диких размеров логи говорилось уже. Когда смотрится журнал, то в 99% случаев интересует его записи в самом начале и в конце. Так вот из-за диких размеров начало не увидеть совсем.

Может, начало журнала дублировать и в конце? В частности, видеть, при каких входных параметрах был запуск.

 
Попал в ситуацию, когда нельзя было посмотреть результаты предыдущих оптимизаций. Помогла только перезагрузка.
 

Вот такие сообщения Тестер теперь выдает.

 
fxsaber:

Вот такие сообщения Тестер теперь выдает.

Тестер и раньше такие сообщения  выдавал. С тех пор как появилась возможность загружать opt-файлы. Это предупреждение о том, что в случае запуска оптимизации данный opt-файл будет затёрт и оптимизация начнётся заново 

 
Slava:

в случае запуска оптимизации данный opt-файл будет затёрт

Имя совпадет?

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