指标的局限性和优点

本章讨论的所有专用函数仅可在指标源代码中使用。在其他类型的 MQL 程序中使用这些函数毫无意义:它们会返回错误。

此外,指标中还存在以下禁用函数:

其中一些函数(以Order- 为前缀)与交易计算相关,仅允许在 EA 交易和脚本中使用。另一些函数则用于执行会阻塞线程的请求,直到返回结果为止,而指标禁止此类操作,因为它们在终端的界面线程中执行。出于类似原因,SleepMessageBox 函数也被禁止。

指标的主要职责是可视化数据,但确实不适合执行大规模运算任务,这确实挺奇怪的。特别是,如果你决定创建一个在运行过程中训练神经网络或决策树的指标,这很可能会对终端的正常运行产生负面影响。

IndBarIndex.mq5指标展示了长时间计算的影响,该指标在正常模式下用于在其缓冲区元素中显示柱线编号。然而,通过将输入参数 SimulateCalculation设置为 true,便可以启动一个基于计时器的无限循环。

// Setting to true will freeze the drawing of indicators
// on charts of the same working symbol
// Attention! Don't forget to remove the indicator after the experiment!
input bool SimulateCalculation = false;
 
void OnInit()
{
   ...
   if(SimulateCalculation)
   {
      EventSetTimer(1);
   }
}
...  
void OnTimer()
{
   Comment("Calculation started at "TimeLocal());
   while(!IsStopped())
   {
   // infinite loop to emulate calculations
   }
   Comment("");
}

在这种模式下,正如预期的一样,该指标会完全占用 1 个处理器核心,但同时也会出现另一个副作用。在放置了IndBarIndex指标的同一交易品种上,所有其他指标都会停止更新。例如,我们可以在 EURUSD(任意时间周期)上运行 IndBarIndex指标,然后在任何其他 EURUSD 图表上尝试应用普通移动平均线:该移动平均线将不会显示,直到从第一个图表中移除 IndBarIndex 指标。

因此,所有冗长的计算都应该放在单独的线程中执行,即通过脚本或非交易型 EA 交易进行,而指标中仅使用其计算结果。MQL5 API 允许你创建新的 图表带有图表的对象,并在其中应用包含所需 EA 交易或脚本的 tpl 模板