用于优化控制的一组 OnTester 事件

MQL5 中有三个特殊事件,用于管理优化过程,并将任意应用的结果(除了交易指标之外)从代理传输到终端:OnTesterInitOnTesterDeinitOnTesterPass。在代码中说明了其处理程序之后,程序员能够在开始优化之前、优化完成之后以及每个单独的优化传递结束时执行其所需的操作(如果已经从代理接收到应用程序数据,下面将详细介绍)。

所有处理程序都是可选的。正如我们已经看到的,优化并不依赖于处理程序。还需要理解的是,所有三个事件只在优化期间起作用,在单次测试中不起作用。

带有这些处理程序的 EA 交易可自动加载到终端的单独图表上,并带有测试程序中指定的符号和周期。这种 EA 交易实例不进行交易,只执行服务操作。所有其他事件处理程序,如 OnInitOnDeinitOnTick 在其中不起作用。

要确定 EA 交易是在代理的常规交易模式下执行还是在终端的服务模式下执行,请在其代码中调用函数 MQLInfoInteger(MQL_FRAME_MODE),并获取 truefalse。这种服务模式也称为“帧”模式,适用于可以从代理上的 EA 交易实例发送到终端的数据包。稍后我们将看到该过程是如何完成的。

在优化过程中,只有一个 EA 交易实例在终端中工作,并且在必要时接收输入帧。不要忘记,只有当 EA 交易代码包含三个所述的事件处理程序之一时,才会启动这种实例。

在第一轮之前,在策略测试程序中启动优化时,会生成 OnTesterInit 事件。该处理程序有两个版本:返回类型为 intvoid

int OnTesterInit(void)

void OnTesterInit(void)

int 返回版本中,零值 (INIT_SUCCEEDED) 意味着在终端中图表上启动的 EA 交易成功初始化,允许开始优化。任何其他值都意味着返回错误代码,并且不会开始优化。

该函数的第二个版本始终表明 EA 交易为优化做好了准备。

为执行 OnTesterInit 提供了有限时间,在此之后,EA 交易将被强制终止,优化本身将被取消。在这种情况下,测试程序的日志中会显示相应的消息。

在上一节中,我们看到了如何使用 OnTesterInit 处理程序通过 ParameterGetRange/ParameterSetRange 函数修改优化参数的示例。

void OnTesterDeinit(void)

EA 交易优化完成后,将调用 OnTesterDeinit 函数。

该函数旨在对应用的优化结果进行最终处理。例如,如果在 OnTesterInit 中打开一个文件来写入帧的内容,那么需要在 OnTesterDeinit 中关闭。

void OnTesterPass(void)

在优化过程中,当数据帧到达时,会自动生成 OnTesterPass 事件。该函数允许在优化期间处理从运行在代理上的 EA 交易实例接收的应用程序数据。测试代理的帧必须通过 OnTester 处理程序,使用 FrameAdd 函数发送。

用于优化 EA 交易的事件顺序图

该图显示了优化 EA 交易时的事件顺序

关于每轮测试的标准财务统计数据会从代理自动发送到终端。如果不需要,EA 交易不需要使用 FrameAdd 发送任何内容。如果没有使用帧,就不会调用 OnTesterPass 处理程序。

使用 OnTesterPass,你可以“随时”动态处理优化结果,例如,将它们显示在终端中的图表上,或者将它们添加到文件中,以便进行后续的批处理。

为了演示 OnTester 事件处理程序的功能,我们首先需要学习处理帧的函数。这些函数将在后面的章节中介绍。