You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:48:22