时间序列
时间序列是一种数据数组,其中元素的索引对应于有序的时间样本。由于终端的应用特性,交易者所需的几乎所有信息都是以时间序列的形式提供的。具体而言,这些信息包括报价数组、分时报价、技术指标读数等等。绝大多数 MQL 程序也处理这些数据,因此 MQL5 API 中专门为它们分配了一组函数,本节将重点探讨这些函数。
MQL5 中访问数组的方式使开发者可以设置以下两种索引方向之一:
- 正向(向前)- 元素编号从数组的开始到结束(从旧到新)
- 反向(时间序列)- 编号从数组的结束到开始(从新到旧)
我们已经在 时间序列中的数组索引方向章节中讨论过此问题。
可使用ArraySetAsSeries函数来更改索引模式,并且这一操作不会影响数组在内存中的物理结构。只有通过编号访问元素的方式会发生变化:在正向索引索引模式下,我们通过 array[i]获取第 i 个元素;而在时间序列模式下,等效的公式为array[N - i - 1],其中 N 是数组的大小(之所以称为“等效”,是因为如果为数组设置了时间序列索引模式,终端会自动执行这种重新计算,应用开发者无需在各处都进行这样的计算)。下表对此进行了说明(以一个包含 10 个元素的字符数组为例)。
数组元素 |
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
常规索引 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
时间序列中的索引 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
请记住,数组索引始终从零开始。
当涉及报价数组和其他持续更新的数据时,新元素会按物理顺序追加到数组末尾。但从交易角度来看,分析历史数据时应考虑最新数据并将其作为起点。正因如此,将当前(最后一个)柱线始终置于索引 0 的位置,而之前的柱线则从该索引开始按过去顺序依次计数,这种方式更为便捷。由此,我们便有了时间序列索引。
默认情况下,数组按从左到右的顺序建立索引。如果我们设想这样的数组显示在标准的 MetaTrader 5 图表上,从视觉上看,索引为 0 的元素会位于最左侧,最后一个元素位于最右侧。在反向索引的时间序列中,第 0 个元素对应最右侧位置,最后一个元素对应最左侧位置。由于时间序列按照时间顺序存储金融工具的价格历史数据,其中最新数据始终位于旧数据的右侧。
时间序列数组中索引为 0 的元素包含有关交易品种最新报价的信息。第 0 根柱线通常是不完整的,因为它仍在形成中。
报价时间序列的另一个特征是其周期,即相邻读数之间的时间间隔。该周期也称为“时间范围”,可以更精确地重新表述。时间范围是形成一根报价柱线的周期,其起始和结束在绝对时间上以相同的步长对齐。例如,在“1 小时”(H1) 时间范围下,柱线严格从每天整点的 0 分钟开始。每个这样的周期的起点属于当前柱线,终点则属于下一根柱线。
在 交易品种和时间范围 一章中,提供了标准时间范围的完整列表。
通常,在时间序列概念框架内,技术 指标 的缓冲也会起作用,但我们将在后面详细讨论它们的特性。
在任何 MQL 程序中,如有需要,均可请求获取任意交易品种和时间范围的时间序列数值,以及为任意交易品种和时间范围计算的指标数值。这些数据可通过 Copy函数获取,其中包括分别多个读取不同类型价格数组的函数(例如 Open、High、Low、Close),以及读取包含每根柱线全部特征的 MqlRates 结构体数组的函数。
柱线和分时报价
除了带报价的柱线外,MetaTrader 5 还为用户和 MQL 程序提供了分析“分时报价”的能力,它们是构成柱线的基本价格变动单位。每个分时报价包含精确到毫秒的时间、多种价格类型 (Bid, Ask,Last)、描述变动性质的标志以及交易的成交量。我们将在稍后的 使用真实分时报价数组一章中学习相应的 MqlTick结构。
根据交易金融工具的类型,柱线可以基于 Bid或Last 价格构建。特别是对于交易所交易金融工具,可使用 Last价格,这些金融工具同时会实时推送 市场深度价格。对于外汇或 CFD 等非交易所金融工具,则使用 Bid价格。
没有价格变动的周期不会生成柱线。这就是 MetaTrader 5 中价格的呈现方式。例如,如果时间范围为 1 天 (D1),则周末通常不会生成柱线,周五的柱线之后会直接显示周一的柱线。
只有当相应时间间隔内至少出现一个分时报价时,才会生成一根报价柱线。同时,柱线的开盘时间始终严格与时间周期边界对齐,即使第一个分时报价到达的时间较晚(通常就是这种情况)。例如,如果午夜后 4 分钟内没有分时报价,而在 00:05:15(即第 5 分钟的第 15 秒)发生了价格变动,则当天的第一根 M1 柱线将在 00:05 形成。因此,分时报价是否属于某根柱线,取决于以下时间戳关系:Topen <=Ttick < Topen + P,其中 Topen 是柱线开盘时间,Ttick 是分时报价时间,Topen + P 是周期 P 结束后下一个潜在柱线的开盘时间(称为“潜在”柱线,是因为其是否存在取决于是否有其他分时报价)。