Pine脚本技术问询:如何对比当前CCI与前10根K线并标记Bar颜色?
解决Pine Script中CCI对比与barcolor标记的问题
嘿,这个问题我之前写Pine脚本的时候也踩过坑!确实Pine不允许在if语句里直接调用barcolor,不过咱们换个思路用条件表达式就能搞定,而且对比过去K线的CCI根本不用手动挨个比,用内置函数就超简便。
核心思路
Pine Script是声明式语言,像barcolor这类绘图函数需要直接接收条件或颜色参数,而不是通过流程控制语句触发。另外,用ta.highest()和ta.lowest()这两个内置函数,就能快速对比当前CCI和过去N根的数值,不用写循环。
完整代码实现
下面分两种场景给你写好代码,你可以按需选用:
//@version=5 indicator("CCI对比K线颜色标记", overlay=true) // 定义自定义CCI周期为10 MyCCI = ta.cci(close, 10) // --- 条件判断 --- // 1. 当前CCI低于过去10根中的任意一根(即至少有一根过去的CCI比当前高) isLowerThanAny = MyCCI < ta.highest(MyCCI, 10)[1] // 这里的[1]是取上一个周期的最高值,确保只对比过去10根,不包含当前 // 2. 当前CCI低于过去10根中的全部一根(即当前是过去11根里的最低值) isLowerThanAll = MyCCI == ta.lowest(MyCCI, 11) // ta.lowest(MyCCI,11)包含当前+过去10根,当前等于这个值就说明比过去10根都低 // --- 给K线上色 --- // 两种情况用不同颜色区分,没满足条件就用默认颜色(na表示不修改) barcolor(isLowerThanAll ? color.blue : isLowerThanAny ? color.red : na)
关键细节解释
- 为什么不用if?:Pine的
barcolor函数需要一次性为所有K线指定颜色规则,用条件表达式(三元运算符? :)可以直接把规则传递给函数,这才符合Pine的声明式逻辑。 [1]的作用:如果直接用ta.highest(MyCCI,10),会包含当前K线的CCI值,加上[1]就只取过去10根的最高值,确保对比的是“过去”的K线。- 两种场景的区别:
isLowerThanAny是只要过去10根里有一根比当前高就触发;isLowerThanAll是当前比过去10根都低才触发,你可以根据需求单独用其中一个,或者像代码里那样组合起来用不同颜色标记。
内容的提问来源于stack exchange,提问作者Mack Drake
相关产品推荐
相关产品推荐

