以编程方式关闭终端并设置返回码
MQL5 API 包含若干个不仅用于读取而且用于修改程序环境的函数。其中最为激进的是 TerminalClose。使用该函数,MQL 程序可以在无用户确认的情况下关闭终端!
bool TerminalClose(int retcode)
该函数有一个参数 retcode,这是由 terminal64.exe 进程向 Windows 操作系统返回的代码。要分析这些代码,可使用批处理文件(*.bat 和 *.cmd)以及 shell 脚本(Windows Script Host,即 WSH,其支持 VBScript 和 JScript)或 Windows PowerShell(WPS,.ps* 文件))以及其它自动化工具(例如 Windows 计划程序、Windows 下 Linux 支持子系统(*.sh 文件)等)。
该函数不会立即停止终端,而是向终端发送一个终止命令。
如果调用结果为 true,则表示该命令已被成功“接受进行考虑”,终端将尝试尽快但正确地关闭(生成一个通知并停止其它正在运行的 MQL 程序)。在调用代码中,当然,也必须为立即终止工作作好所有准备(尤其是所有此前打开的文件应关闭),并且在函数调用之后,将控制权交还给终端。
与该进程返回码关联的另一个函数是 SetReturnError。它允许你预指派该代码而无需发送立即关闭命令。
void SetReturnError(int retcode)
该函数设置终端进程关闭后将返回给 Windows 系统的代码。
请注意,终端不需要被 TerminalClose 函数强制关闭。用户也可以用指定代码正常关闭终端。如果终端因非预期关键错误关闭,该代码也将进入系统。
如果 SetReturnError 函数被重复调用和/或从不同的程序调用,则终端将返回上次设置的代码。
我们使用 EnvClose.mq5 脚本来测试这些函数。
#property script_show_inputs
|
要以实际操作方式来测试,我们还需要 envrun.bat 文件(位于 MQL5/Files/MQL5Book/ 文件夹中)。
terminal64.exe
|
事实上,它仅启动终端,完成后便向控制台显示生成的代码。该文件应被放在终端文件夹中(或者系统中安装的若干个 MetaTrader 5 实例中的当前实例应在 PATH 系统变量中注册)。
例如,如果我们使用批处理文件启动终端,并执行脚本 EnvClose.mq5,例如以参数 ReturnCode=100, CloseTerminalNow=true 执行,则我们将在控制台中看到类似这样的内容:
Microsoft Windows [Version 10.0.19570.1000]
|
顺便提醒一下,从命令行启动时,MetaTrader 5 支持各种选项(详情参见 运行交易平台)。因此,可以安排批量测试各种 EA 交易或设置以及数千个被监测账户之间的顺序切换,在一台计算机上通过大量实例持续并行操作实现这些需求并不现实。