PineScript低时间帧ADX/DMI跨周期一致显示方案咨询
PineScript跨时间帧ADX/DMI数值一致性解决方案
问题核心原因
你之前代码出现数值随图表周期切换变化的核心问题是:security函数第三个参数传入的表达式adxcol,是基于当前打开的图表周期计算的,切换图表周期时adxcol本身的计算基底就发生了变化,不是你预期的1分钟周期计算结果。
解决方案
所有指标计算强制锚定1分钟周期为基准,不管当前图表使用什么时间帧,都将ADX/DMI的计算逻辑直接封装在security函数的请求表达式内,避免当前图表周期干扰计算结果。
参考实现代码
//@version=5 indicator("全时间帧ADX/DMI统一展示", overlay=true) // 基础参数配置 dmi_length = input.int(14, title="DMI计算长度") adx_threshold = input.int(25, title="趋势判定阈值") // 封装统一的ADX/DMI计算逻辑,确保所有时间帧计算规则一致 calc_dmi_group() => plus = ta.plus(dmi_length) minus = ta.minus(dmi_length) adx = ta.adx(dmi_length) [plus, minus, adx] // 按目标时间帧请求数据,所有请求统一对齐无前瞻、无缺口规则 [diplus_1m, diminus_1m, adx_1m] = request.security(syminfo.tickerid, "1", calc_dmi_group(), barmerge.gaps_off, barmerge.lookahead_off) [diplus_5m, diminus_5m, adx_5m] = request.security(syminfo.tickerid, "5", calc_dmi_group(), barmerge.gaps_off, barmerge.lookahead_off) [diplus_15m, diminus_15m, adx_15m] = request.security(syminfo.tickerid, "15", calc_dmi_group(), barmerge.gaps_off, barmerge.lookahead_off) [diplus_1h, diminus_1h, adx_1h] = request.security(syminfo.tickerid, "60", calc_dmi_group(), barmerge.gaps_off, barmerge.lookahead_off) // 剩余11个时间帧按照相同格式补充即可 // 原有标签打印逻辑直接复用上面的变量即可,无需修改
注意事项
- 该方案仅适用于目标时间帧≥1分钟的场景,更低时间帧的请求不符合你要锚定1分钟计算的需求
- 若回测时出现历史段数值缺失,可在指标设置界面调大「最大K线参考数量」,加载足够的1分钟历史数据用于计算
- 实时行情场景下,未闭合K线的数值会随实盘跳动,若要仅展示已闭合K线的ADX值,可在请求时对计算结果取偏移
[1]
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

