震荡器枢轴高点均线与低点均线差值计算问题求助
问题解决:枢轴高低点均线差值计算的NA值处理
我有一个震荡器(trend),已经成功计算出枢轴高点(pivot highs)和枢轴低点(pivot lows)的移动平均线,但计算两者差值时遇到问题。核心问题是最后一个枢轴高点对应的枢轴低点均线值为NA,反之亦然。假设均线最新已知值为+0.8和-1.0,预期差值为1.8,但当前代码在遇到NA时会返回0,不符合预期。
原代码如下:
len_high = input.int(12) len_low = input.int(12) float pivotHigh = ta.pivothigh(trend, len_high, len_high) float pivotLow = ta.pivotlow(trend, len_low, len_low) avg_pvt_high = ta.ema(pivotHigh,10) avg_pvt_llow = ta.ema(pivotLow,10) plot(avg_pvt_high, color = color.rgb(208, 25, 62)) plot(avg_pvt_llow, color = color.green) var float piv_diff = 0 piv_diff := na(avg_pvt_high) or na(avg_pvt_llow) ? 0 : math.abs(avg_pvt_high)+math.abs(avg_pvt_llow) if barstate.islast label.new(bar_index+2, trend, str.tostring(piv_diff, "#.00"), style = label.style_none)
解决方案
问题出在当avg_pvt_high或avg_pvt_llow为NA时,直接将差值置为0。我们需要保留最近一次有效的均线值来计算差值,而不是直接返回0。可以用ta.valuewhen()函数获取最近的非NA值,确保差值计算始终基于有效数据。
修改后的代码如下:
len_high = input.int(12) len_low = input.int(12) float pivotHigh = ta.pivothigh(trend, len_high, len_high) float pivotLow = ta.pivotlow(trend, len_low, len_low) avg_pvt_high = ta.ema(pivotHigh,10) avg_pvt_low = ta.ema(pivotLow,10) // 修正原代码变量名拼写错误:avg_pvt_llow → avg_pvt_low plot(avg_pvt_high, color = color.rgb(208, 25, 62)) plot(avg_pvt_low, color = color.green) // 获取最近一次有效的枢轴高点/低点均线值 last_valid_high = ta.valuewhen(not na(avg_pvt_high), avg_pvt_high, 0) last_valid_low = ta.valuewhen(not na(avg_pvt_low), avg_pvt_low, 0) // 基于最近有效值计算差值 piv_diff = math.abs(last_valid_high) + math.abs(last_valid_low) if barstate.islast label.new(bar_index+2, trend, str.tostring(piv_diff, "#.00"), style = label.style_none)
关键修改说明:
- 修正变量名错误:原代码中
avg_pvt_llow拼写错误,改为avg_pvt_low避免逻辑偏差。 - 追踪最近有效值:通过
ta.valuewhen()提取最近一次非NA的均线值,即使当前某条均线无新值,也能用上一次的有效数据计算差值。 - 简化变量声明:移除不必要的
var初始化,直接基于有效值计算差值,避免旧值残留问题。
修改后,当其中一条均线暂时为NA时,会自动沿用最近的有效数值,即可得到预期的1.8差值结果。
内容的提问来源于stack exchange,提问作者Roman Mohren
相关产品推荐
相关产品推荐

