为何删除input将length设为50后,Andean Oscillator指标结果不同?
问题背景
在Andean Oscillator的Pine Script v5代码中,将length = input(50)替换为length = 50后,指标输出结果出现完全不同的情况,核心疑问是:为何同样赋值为50,结果却不一致?
原核心代码片段:
// 原代码 length = input(50) var alpha = 2/(length+1)
修改后代码片段:
// 修改后代码 length = 50 var alpha = 2/(length+1)
核心原因解析
从Pine Script的执行逻辑和变量特性来看,导致结果差异的场景主要有以下两种:
1. 输入参数的历史修改残留
input(50)定义的是用户可交互的输入参数,默认值为50,但如果你之前手动修改过该参数的数值(比如改成10、20等),TradingView会缓存这个修改后的参数值。当你替换为硬编码的length=50时,脚本会使用固定的50计算,这和之前修改过的非50参数值产生的结果自然不同。
这种情况并非代码逻辑差异,而是输入参数缓存导致的偏差。你可以右键点击图表上的指标,选择「Settings」重置输入参数为默认值,再对比两种代码的结果,会发现它们完全一致。
2. 脚本重新加载后的var变量重置
Pine Script中var关键字声明的变量仅在脚本首次加载的第一个K线时初始化一次,后续K线不会重新计算。当你修改代码(从input()改为硬编码)时,脚本会被重新编译,所有var变量(alpha、up1、up2等)会被重置为初始值:
- 原代码使用
input()时,若脚本已运行一段时间,var变量已经积累了历史计算值; - 修改为硬编码后,脚本重新加载,
var变量会重置为初始状态(alpha重新计算为2/51,up1等重置为0),并从头计算所有历史K线。
不过这种场景下的差异通常是细微的,不会达到“完全不同”的程度,更多是历史计算断点导致的偏差。
验证结论
将两段代码分别添加到同一图表的同一时间周期下,确保input(50)的参数未被修改,你会发现两者的bull和bear曲线完全重合——因为alpha的计算值完全一致,后续的平滑计算逻辑也没有变化。
内容的提问来源于stack exchange,提问作者Exlusivité Web

