指标的主要特性
指标实现了一种特定的计算算法,该算法通过柱线应用于给定的初始时间序列或多个时间序列。所有此类时间序列均为 terminal's own数组(请参阅函数 ArrayIsSeries):终端为其分配内存,并在新柱形形成时添加新元素。自然地,不同时间范围下的交易品种报价数组具有基础性作用,因为这些数组由终端自动填充。但已启动的指标可显著扩展可供分析的时间序列集合。
指标通常将其运算结果存储在动态数组中,这些数组通过专用函数 (SetIndexBuffer) 注册为指标缓冲区,并同样成为终端的自有数组。除了为这些数组分配内存外,终端还将其作为新的时间序列提供公共访问权限,其他指标可基于这些时间序列进行计算。
指标计算部分的入口点是OnCalculate函数,一个同名的事件处理程序。在 事件处理函数概述中,我们已提及该函数:只要源代码中包含该函数,就足以让终端将该 MQL 程序识别为指标。OnCalculate函数将在 下一节中详细介绍。特别是,OnCalculate函数的主要特点是存在两种不同的形式。程序员应在指标设计的最开始就选择该选项,因为这决定了指标的用途和可能的应用场景。
OnCalculate函数并非指标的唯一区别性特性。除此之外,一组特殊的预处理器指令#property专门用于指标,我们将在本章的几个相关章节中逐步介绍它们。此前我们已经了解了一些 通用程序特性,这些指令当然也适用于指标。
正如 MetaTrader 5 用户所知,每个指标都以自己的方式来显示其图形结构(时间序列):可以显示在展示交易品种价格的主窗口中,也可以显示在单独的子窗口中。当某个指标(或一组指标)被添加到图表时,如果该指标设计为在子窗口中运行,则会在窗口下方创建一个子窗口。例如,标准移动平均线 (MA) 指标绘制在价格图表上,而威廉指标 (WPR) 则绘制在单独的子窗口中。
从开发者的角度来看,这意味着,需要在最初阶段确定指标是显示在主窗口还是子窗口中,因为这两种模式无法同时使用。此外,这一特性以及指标缓冲区数量只能通过 #property指令一次性设置(请参见 两种类型的指标 和 设置缓冲区和绘图的数量,之后无法通过 MQL5 API 函数调用进行修改,因为根本不存在此类函数。与这些不可变特性不同,大多数其他指标特性可以通过特殊函数进行动态调整。因此,在研究指标编程的技术细节时,我们将能够建立 #property特性与 MQL5 函数之间的对应关系。
此外,指标通常还会实现 OnInit和 OnDeinit 处理程序(请参阅 指标和 EA 交易的参考事件)。OnInit函数尤为重要,它用于分配将作为指标缓冲区的数组,这些缓冲区用于存储中间及最终计算结果,既可供用户查看,也能被其他程序(如 EA 交易)调用。
指标是交互式 MQL 程序的一种,必要时,它可以处理计时器事件 (OnTimer) 以及用户或其他程序产生的图表变化 (OnChartEvent)。这些技术特征对于指标而言是可选的,并且基于 图表事件队列。我们将在关于 图表一章中单独讨论它们。