Уважаемые коллеги!
Заинтересовался возможностью запуска автоматизированного тестирования торговой стратегии на разных инструментах и с разными параметрами штатными средствами терминала МТ5.
Вот здесь есть подробная инструкция по запуску терминала с собственным файлом конфигурации. Это именно то, что мне нужно. Но, как говорится, аппетит приходит во время еды.
Сейчас я бы хотел сделать так, чтобы терминал запускался последовательно с разными конфигурационными файлами, в каждом из которых параметр ShutdownTerminal равен true. При этом очередной запуск терминала с новым файлом конфигурации происходил только после того, как предыдущий сеанс тестирования закончится и терминал будет закрыт.
Иными словами, мне нужно как-то получить от ОС информацию о том, работает ли ещё терминал, запущенный на предыдущей итерации, или уже нет.
Возможно, кто-то уже решал подобную задачу или имеет предположения, как её лучше решить:
- Средствами MQL5, используя вызовы Windows API
- Из скрипта PowerShell
На всякий случай уточню, что вопрос состоит не в том, как запустить вторую копию терминала из скрипта (с этим проблем нет), а в том как получить от Windows информацию о состоянии этой второй копии (ранее запущенного из скрипта процесса "terminal64.exe") — выполняется ли он или уже завершён.
При этом важно понимать, что таких процессов в системе может быть несколько, нам нужен именно тот, который мы ранее запустили программно.
У меня это все делается в .bat-файле (считай, скриптом PowerShell). Первый прогон - общая оптимизация с форвардом. Во время прогона собираются фреймы, и отбираются лучшие, по результату - формируется конфигурационный файл. Затем - второй прогон с этим конфигурационным файлом для установки точек перехода в безубыток. Наконец - трейтий прогон для установки защитных SL и/или TP в зависимости от ТС.
Никаких проблем, в результате имею конфигурационный файл с лучшей конфигурацией, который уже запускаю вручную, гляжу на работу, и в зависимости от качества результата - устанавливаю на торговлю.
У меня это все делается в .bat-файле (считай, скриптом PowerShell). Первый прогон - общая оптимизация с форвардом. Во время прогона собираются фреймы, и отбираются лучшие, по результату - формируется конфигурационный файл. Затем - второй прогон с этим конфигурационным файлом для установки точек перехода в безубыток. Наконец - трейтий прогон для установки защитных SL и/или TP в зависимости от ТС.
Никаких проблем, в результате имею конфигурационный файл с лучшей конфигурацией, который уже запускаю вручную, гляжу на работу, и в зависимости от качества результата - устанавливаю на торговлю.
Посмотрите коды 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.
Изучив представленный по ссылке код обнаружил, что для запуска стороннего терминала в нём используется встроенный в C# управляемый класс Process, а сам метод запуска терминала выглядит так:
Вы неправильно поняли сообщение от pivomoe. Он предлагал посмотреть решения от fxsaber, а ссылка в его тексте была автоматически сформирована сильно искуственным интеллектом форума.
Вот ссылка на MultiTester (вставлена вручную, обратите внимание на другое цветовое оформление). Обычно автоподсказки форума - ни о чем, их лучше игнорировать.
![MultiTester MultiTester](https://c.mql5.com/36/60/multitester.jpg)
@Stanislav Korotky, огромное спасибо! Буду изучать.
@pivomoe упоминал пользователя fsaber, я не смог такого найти и поэтому проследовал по зелёной ссылке и обнаружил там много интересного )
Да, примерно так я себе это и представляю. Но вот опыта работы с .bat файлами не имею.
Боюсь, мои команды тебе (давай на "ты") врядли подойдут.
Вот, сейчас я запускаю свой скрипт, который определяет, какие ТС Лиги Торговых Систем надо переоптимизировать. Он формирует файл отчёта, .bat-файл оптимизации и .ini-файлы настроек, необходимые для оптимизации. В данном случае у меня получилось, что надо переоптимизировать 18 ТС, и для этого потребуются 54 файла настроек, которые и были сгенерированы.
Сам файл - прикрепляю(расширение у него .txt, но причина этого - проблемы с формированием расширения .bat внутри скриптов. Реально это пакетный .bat-файл.
Однако, тебе рекомендую почитать, как работают пакетные файлы.
@Georgiy Merts, огромное человеческое спасибо!
Ну... Команда start - очень давняя, еще с досовских времён... Обычно, народ, знающий про PowerShell - и про эту команду знает... Ну что ж... Если подошло - то все в порядке.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уважаемые коллеги!
Заинтересовался возможностью запуска автоматизированного тестирования торговой стратегии на разных инструментах и с разными параметрами штатными средствами терминала МТ5.
Вот здесь есть подробная инструкция по запуску терминала с собственным файлом конфигурации. Это именно то, что мне нужно. Но, как говорится, аппетит приходит во время еды.
Сейчас я бы хотел сделать так, чтобы терминал запускался последовательно с разными конфигурационными файлами, в каждом из которых параметр ShutdownTerminal равен true. При этом очередной запуск терминала с новым файлом конфигурации происходил только после того, как предыдущий сеанс тестирования закончится и терминал будет закрыт.
Иными словами, мне нужно как-то получить от ОС информацию о том, работает ли ещё терминал, запущенный на предыдущей итерации, или уже нет.
Возможно, кто-то уже решал подобную задачу или имеет предположения, как её лучше решить:
На всякий случай уточню, что вопрос состоит не в том, как запустить вторую копию терминала из скрипта (с этим проблем нет), а в том как получить от Windows информацию о состоянии этой второй копии (ранее запущенного из скрипта процесса "terminal64.exe") — выполняется ли он или уже завершён.
При этом важно понимать, что таких процессов в системе может быть несколько, нам нужен именно тот, который мы ранее запустили программно.