如何在1分钟图表上获取1小时周期的Choppiness Index指标?
问题分析与修复方案
你的跨周期Choppiness Index(CHOP)指标输出不准确、不稳定,核心问题有两个:
- 错误在1分钟周期内累加1小时ATR值:同一个1小时K线对应的所有1分钟bar会重复返回相同的ATR值,导致
math.sum(atr_1hr, length)重复计算同一ATR,总和完全偏离预期。 - 单独请求多个跨周期指标:
request.security的多次调用可能引发数据同步问题,不同指标的返回值可能对应不同的1小时K线周期。
修复代码
//@version=5 indicator(title="Choppiness Index mtf", shorttitle="CHOP mtf") length = input.int(14, minval=1) // 直接在1小时周期内计算完整的CHOP值,再返回给1分钟图 ci_1hr = request.security(syminfo.tickerid, "60", ta.chop(length)) offset = input.int(0, "Offset", minval=-500, maxval=500) plot(ci_1hr, "CHOP", color=#2962FF, offset=offset) band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed) hline(50, "Middle Band", color=color.new(#787B86, 50)) band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed) fill(band1, band0, color=color.rgb(33, 150, 243, 90), title="Background")
修复说明
- 利用内置
ta.chop()函数:直接调用Pine Script内置的CHOP计算函数,确保和原版指标逻辑完全一致,避免手动计算出错。 - 单请求完成跨周期计算:将整个CHOP的计算逻辑放到
request.security的回调中,在1小时周期内完成所有计算后返回结果,既保证数据同步,又避免在1分钟周期内错误处理跨周期数据。
如果需要手动实现CHOP逻辑(而非用内置函数),也可以把计算逻辑放到回调里,示例如下:
//@version=5 indicator(title="Choppiness Index mtf", shorttitle="CHOP mtf") length = input.int(14, minval=1) // 手动实现CHOP逻辑并在1小时周期内计算 ci_1hr = request.security(syminfo.tickerid, "60", 100 * math.log10(math.sum(ta.atr(1), length) / (ta.highest(length) - ta.lowest(length))) / math.log10(length) ) offset = input.int(0, "Offset", minval=-500, maxval=500) plot(ci_1hr, "CHOP", color=#2962FF, offset=offset) band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed) hline(50, "Middle Band", color=color.new(#787B86, 50)) band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed) fill(band1, band0, color=color.rgb(33, 150, 243, 90), title="Background")
这种写法和直接用ta.chop()效果完全一致,适合需要自定义CHOP逻辑的场景。
内容的提问来源于stack exchange,提问作者datas wapro
相关产品推荐
相关产品推荐

