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

Pine Script交易信号计数异常求助:100K线后重置逻辑错误

交易入场信号计数逻辑优化方案

需求说明

  • 统计deepAlert交易入场信号的出现次数
  • 首个信号出现后,若超过100根K线未触发交易(无持仓状态),则将计数重置为0,后续信号重新开始统计
  • 当前问题:第二个信号出现时计数异常跳至3(期望为2),且之前尝试的while循环引发执行超时错误

现有代码问题分析

  1. 使用for循环遍历历史K线统计信号,当bars数值较大时极易触发执行超时
  2. 重置逻辑设计错误,未精准跟踪信号触发后的K线周期,导致计数异常
  3. while循环的错误嵌套使用直接引发执行超时

正确实现代码

//@version=5
strategy("Signal Count Strategy", overlay=true)

// 替换为你实际的入场信号条件
deepAlert = ta.crossover(ta.sma(close, 5), ta.sma(close, 20))
inLong = strategy.position_size > 0

// 持久化变量:跨K线保留状态
var int signalCount = 0          // 信号计数
var int barsSinceLastSignal = 0  // 距离上次信号的K线数
var bool resetTriggered = false  // 是否需要重置计数的标记

// 信号触发时更新计数
if deepAlert
    if resetTriggered
        signalCount := 1
        resetTriggered := false
    else
        signalCount += 1

// 计算距离上次信号的K线数
barsSinceLastSignal := ta.barssince(deepAlert)

// 触发重置条件:无持仓且超过100根K线未出现交易
if not inLong and barsSinceLastSignal > 100
    resetTriggered := true
    signalCount := 0

// 可视化计数结果
plot(signalCount, title="Valid Signal Count", color=color.new(color.green, 0), linewidth=2, display=display.data_window)

逻辑说明

  1. 持久化变量:用var定义的变量会在所有K线中保留值,无需每次重新初始化
  2. 信号计数更新:当deepAlert触发时,若之前触发过重置标记,则从1开始计数;否则正常累加
  3. 周期计算:通过ta.barssince()高效获取距离上次信号的K线数,替代低效的循环遍历
  4. 重置触发:当满足“无持仓且距离上次信号超过100K线”条件时,标记需要重置并将计数置0,下次信号触发时重新开始统计

关键优化

  • 移除所有for/while循环,利用Pine Script内置时间序列函数提升性能,彻底解决执行超时问题
  • 通过状态标记精准控制计数重置时机,避免计数异常跳转
  • 逻辑直接基于信号触发事件,无需遍历历史数据,代码更简洁易懂

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:01:13