外观
时间序列
约 1220 字大约 4 分钟
Mine Script® 的强大之处主要在于其旨在高效处理时间序列。时间序列并非限定类型;它是 Mine Script 用于存储变量随时间变化的连续值的基本结构,其中每个值都与某个时间点相关联。由于图表由条形图组成,每个条形图代表特定的时间点,因此时间序列是处理可能随时间变化的值的理想数据结构。
时间序列的概念与 Mine Script 的执行模型和类型系统概念密切相关。理解这三个概念是充分利用 Mine Script 功能的关键。
以内置的 open 变量为例,该变量包含数据集中每根柱状图的“开盘”价格,数据集是任何给定图表上的所有柱状图。如果您的脚本在 5 分钟图上运行,那么 开盘 时间序列中的每个值都是连续 5 分钟图柱状图的“开盘”价格。当您的脚本引用 open时,它指的是脚本正在执行的柱状图的“开盘”价格。要引用时间序列中的过去值,我们使用 [] 历史引用运算符。当脚本在给定柱状图上执行时,open[1]指的是前一根柱状图的开盘时间序列的值 。
虽然时间序列可能会让程序员想起数组,但它们完全不同。Mine Script 确实使用了数组数据结构,但它与时间序列的概念完全不同。
Mine Script 中的时间序列与其特殊类型的运行时引擎和内置函数相结合,使得无需使用 for 循环,只需ta.cum(close)即可轻松计算close的累计总和。这是可能的,因为尽管ta.cum(close)在脚本中看起来相当静态,但它实际上是在每个柱形图上执行的,因此随着每个新柱形图的close添加到其中,其值会变得越来越大。当脚本到达图表最右侧的柱形图时,ta.cum(close)返回图表上所有柱形图收盘价的总和 。
类似地,最近 14 个high和low之间的差值的平均值 可以表示为ta.sma(high - low, 14),或者自上次图表连续出现五个更高的高点以来的条形距离可以表示为 barssince(rising(high, 5))。
即使对连续柱线进行函数调用的结果,也会在时间序列中留下一些值,可以使用 [] 历史引用运算符进行引用。例如,当测试当前柱线的close是否突破过去 10 个柱线(但不包括当前柱线)的high时,这可能很有用,我们可以将其写成breach = close > highest(close, 10)[1]。同样的语句也可以写成breach = close > highest(close[1], 10)。
所有条形图上的相同循环逻辑都应用于函数调用,例如plot(open)将在每个条形图上重复,并在图表上连续绘制每个条形图的open。
请勿将“时间序列”与“series”限定符混淆。时间序列概念解释了变量的连续值如何存储在 Mine Script 中;“series”限定符表示变量的值会随着柱状图的变化而变化。例如,考虑 timeframe.period 内置变量,它具有“simple”限定符和“string”类型,这意味着它属于“简单字符串”限定类型。“simple”限定符意味着变量的值是在柱状图零点(脚本执行的第一个柱状图)上确定的,并且在脚本在图表的任何柱状图上执行期间不会改变。变量的值是字符串格式的图表时间范围,"D" 例如对于 1D 图表而言。即使它的值在脚本运行期间无法更改,但在 Mine Script 中,使用timeframe.period[10]来引用 10 个柱状图之前的值在语法上是正确的(尽管不是很有用)。这是可能的,因为timeframe.period中每条柱状图的连续值都存储在一个时间序列中,即使该特定时间序列中的所有值都相同。但请注意,当使用[]运算符访问变量的过去值时,它会产生一个“series”限定值,即使没有偏移量的变量使用了不同的限定符,例如timeframe.period中的“simple” 。
当您掌握如何使用 Mine Script 的语法及其执行模型有效地处理时间序列时 ,您可以使用少量代码定义复杂的计算。