调试和概要分析

MetaTrader 5 测试程序不仅适用于测试交易策略的盈利能力,也适用于调试 MQL 程序。错误检测主要与再现问题情况的能力相关。如果我们只能在线运行 MQL 程序,调试和分析源代码执行将需要不切实际的工作量。但是,测试程序允许你“运行”程序的任意部分的历史,更改账户设置和交易信号。

回想一下,在 MetaEditor 中的 Debug 菜单中有 2 个命令:

  • Start/Continue on real data (F5)
  • Start/Continue on historical data (Ctrl-F5)

在这两种情况下,程序会立即以特殊的方式重新编译,并在 ex5 文件中添加额外的调试信息,然后直接在终端(第一个选项)或测试程序(第二个选项)中启动。

在测试程序中调试时,可以使用快速(后台)模式和可见模式。此设置在 Debug/Profile 选项卡上的 Setting 对话框中提供:启用或禁用 Use visual mode for debugging on history 标志。调试程序的环境和设置可以直接从测试程序中获取(就像上次为该程序设置的一样),或者在同一对话框中 Use specified settings 标志下的输入字段中获取(要使其工作,必须启用该标志)。

你可以在操作符上预设断点 (F9),在该操作符上,某些要素可能开始出错。当到达源代码中的指定位置时,测试程序将暂停该过程。

请注意,在测试程序中,启动时加载的历史柱线数量取决于不同的因素(包括时间范围、一年中的天数等),并且可能有很大差异。如有必要,将测试的开始时间向后移动。

除了导致程序停止或明显故障的明显错误之外,还有一类对性能有负面影响的微小错误。通常这些错误并不明显,但是随着处理的数据量增加,就会演变成严重问题,例如,在具有很长历史的交易账户上,或者在具有大量标记对象的图表上。

为了找到性能方面的“瓶颈”,调试人员提供了源代码概要分析机制。该分析机制也可以在线执行或在测试程序中执行,后者尤其有价值,因为它允许大大压缩时间。相应的命令也可以在调试菜单中找到。

  • Start profiling on real data
  • Start profiling on historical data

对于概要分析,程序也是用特殊设置预编译的,所以不要忘记在调试或概要分析完成后,在正常模式下再次编译程序(特别是如果你计划将其发送到客户终端或上传到 MQL5 市场)。

作为 MetaEditor 中的概要分析结果,你将收到代码执行的按行和函数(方法)细分的时间统计数据。这样,导致程序运行速度变慢的具体原因就很清楚了。开发的下一个阶段通常是 refactoring 源代码,即使用改进的算法、数据结构体或模块(组件)的其他建设性组织原则进行重写。不幸的是,编程中很大一部分时间花在重写现有代码、查找和修复错误上。

如有必要,程序本身可以找出其运行模式,并使其行为适应环境(例如,在测试程序中运行时间,不会尝试从互联网下载数据,因为此函数已禁用,但会从某个文件中读取数据)。

在编译阶段,由于预处理器宏 _DEBUG 和 _RELEASE 的原因,程序的调试版本和生产版本可能有所不同。

在程序执行阶段,可以使用 MQLInfoInteger 函数选项来区分其模式。

下表总结了影响运行时细节的所有可用组合。

运行时间\标志

MQL_DEBUG

MQL_PROFILER

Normal(release)

在线

+

+

+

测试程序
(MQL_TESTER)

+

+

+

测试程序
(MQL_TESTER+MQL_VISUAL_MODE)

+

-

+

只有在没有可见模式的情况下,才能在测试程序中进行概要分析,因此你应使用图表和在线对象来测量操作。

优化过程中不允许进行调试,包括特殊处理程序 OnTesterInitOnTesterDeinitOnTesterPass。如果需要检查它们的性能,可以考虑在其他条件下调用其代码。