Вопрос касательно автоматизации тестирования торговых стратегий

 

Уважаемые коллеги!

Заинтересовался возможностью запуска автоматизированного тестирования торговой стратегии на разных инструментах и с разными параметрами штатными средствами терминала МТ5.

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

Сейчас я бы хотел сделать так, чтобы терминал запускался последовательно с разными конфигурационными файлами, в каждом из которых параметр  ShutdownTerminal равен true. При этом очередной запуск терминала с новым файлом конфигурации происходил только после того, как предыдущий сеанс тестирования закончится и терминал будет закрыт.

Иными словами, мне нужно как-то получить от ОС информацию о том, работает ли ещё терминал, запущенный на предыдущей итерации, или уже нет.

Возможно, кто-то уже решал подобную задачу или имеет предположения, как её лучше решить:

  1. Средствами MQL5, используя вызовы Windows API
  2. Из скрипта PowerShell

На всякий случай уточню, что вопрос состоит не в том, как запустить вторую копию терминала из скрипта (с этим проблем нет), а в том как получить от Windows информацию о состоянии этой второй копии (ранее запущенного из скрипта процесса "terminal64.exe") — выполняется ли он или уже завершён. 

При этом важно понимать, что таких процессов в системе может быть несколько, нам нужен именно тот, который мы ранее запустили программно.

 
Janis Ozols:

Уважаемые коллеги!

Заинтересовался возможностью запуска автоматизированного тестирования торговой стратегии на разных инструментах и с разными параметрами штатными средствами терминала МТ5.

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

Сейчас я бы хотел сделать так, чтобы терминал запускался последовательно с разными конфигурационными файлами, в каждом из которых параметр  ShutdownTerminal равен true. При этом очередной запуск терминала с новым файлом конфигурации происходил только после того, как предыдущий сеанс тестирования закончится и терминал будет закрыт.

Иными словами, мне нужно как-то получить от ОС информацию о том, работает ли ещё терминал, запущенный на предыдущей итерации, или уже нет.

Возможно, кто-то уже решал подобную задачу или имеет предположения, как её лучше решить:

  1. Средствами MQL5, используя вызовы Windows API
  2. Из скрипта PowerShell

На всякий случай уточню, что вопрос состоит не в том, как запустить вторую копию терминала из скрипта (с этим проблем нет), а в том как получить от Windows информацию о состоянии этой второй копии (ранее запущенного из скрипта процесса "terminal64.exe") — выполняется ли он или уже завершён. 

При этом важно понимать, что таких процессов в системе может быть несколько, нам нужен именно тот, который мы ранее запустили программно.

У меня это все делается в .bat-файле (считай, скриптом PowerShell). Первый прогон - общая оптимизация с форвардом. Во время прогона собираются фреймы, и отбираются лучшие, по результату - формируется конфигурационный файл. Затем - второй прогон с этим конфигурационным файлом для установки точек перехода в безубыток. Наконец - трейтий прогон для установки защитных SL и/или TP в зависимости от ТС. 

Никаких проблем, в результате имею конфигурационный файл с лучшей конфигурацией, который уже запускаю вручную, гляжу на работу, и в зависимости от качества результата - устанавливаю на торговлю. 

 
Georgiy Merts #:

У меня это все делается в .bat-файле (считай, скриптом PowerShell). Первый прогон - общая оптимизация с форвардом. Во время прогона собираются фреймы, и отбираются лучшие, по результату - формируется конфигурационный файл. Затем - второй прогон с этим конфигурационным файлом для установки точек перехода в безубыток. Наконец - трейтий прогон для установки защитных SL и/или TP в зависимости от ТС. 

Никаких проблем, в результате имею конфигурационный файл с лучшей конфигурацией, который уже запускаю вручную, гляжу на работу, и в зависимости от качества результата - устанавливаю на торговлю. 

Да, примерно так я себе это и представляю. Но вот опыта работы с .bat файлами не имею.

Может, подскажете последовательность команд для запуска терминала на первый прогон, ожидания завершения его работы и последующего запуска второго прогона?
 
Посмотрите коды fsaber. Он реализован управление оптимизацией прямо из советника. Без всяких bat.
 
pivomoe #:
Посмотрите коды fsaber. Он реализован управление оптимизацией прямо из советника. Без всяких bat.

Большое спасибо за ссылку! Там действительно всё сделано безо всяких bat, однако вместо них используются DLL на основе управляемого кода, написанные на C#.

