如何让日线与低时间周期图表的ADR计算结果一致?
跨周期ADR计算结果不一致的解决方法
问题描述
编写了一个TradingView指标,使用ADR变量计算,但日线图表与5分钟等低时间周期图表的ADR计算结果不一致。右侧数据窗口显示daily_range数组在不同周期取值不同,但绘制的高低点线条取值正确,需要实现跨周期ADR计算结果一致。
问题原因
当前代码中,daily_range是通过跨周期获取日线高低点后在当前周期计算,再用ta.sma()计算10日均值。但在低时间周期(如5分钟)中,每个K线都会重复获取当日的daily_range值,导致ta.sma()计算时会将同一个交易日的区间值多次纳入样本,而日线周期中每个K线仅对应一个交易日的区间值,两者的SMA计算样本逻辑不同,最终结果不一致。
解决方案
将ADR的完整计算逻辑(包括daily_range的均值计算)放在日线周期内完成,通过request.security()直接请求日线周期上计算好的10日ADR值,而非在当前周期计算均值。这样无论当前使用什么时间周期,获取的都是统一的日线周期计算结果,保证跨周期一致性。
修正后的完整代码
//@version=5 indicator("ADR-TEST", shorttitle="ADR-Test") ticker_D = ticker.new(syminfo.prefix, syminfo.ticker, session.regular) // 直接在日线周期内完成daily_range的计算和SMA均值 adr = request.security(ticker_D, 'D', ta.sma(high - low, 10)) // 同时获取日线高低点用于绘制 [day_high, day_low] = request.security(ticker_D, 'D', [high, low]) // 调试用输出 plot(adr, "adr", display = display.data_window) // 获取历史日线区间值用于验证 daily_range = day_high - day_low plot(daily_range, "daily_range", display = display.data_window) plot(daily_range[1], "daily_range1", display = display.data_window) plot(daily_range[2], "daily_range2", display = display.data_window) plot(daily_range[3], "daily_range3", display = display.data_window) plot(daily_range[4], "daily_range4", display = display.data_window) plot(daily_range[5], "daily_range5", display = display.data_window) // 高低点绘制代码 highLine = line.new(bar_index - 1, day_high, bar_index, day_high, extend = extend.both, color = color.green) lowLine = line.new(bar_index - 1, day_low, bar_index, day_low, extend = extend.both, color = color.green) highLine1 = line.new(bar_index - 1, day_high[1], bar_index, day_high[1], extend = extend.both, color = color.red) lowLine1 = line.new(bar_index - 1, day_low[1], bar_index, day_low[1], extend = extend.both, color = color.red) highLine2 = line.new(bar_index - 1, day_high[2], bar_index, day_high[2], extend = extend.both, color = color.rgb(0, 255, 255)) lowLine2 = line.new(bar_index - 1, day_low[2], bar_index, day_low[2], extend = extend.both, color = color.rgb(0, 255, 255)) // 删除旧线条 line.delete(highLine[1]) line.delete(highLine1[1]) line.delete(lowLine[1]) line.delete(lowLine1[1]) line.delete(highLine2[1]) line.delete(lowLine2[1])
说明
- 核心修改:将
ta.sma(daily_range, 10)的计算逻辑移入request.security()的日线周期请求中,确保均值计算完全基于日线级别的单条K线数据,避免低周期重复值干扰。 - 高低点绘制逻辑保持不变,依然可以正确显示不同交易日的高低水平线。
- 调试用的
daily_range输出仍可正常查看,且跨周期取值会保持一致。
内容的提问来源于stack exchange,提问作者Waldemar Heimann
相关产品推荐
相关产品推荐

