指标的局限性和优点
本章讨论的所有专用函数仅可在指标源代码中使用。在其他类型的 MQL 程序中使用这些函数毫无意义:它们会返回错误。
此外,指标中还存在以下禁用函数:
- OrderCalcMargin
- OrderCalcProfit
- OrderCheck
- OrderSend
- SendFTP
- WebRequest
- Socket***
- Sleep
- MessageBox
- ExpertRemove
其中一些函数(以Order- 为前缀)与交易计算相关,仅允许在 EA 交易和脚本中使用。另一些函数则用于执行会阻塞线程的请求,直到返回结果为止,而指标禁止此类操作,因为它们在终端的界面线程中执行。出于类似原因,Sleep和 MessageBox 函数也被禁止。
指标的主要职责是可视化数据,但确实不适合执行大规模运算任务,这确实挺奇怪的。特别是,如果你决定创建一个在运行过程中训练神经网络或决策树的指标,这很可能会对终端的正常运行产生负面影响。
IndBarIndex.mq5指标展示了长时间计算的影响,该指标在正常模式下用于在其缓冲区元素中显示柱线编号。然而,通过将输入参数 SimulateCalculation设置为 true,便可以启动一个基于计时器的无限循环。
// Setting to true will freeze the drawing of indicators
|
在这种模式下,正如预期的一样,该指标会完全占用 1 个处理器核心,但同时也会出现另一个副作用。在放置了IndBarIndex指标的同一交易品种上,所有其他指标都会停止更新。例如,我们可以在 EURUSD(任意时间周期)上运行 IndBarIndex指标,然后在任何其他 EURUSD 图表上尝试应用普通移动平均线:该移动平均线将不会显示,直到从第一个图表中移除 IndBarIndex 指标。
因此,所有冗长的计算都应该放在单独的线程中执行,即通过脚本或非交易型 EA 交易进行,而指标中仅使用其计算结果。MQL5 API 允许你创建新的 图表 或 带有图表的对象,并在其中应用包含所需 EA 交易或脚本的 tpl 模板 。