Автором проделана колоссальная работа, мне потребуется несколько дней просто для того, чтобы вдумчиво прочитать все статьи, не говоря о том, чтобы вникать в код. Если другого выхода нет, буду изучать эти статьи и код, ещё раз спасибо за ссылку. 

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

Католиков и лютеран с Рождеством, а всех вместе — с наступающим Новым годом!

 

Изучив представленный по ссылке код обнаружил, что для запуска стороннего терминала в нём используется встроенный в C# управляемый класс Process, а сам метод запуска терминала выглядит так:

public bool Run()
{
    if (IsActive)
        return false;
    // Задаем путь к терминалу
    Process.StartInfo.FileName = Path.Combine(TerminalInstallationDirectory.FullName, "terminal64.exe");
    Process.StartInfo.WindowStyle = WindowStyle;
    // Задаем данные для запуска терминала (если таковые были установлены)
    if (Config != null && File.Exists(Config.Path))
        Process.StartInfo.Arguments = $"/config:{Config.Path} ";
    if (Login.HasValue)
        Process.StartInfo.Arguments += $"/login:{Login.Value} ";
    if (Profile != null)
        Process.StartInfo.Arguments += $"/profile:{Profile} ";
    if (Portable)
        Process.StartInfo.Arguments += "/portable";

    // Уведомляем процесс о необходимости вызывать событие Exit после закрытия терминала
    Process.EnableRaisingEvents = true;

    //Запускаем процесс и сохраняем статус запуска в переменную IsActive
    return (IsActive = Process.Start());
}

Таким образом, отслеживание факта закрытия окна терминала осуществляется путём подписки на событие Exit, которая, в свою очередь, осуществляется через свойство EnableRaisingEvents того же класса Process. Следовательно, чтобы воспользоваться этим способом, нужно установить VisualStudio и написать свою DLL на С#. 

Что-то мне подсказывает, что должен существовать какой-то более простой путь для того, чтобы запустить вторую копию терминала и получить сведения о завершении её работы. Попробую найти реализацию класса Process в С# — очень надеюсь, что он является обёрткой для функций Windows API.

 
Janis Ozols #:

Изучив представленный по ссылке код обнаружил, что для запуска стороннего терминала в нём используется встроенный в C# управляемый класс Process, а сам метод запуска терминала выглядит так:

Вы неправильно поняли сообщение от pivomoe. Он предлагал посмотреть решения от fxsaber, а ссылка в его тексте была автоматически сформирована сильно искуственным интеллектом форума.

Вот ссылка на MultiTester (вставлена вручную, обратите внимание на другое цветовое оформление). Обычно автоподсказки форума - ни о чем, их лучше игнорировать.

MultiTester
MultiTester
  • www.mql5.com
Множественные прогоны/оптимизации в Тестере.
 

@Stanislav Korotky, огромное спасибо! Буду изучать.

@pivomoe упоминал пользователя fsaber, я не смог такого найти и поэтому проследовал по зелёной ссылке и обнаружил там много интересного ) 

 
Janis Ozols #:
Да, примерно так я себе это и представляю. Но вот опыта работы с .bat файлами не имею.

Может, подскажете последовательность команд для запуска терминала на первый прогон, ожидания завершения его работы и последующего запуска второго прогона?

Боюсь, мои команды тебе (давай на "ты") врядли подойдут. 

Вот, сейчас я запускаю свой скрипт, который определяет, какие ТС Лиги Торговых Систем надо переоптимизировать. Он формирует файл отчёта, .bat-файл оптимизации и .ini-файлы настроек, необходимые для оптимизации. В данном случае у меня получилось, что надо переоптимизировать 18 ТС, и для этого потребуются 54 файла настроек, которые и были сгенерированы. 

Сам файл - прикрепляю(расширение у него .txt, но причина этого - проблемы с формированием расширения .bat внутри скриптов. Реально это пакетный .bat-файл. 

Однако, тебе рекомендую почитать, как работают пакетные файлы. 

Файлы:
 
@Georgiy Merts, огромное человеческое спасибо!

Твои команды мне очень даже подошли! На самом деле start /wait — это именно то, что мне было нужно. А сам .bat файл я без проблем запущу через ShellExecute.
 
Janis Ozols #:
@Georgiy Merts, огромное человеческое спасибо!

Твои команды мне очень даже подошли! На самом деле start /wait — это именно то, что мне было нужно. А сам .bat файл я без проблем запущу через ShellExecute.

Ну... Команда start - очень давняя, еще с досовских времён... Обычно, народ, знающий про PowerShell - и про эту команду знает... Ну что ж... Если подошло - то все в порядке.