Pine Script中如何获取average指标的绝对最大与最小值?
解决Pine Script中基于整个周期绝对极值的归一化问题
编写的Pine Script指标中,
average_normalized本应基于显示周期内average的绝对最大、最小值归一化,使2014年的局部最大值对应1,但当前代码中ta.max()/ta.min()取的是截至当前K线的历史极值,导致初始值即为1且多次触发,不符合预期。
问题根源
ta.max(average)和ta.min(average)默认仅计算从第一根K线到当前K线的历史极值,而非整个显示周期的绝对极值。第一根K线因只有单个值,归一化结果必然为1,后续每根K线都会更新极值,导致归一化值频繁波动。
解决方案
利用Pine Script的var关键字定义全局持久化变量,累积整个周期的绝对极值:
- 用
var初始化全局最大/最小值为极端值(负无穷/正无穷),确保所有average值都能参与对比 - 每根K线执行时,对比当前
average与全局极值,更新全局变量 - 基于全局绝对极值完成归一化计算
修改后的代码
indicator("Risk", overlay = false) fiftyD = ta.sma(close, 50) fiftyW = ta.sma(close, 350) average = fiftyD/fiftyW * math.pow(bar_index, 0.350) // 初始化全局极值:var确保仅在第一根K线执行初始化 var float global_max = float(-math.inf) var float global_min = float(math.inf) // 逐K线更新全局极值,累积整个周期的绝对最大/最小值 global_max := math.max(global_max, average) global_min := math.min(global_min, average) // 归一化计算,加1e-10避免分母为0的极端情况 average_normalized = (average - global_min) / (global_max - global_min + 1e-10) plot(average_normalized)
关键说明
var变量在脚本加载时仅初始化一次,后续K线执行时保留之前的数值,因此能持续累积整个周期的极值- 分母添加
1e-10是为了处理所有average值相等的极端情况,避免触发除以0的错误 - 当图表加载新的历史K线时,全局极值会自动更新,始终覆盖当前显示的全部周期数据
内容的提问来源于stack exchange,提问作者RFA_
相关产品推荐
相关产品推荐

