强制停止测试:TesterStop

如果有必要,根据观察到的情况,开发人员可以提前停止测试 EA 交易。例如,当达到特定数量的失败交易或提款水平时,可以如此操作。为此,API 提供了 TesterStop 函数。

void TesterStop()

该函数给出一个终止测试程序的命令,即当在程序将控制返回到执行环境后,就会停止。

调用 TesterStop 被认为是测试的正常结束,因此将会调用 OnTester 函数,并将所有累积的交易统计数据和优化准则的值返回给策略测试程序。

还有一种替代的常规方法可中断测试:使用之前探讨过的 ExpertRemove 函数。调用 ExpertRemove 也会返回调用该函数时收集的交易统计数据。但是,也有一些不同之处。

作为 ExpertRemove 调用的结果,EA 交易会从代理的内存中卸载。因此,如果你需要使用一组新参数运行新的轮次,就需要一些时间来重新加载 MQL 程序。当使用 TesterStop 时,这种情况不会发生,而且从性能方面而言,这种方法更可取。

另一方面,ExpertRemove 调用会在 MQL 程序中设置 _IsStopped 停止标志,其可以在程序的不同部分以标准方式用于结束(“清理”资源)。但是,调用 TesterStop 不会设置这个标志,因此开发人员可能需要引入他们自己的全局变量来指示提前终止,并以特定的方式对其进行处理。

值得注意的是,TesterStop 仅用于停止测试程序的一轮。
 
MQL5 不提供提前终止优化的函数。因此,例如,如果你的 EA 交易检测到优化是在错误的分时报价生成模型上启动的,并且只能在优化启动后才能检测到(OnTesterInit 此处没有作用),那么 TesterStopExpertRemove 调用将中断新的轮次,但是轮次本身将继续被启动,生成大量空结果。我们将在 大型 EA 交易示例一节中看到该实例,该示例使用保护来防止以开盘价发布。
 
可以假设在终端中运行并实际服务于优化管理器的 EA 交易实例中的 ExpertRemove 调用会停止优化。但事实并非如此。即使在 EA 交易以帧模式工作的情况下关闭图表,也不会停止优化。

建议亲身实践来尝试这些函数。