PineScript中b1[1]的取值来源及计算逻辑疑问
PineScript中Purple Cloud策略b1变量的赋值逻辑解析
你对b1[1]的取值逻辑理解有误,PineScript的历史引用[1]指向的是上一根K线的变量值,而非初始赋值的0.0,下面分场景拆解:
1. 第一根K线的执行逻辑
当脚本运行到第一根K线时:
- 首先执行
b1 = 0.0,给当前K线的b1赋初始值0.0 - 接着用
:=重新赋值,此时判断na(b1[1]):因为第一根K线没有上一根K线,b1[1]是na(空值),所以条件成立,b1被赋值为ta.sma(close,14)(或完整策略中的ta.sma(close, x1)) - 最终第一根K线的b1值是对应周期收盘价的SMA,而非0.0
2. 第二根及后续K线的执行逻辑
从第二根K线开始:
na(b1[1])判断为false,因为上一根K线已经有计算好的b1值(不是空值)- 此时执行公式
(b1[1]*(x1-1)+close)/x1,这是递归式移动平均计算,和SMA的滚动更新逻辑完全一致:新平均值 = (旧平均值 × (周期数-1) + 当前收盘价) ÷ 周期数
- 所以每一根K线的b1值,都是基于上一根K线的b1值滚动计算而来,和初始的0.0没有关系
为什么你看到b1[1]不是0?
你打印b1[1]时,查看的是当前K线的上一根K线的b1值:
- 如果是第二根K线,
b1[1]是第一根K线计算出的SMA值 - 如果是后续K线,
b1[1]是前一根K线的递归平均结果 - 初始赋值的0.0只会在第一根K线的
b1 = 0.0步骤短暂存在,随后就被:=的赋值覆盖了
可以用以下简化代码验证逻辑:
// 测试代码:对比递归计算和原生SMA x1 = 14 b1 = 0.0 b1 := na(b1[1]) ? ta.sma(close, x1) : (b1[1] * (x1 - 1) + close) / x1 plot(b1, color=color.blue) plot(ta.sma(close,14), color=color.red, style=plot.style_dashed) // 两条线会完全重合,说明递归计算和SMA结果一致
内容的提问来源于stack exchange,提问作者윤석민
相关产品推荐
相关产品推荐

