Pine Script如何实现指定条件触发后的条件累计计数
触发点分段累计计数实现方案
原生cum()函数是从图表第一根K线开始全局累计,要实现「指定条件触发后重置、重新开始累计目标值」的需求,不需要用循环遍历历史K线,用逐K线状态递推的写法就能实现,性能远高于for循环方案,同时兼容历史K线回测和实时K线计算。
核心实现逻辑
累计值遵循三个规则即可:
- 每根K线先判断是否命中重置触发条件,命中则把累计值清零
- 没命中触发条件时,累计值继承上一根K线的累计结果
- 没命中触发条件时,如果当前K线满足要统计的目标条件,就在继承值的基础上累加对应计数/数值,不满足则直接保留继承值
以「RSI跌破30后,统计后续阳线累计数量」的需求为例,代码如下:
// 定义基础计算指标与条件 rsiValue = ta.rsi(close, 14) resetTrigger = ta.crossunder(rsiValue, 30) // 重置累计的触发条件 countTarget = close > open // 待统计的目标条件:收阳线 // 核心递推累计逻辑 upBarCount = 0 upBarCount := resetTrigger ? 0 : upBarCount[1] + (countTarget ? 1 : 0)
方案优势
对比bar_index定位、for循环遍历的实现思路,这个写法解决了所有已知问题:
- 不存在历史K线计算失效的问题,逐K线递推的逻辑在回测和实时行情下计算结果完全一致
- 无循环迭代,每根K线计算复杂度为O(1),哪怕两个触发点间隔上万根K线也不会出现计算卡顿
- 自动适配多次触发场景:每次触发条件命中时自动清零重新计数,天然支持分段统计每轮触发后的累计结果
如果需要累计的不是次数,而是具体数值(比如触发后的累计涨跌幅、累计成交量等),只需要把累加项的1替换成对应要累计的数值即可,示例:
// 统计上次RSI跌破30之后的阳线累计涨幅 cumUpGain = 0.0 cumUpGain := resetTrigger ? 0.0 : cumUpGain[1] + (countTarget ? (close - open) : 0.0)
注意:如果需要触发条件命中的那根K线本身也参与统计,只需要调整重置分支的返回值即可,比如触发当根收阳线就计入1,可把重置分支的
0改为countTarget ? 1 : 0。

内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

