blackcat1402

如何理解Pine脚本的执行机制

SSE:000001   SSE Composite Index
# 如何理解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线的更新会在人为外界干预时候刷新,或者随着开市市场价格,成交量变化而进行刷新。

Avoid losing contact!Don't miss out! The first and most important thing to do is to join my Discord chat now! Click here to start your adventure: discord.com/invite/ZTGpQJq 防止失联,请立即行动,加入本猫聊天群: discord.com/invite/ZTGpQJq
Disclaimer

The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.