Хочу нормальный CLI

 

Сейчас популярна разработка с полной интеграцией - CI

Я хочу запускать тест с нужными параметрами для эксперта из обычного .bat для перебора вариантов нейронной сети.

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

Запуск из .bat должен возвращать результат выполнения в скрипт по завершению теста или выполнение скрипта в терминале.

 

У нас тысячи тестов так гоняются.

Вот пример:

E:\Tests\terminal64.exe /portable /config:"E:\Tests\MQL5\Shared Projects\MetaQuotes.MQL5.Tests\StrategyTester\IniSets\Bands_DEMA_EURUSD_M30.ini"

Файлы ini и set лежат в E:\Tests\MQL5\Shared Projects\MetaQuotes.MQL5.Tests\StrategyTester\IniSets, а mq5 в E:\Tests\MQL5\Shared Projects\MetaQuotes.MQL5.Tests\StrategyTester\Experts\Bands_DEMA_EURUSD_M30

В exit code получаете или результат прогона или код возврата, заявленный из эксперта как:

   SetReturnError(12345);
Файлы:
example.zip  5 kb
 

А как с запуском Скриптов быть? Сейчас нельзя запустить несколько Скриптов в терминале и при этом не знаю, как закрыть терминал, чтобы запустить следующий Скрипт.

[StartUp]
Symbol=EURUSD

;--- таймфрейм графика, который будет открыт при старте платформы для запуска эксперта и/или скрипта 

Period=M1
Script=Roffild\UnitTests\ArrayList_UnitTest
; следующий скрипт не запустится
Script=Roffild\UnitTests\Serialization_UnitTest


[StartUp0]

;--- запускаемый эксперт находится в папке каталог_данных_платформы\MQL5\Experts\Examples\MACD\

Expert=Examples\MACD\MACD Sample

;--- параметры запуска эксперта находятся в папке  каталог_данных_платформы\MQL5\Presets\

ExpertParameters=MACD Sample.set

;--- запускаемый скрипт находится в папке каталог_данных_платформы\MQL5\Scripts\Examples\ObjectSphere\

Script=Examples\ObjectSphere\SphereSample

;--- график инструмента, который будет открыт при старте платформы для запуска эксперта и/или скрипта

Symbol=EURUSD

;--- таймфрейм графика, который будет открыт при старте платформы для запуска эксперта и/или скрипта 

Period=M1

;--- шаблон, который будет применен к графику, находится в папке каталог_установки платформы\Profiles\Templates

Template=macd.tpl
 

Посмотрите примеры внимательно и почитайте описания командных ini файлов, пожалуйста.

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


Закрыть терминал автоматически можно следующим параметром:

;--- автоматическое завершение работы платформы по окончании тестирования
ShutdownTerminal=1


Скрипты можно запускать так:

.....

[Charts]
MaxBars=10000000

[Experts]
Enabled=1

[StartUp]
ShutdownOnError=1
SkipRecompile=1
Symbol=EURUSD
Period=M1
Script=Shared Projects\MetaQuotes.MQL5.Tests\TerminalExecution\OtherFunctions\TestCalendar
ScriptParameters=TestCalendar.set

а в set файле прописывать специальный параметр типа

InpShutdown=1

по которому скрипт будет завершать работу терминала:

int OnStart()
  {
   ....

 //--- нужно загасить терминал
   if(InpShutdown)
      TerminalClose(result);
 //---
   return(result);
  }


Возможностей у командных файлов достаточно. Мы сами гоняем громадное количество тестов так.

Просто внимательно все изучите.

 

Заклинание призыва: @Renat Fatkhullin

import subprocess
count = 1
while True:
    print(count)
    subprocess.run(r'"C:\Program Files\MetaTrader 5\terminal64.exe" /config:"d:\runtest.ini"',
                   creationflags=subprocess.CREATE_NO_WINDOW)
    count += 1
[Tester]
Expert=runtest
Period=M5
;ExpertParameters=macd sample.set
Model=0
ExecutionMode=0
Optimization=0
OptimizationCriterion=0
ForwardMode=0
;Report=test_macd
;ReplaceReport=1
ShutdownTerminal=1
UseLocal=1
UseRemote=0
UseCloud=0
Visual=0

При запуске с конфигом сбрасываются настройки звуков.

Нужны еще настройки:

ОтключитьЗвуки - достало бряканье

НеАктивироватьОкно - поскольку CREATE_NO_WINDOW не помогает, то хотя бы не забирать фокус у активного окна, а то достало окна переключать. И лучше, чтобы эта настройка была по умолчанию при запуске с конфигом.

ОтложитьОбновление - у меня тест остановился из-за внезапного обновления. При очередном запуске Windows выдал запрос на получение прав для установки обновления и заблокировал весь тест на целый день. А еще - само обновление не устанавливается при запуске с конфигом!

МинимизироватьОкно = СвернутьОкно


Бонус: Не получается использовать видеокарту (CUDA) из DLL. Ситуация с бесконечным ожиданием устройства. Предполагаю, что из-за реализации OpenCL в MQL.

 

Сейчас у меня есть связка: Jenkins, MT5, Python

НеАктивироватьОкно - поскольку CREATE_NO_WINDOW не помогает, то хотя бы не забирать фокус у активного окна, а то достало окна переключать. И лучше, чтобы эта настройка была по умолчанию при запуске с конфигом.

namespace WindowsFormsApp1
{
   static class Program
   {
      [DllImport("user32.dll")]
      private static extern IntPtr GetForegroundWindow();

      [DllImport("user32.dll")]
      private static extern bool SetForegroundWindow(IntPtr hWnd);

      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main(string[] arg)
      {
         IntPtr wind = GetForegroundWindow();
         Process process = new Process();
         process.StartInfo.FileName = arg[0];
         process.StartInfo.Arguments = arg[1];
         process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
         process.Start();
         process.WaitForExit(1000);
         SetForegroundWindow(wind);
         process.WaitForExit();
      }
   }
}

Хотелось бы обойтись без этого хака.

 

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

for (итераций 100) {

   автоправка исходников;

   перекомпиляция;

   запуск скрипта на 4х графиках (разные пары);

}

Всё накрылось сомнениями:

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

2.

[Charts]
MaxBars=10000000

Зачем это? Нельзя взять текущие настройки? И вообще - терминал очень долго подгружает историю при открытии, гарантируется ли получение скриптом полной истории?

3. Гарантируется ли порядок запуска на графики в том порядке, в котором они идут в ини файлах? Ещё бы иметь возможность установить паузу между запусками.

4. Завершение через TerminalClose() выглядит костыльно и отпугивает.

5. Вообще хотелось бы не ини файл, а какой-то простейший шел подобный язык.


В общем запускаю руками, разбираться во всём этом не захотелось, на голове шишек и без того хватает.

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