如何理解Pine脚本的执行机制# 如何理解Pine脚本的执行机制
很多情况下,我们都是直接用到TradingView社区提供的各种指标和策略。确实很多人不理解Pine是如何来执行脚本的,理解其中的机理对于利用TradingView做量化交易会非常的有帮助。因为你会明白这个脚本的执行是否和自己主观想法和设定是否一致。这里最需要注意的就是“向坐看”和“向右看”执行机制的不同,这对于理解并写好一个策略至关重要。
当 一个Pine 脚本加载到图表上时,它会使用每根K线的可用 OHLCV(开盘价、最高价、最低价、收盘价、交易量)值在每个历史K线上执行一次。一旦脚本的执行到达数据集中最右边的K线,如果图表标的上的交易当前处于活动状态,则技术指标(indicator)*将*在每次发生*更新*(即价格或交易量变化)时执行一次。默认情况下,技术*策略(strategy)*仅在最右边的K线收盘时执行。 所以, 在默认情况下, indicator要比strategy的响应速度更快,这也是很多量化交易者喜欢用indicator的原因。但是, 实际上技术策略strategy也可以配置为在每次更新时执行,就像indicator一样。
在TradingView中,所有交易标的都有一个包含有限数量K线的数据集合。当你向左滚动图表以查看数据集较早的K线时,相应的K线就会将加载到图表上。当该特定交易标的对不再有K线或您的账户类型允许的最大K线数已加载时,加载过程才会停止。此时,直到数据集合的第一根K线,该K线的索引值为 0, 这就是Pine脚本内置变量 bar_index= 0的情况。
当脚本第一次在图表上运行时,除了最右边的K线(如果交易时段处于活动状态),数据集合中的其它K线都是*历史K线,都是过去式*。当最右边的K线上交易活跃时,它被称为*实时K线*。当检测到价格或交易量变化时,实时K线会更新。当实时K线收盘时,它会变成*已过的实时K线*,并会打开一个新的实时K线。而一个策略算的好坏就在于是否能处理好这两类K线: 最右边的实时K线和其它历史K线。
首先来说说历史K线,按照TradingView的执行机制,一旦K线的 OHLCV 值全部已知时,脚本会在该K线的收盘价时执行。在K线上执行脚本之前,内置变量(例如`open`、`high`、`low`、`close`和`volume`)`time`被设置为与该K线中的值相对应的值。所以,对于历史K线,**每个历史K线会**执行一次脚本,并把这根K线基于OHLCV运算的结果用plot绘制在图表上成一个点。因为,所有历史K线都仅被执行一次,所以plot会以bar_index为索引,很快地计算获得一个需要plot的输出数据序列。脚本中每一行的执行都会产生计算,进而生成指标的输出值,然后可以将其绘制在图表上。在第一根K线上执行并绘制后,将在数据集合的第二根K线(bar_index索引为 1)上执行脚本。然后重复该过程,直到数据集合中的所有历史K线都已处理完毕并且脚本到达图表上最右侧的K线。
Pine 脚本在实时K线上的行为与在历史K线上的行为非常不同。回想一下,当图表的标的上的交易处于活动状态时,实时K线是图表上最右侧的那一根。另外,请记住,策略strategy类型脚本在实时K线中可以以两种不同的方式表现。默认情况下,它们仅在实时K线收盘时执行一次,但可以将声明语句`calc_on_every_tick`的参数`strategy`设置为 true 以修改策略的行为,以便它像指标(indicator)一样在每次实时K线更新时执行。
当脚本到达实时K线时,它会第一次执行。它使用内置变量的当前值来生成一组结果,并根据需要绘制它们。在下一次更新发生时脚本再次执行之前,其用户定义的变量将重置为与上一K线收盘时的最后一次*提交相对应的已知状态。*如果没有对变量进行提交,因为它们在每根K线上都被初始化,那么它们将被重新初始化。在这两种情况下,它们最后计算的状态都会丢失。绘制的标签和线条的状态也会重置。在实时K线中脚本的每次新迭代之前重置脚本的用户定义变量和绘图称为*回滚*。其作用是将脚本重置为实时K线打开时所处的相同已知状态,因此实时K线中的计算始终从干净的状态执行。当实时K线收盘时,脚本将执行最后一次。像往常一样,变量在执行之前回滚。然而,由于此迭代是实时K线上的最后一次迭代,因此在计算完成时变量将被提交为该K线的最终值。
综上所述,实时K线的数据处理和历史K线完全不同,可以总结为:
1. 脚本**在实时K线开盘时执行,然后每次更新时执行一次**。
2. **变量在每次实时更新之前**回滚。
3. **变量在K线收盘时**提交一次。
实时K线的更新会在人为外界干预时候刷新,或者随着开市市场价格,成交量变化而进行刷新。