如何从更高时间框架获取历史值?自定义指标跨周期画线异常排查
解决更高时间框架历史点的获取问题
问题出在**request.security返回的数据是对应当前更高时间框架bar的值,而外部的索引[1]是基于当前时间框架(5分钟)的bar**。在5分钟图中,同一个日线bar对应的所有5分钟bar里,dots的值都是当前日线的点,所以dots[1]只是前一根5分钟bar的dots值,和当前值完全相同,自然拿不到上一个日线的点。
要获取更高时间框架的历史点,必须在更高时间框架的环境内部处理历史数据,而不是在当前时间框架下用索引回溯。以下是具体实现方案:
方法:在日线环境内维护历史点
修改逻辑,在request.security调用的日线环境中,同时计算当前点和上一个符合条件的点,再把这两个值返回给5分钟框架使用。
代码示例
// 1. 重写/封装你的点计算逻辑,返回上一个点和当前点 getDailyDotsWithHistory() => // 调用你原有的calcDots函数获取当前日线的点 currentDot = calcDots(high) // 用var变量持久化存储上一个有效点(仅在日线框架内生效) var float prevValidDot = na // 当当前日线有有效点时,更新上一个点的值(这里的[1]是日线的前一根bar) if not na(currentDot) prevValidDot := nz(prevValidDot[1]) // 返回上一个点和当前点的元组 [prevValidDot, currentDot] // 2. 通过request.security获取日线的历史点和当前点 [prevDailyDot, currentDailyDot] = request.security( syminfo.tickerid, "D", getDailyDotsWithHistory(), gaps = barmerge.gaps_on, lookahead = barmerge.lookahead_off // 建议关闭lookahead避免未来数据问题 ) // 3. 在5分钟图上绘制日线趋势线(仅当两个点都有效时) if not na(prevDailyDot) and not na(currentDailyDot) line.new(bar_index[0], prevDailyDot, bar_index[0], currentDailyDot, color=color.red, width=2)
关键说明
var变量在更高时间框架(日线)内会持续保留状态,每一根日线bar更新一次,这样就能正确记录上一个有效点。- 内部的
prevValidDot[1]是基于日线框架的索引,所以能拿到上一根日线bar的历史值,这才是你真正需要的“上一个日线点”。 - 关闭
lookahead(设置为barmerge.lookahead_off)可以避免未来数据问题,确保指标的可靠性。
内容的提问来源于stack exchange,提问作者bdoooh
相关产品推荐
相关产品推荐

