Программное закрытие терминала и код возврата

MQL5 API содержит несколько функций, которые позволяют не только читать, но изменять программное окружение. Одна из самых радикальных из них — TerminalClose. С помощью неё MQL-программа может закрыть терминал (без подтверждения пользователя!).

bool TerminalClose(int retcode)

Функция имеет один параметр retcode — код, возвращаемый процессом terminal64.exe в операционную систему Windows. Подобные коды можно анализировать в командных файлах (*.bat и *.cmd), а также в скриптах оболочки (Windows Script Host (WSH), поддерживающий VBScript и JScript, или Windows PowerShell (WPS), с файлами расширений .ps*) и прочих средствах автоматизации (например, встроенный планировщик Windows, подсистема поддержки Linux под Windows с файлами *.sh, и т.д.).

Функция не производит немедленной остановки работы терминала, а просто посылает терминалу команду на завершение.

Если результат вызова равен true, значит команда успешно "принята к рассмотрению", и терминал постарается максимально быстро, но корректно закрыться (с уведомлением и остановкой прочих выполняющихся MQL-программ). В вызывающем коде, разумеется, также должны быть сделаны все приготовления для немедленного завершения работы (в частности, закрыты все ранее открытые файлы), а после вызова функции управление следует вернуть терминалу.

Другая функция, связанная кодом возврата процесса, называется SetReturnError. Она позволяет заранее назначить этот код, не отправляя команду на немедленное закрытие.

void SetReturnError(int retcode)

Функция устанавливает код, который процесс терминала вернёт системе Windows при завершении работы.

Важно отметить, что терминал не обязательно должен быть принудительно закрыт функцией TerminalClose. Штатное закрытие терминала пользователем также произойдет с указанным кодом. Также данный код попадет в систему, если терминал закроется из-за непредвиденной критической ошибки.

Если функция SetReturnError вызывалась многократно и/или из разных MQL-программ, то терминал вернёт последний установленный код.

Для тестирования обеих функций написан скрипт EnvClose.mq5.

#property script_show_inputs
   
input int ReturnCode = 0;
input bool CloseTerminalNow = false;
   
void OnStart()
{
   if(CloseTerminalNow)
   {
      TerminalClose(ReturnCode);
   }
   else
   {
      SetReturnError(ReturnCode);
   }
}

Чтобы проверить его в действии нам также потребуется командный файл envrun.bat (с книгой он поставляется в папке MQL5/Files/MQL5Book/).

terminal64.exe
@echo Exit code: %ERRORLEVEL%

По сути он только запускает терминал, а после его завершения выводит полученный код в консоль. Файл следует расположить в папке рядом с терминалом (или актуальный экземпляр MetaTrader 5 из числа нескольких установленных в системе должен быть прописан в системной переменной PATH).

Например, если запустить терминал с помощью bat-файла и выполнить скрипт EnvClose.mq5, скажем, с параметрами ReturnCode=100, CloseTerminalNow=true, увидим в консоли примерно такие строки:

Microsoft Windows [Version 10.0.19570.1000]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\Program Files\MT5East>envrun
C:\Program Files\MT5East>terminal64.exe
Exit code: 100
C:\Program Files\MT5East>

Напомним, что MetaTrader 5 поддерживает различные опции при запуске из командной строки (подробности см. в разделе документации Запуск торговой платформы). Таким образом, можно организовать, например, пакетное тестирование различных экспертов или настроек, а также последовательное переключение между тысячами контролируемых счетов, что было бы нереально сделать при постоянной параллельной работе такого количества экземпляров на одном компьютере.