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

求助:Pine Script中For循环仅返回1的代码问题排查与实现需求

Pine Script循环逻辑问题排查与修复

我帮你梳理下代码里的核心问题,以及对应的修复方案:

原代码的关键问题分析

你的代码始终返回output=1,主要有几个致命问题:

  • 循环步长错误:原循环for i=0.00 to 1默认步长是1,只会遍历i=0和i=1两个值,完全没实现你要的0.01步长遍历0.00到1的需求,这是最核心的问题。
  • 计数变量未重置:frequency函数里的r_count和count用了var声明,这会让变量在脚本运行期间一直累加,不会每次调用函数时重置为0,导致计算的频率值完全不符合预期。
  • 条件判断逻辑错误:你写的if test>=0.3 or test<=0.31逻辑完全反了,应该是判断test>0.3 and test<0.31才对;而且就算条件满足,break后不会执行output := i,只有不满足条件时才会赋值,最后循环结束自然就停在i=1。

修复后的完整代码

//@version=5
indicator("Frequency Finder", overlay=false)

a = ta.ema(close, 10) - ta.ema(close, 200)

// 跟踪a的历史最低和最高值
var float lowest = 0.0
if a < lowest
    lowest := a
var float highest = 0.0
if a > highest
    highest := a

basis = math.max(-lowest, highest)

// 重写frequency函数,移除var确保每次调用重置计数
frequency(source, boundary) =>
    float count = 0.0
    float r_count = 0.0
    if source > boundary or source < -boundary
        count += 1
    else
        r_count += 1
    // 避免除以0的情况
    total = count + r_count
    total != 0 ? count / total : 0.0

var float output = 0.0

// 正确设置步长为0.01遍历
for i = 0.0 to 1.0 by 0.01
    chosen = basis * i
    test = frequency(a, chosen)
    // 匹配0.3 < test < 0.31的区间
    if test > 0.3 and test < 0.31
        output := i
        break
    // 如果遍历到最后都没满足条件,保留最后一个i值(可选,根据需求调整)
    output := i

plot(output, title="Output", color=color.blue)

关键改进说明

  • 循环步长修正:添加by 0.01参数,让i以0.01为间隔遍历0.00到1.0的所有值。
  • 计数变量重置:移除frequency函数内count和r_count的var声明,每次调用函数时都会重新初始化,保证计数的准确性。
  • 条件逻辑修正:把错误的or改成and,准确判断test是否落在0.3到0.31之间。
  • 除以0保护:添加了total != 0的判断,避免当count和r_count都为0时出现除以0的错误。
  • 赋值逻辑调整:满足条件时立即将当前i赋值给output再break,确保拿到的是第一个符合条件的i值;如果遍历完所有值都没满足,会把最后一个i(也就是1.0)赋值给output,你可以根据需求调整这部分逻辑。

另外,你后来改写的版本里,把循环放到了frequency函数内部,这其实没必要,而且同样存在var变量未重置和条件判断错误的问题,上面的修复方案已经把这些问题都解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:27:52