求助: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
相关产品推荐
相关产品推荐

