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

Pinescript如何实现回溯期内满足条件2时重置条件1的计数功能

PineScript 计数器重置逻辑实现方案

核心修改思路

你需要在遍历回溯周期统计is_condition_1次数时,按时间先后顺序判断是否遇到is_condition_2触发点,一旦遇到就重置计数器,仅统计该节点之后的is_condition_1触发次数。

修改后的完整代码(兼容原有循环写法)

cnt = 0
is_condition_1 = false
is_condition_2 = false
if timeframe.isdaily
    is_DD_down_bar = change(close) < close[1] * -0.002 ? true : false
    is_DD_volume_up = change(volumeData) > 0 ? true : false
    is_condition_1 := is_DD_down_bar and is_DD_volume_up ? true : false
    is_condition_2 := crossover(close,ema(close,21))? true : false

    // 调整遍历方向:从回溯周期最远端往当前K线遍历,符合时间先后顺序
    for i = lookbackPeriod to 0 by -1
        // 遇到condition2触发直接清零计数器
        if is_condition_2[i]
            cnt := 0
        // 统计condition1触发次数
        if is_condition_1[i]
            cnt := cnt + 1

改动说明

  • 调整了for循环的遍历方向:从回溯周期最远端(i=lookbackPeriod)往当前K线(i=0)遍历,匹配时间先后逻辑
  • 每次遍历优先判断是否触发is_condition_2,触发则直接重置计数,再叠加is_condition_1的统计
  • 最终得到的cnt值就是最近一次is_condition_2触发后,回溯周期内的is_condition_1总触发次数,完全匹配你给出的示例场景预期结果

可选优化方案(无需循环,性能更高)

如果不需要严格限制最多统计32根回溯周期内的次数,仅需要统计最近一次is_condition_2触发之后的所有is_condition_1次数,可以用逐K线累计的写法,代码更简洁运行效率更高:

is_condition_1 = false
is_condition_2 = false
var cnt = 0
if timeframe.isdaily
    is_DD_down_bar = change(close) < close[1] * -0.002 ? true : false
    is_DD_volume_up = change(volumeData) > 0 ? true : false
    is_condition_1 := is_DD_down_bar and is_DD_volume_up ? true : false
    is_condition_2 := crossover(close,ema(close,21))? true : false

    // 触发condition2直接清零
    if is_condition_2
        cnt := 0
    // 触发condition1累计计数
    if is_condition_1
        cnt := cnt + 1

如果需要限制最多统计32根周期内的次数,仅需额外加判断:当cnt累计对应的K线跨度超过32时停止计数即可。

内容的提问来源于stack exchange,提问作者Bierbaron1920

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:24:04