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