TradingView中request.security函数日线图取值异常问题问询
TradingView跨周期调用月开盘价异常原因分析
核心原因拆解
1. 跨周期数据对齐的默认逻辑差异
在日线图中使用request.security调用月线数据时,TradingView默认遵循**“优先对齐已闭合目标周期K线”**的规则:
- 盘后时段:当前9月月K线尚未完全闭合,系统会自动将当前日线K线对齐到上一个已完成的月K线(即今年8月)。此时
open[12]对应的是“今年8月月K线往前数12根”,也就是去年8月的开盘价,因此显示异常。 - 盘中时段:初期系统仍沿用盘后的对齐逻辑,待实时数据推送完成、后台完成周期同步后,会临时将未闭合的9月月K线纳入索引范围,此时
open[12]指向“今年9月月K线往前数12根”,即去年9月的开盘价,所以数秒后更新为正确值。
而在月线图中,当前查询的是去年9月的已闭合月K线,open[12]直接对应“当前月线往前数12根”,因此能精准返回预期数值。
2. 免费版数据同步优先级限制
TradingView免费版的跨周期数据同步优先级低于付费版,盘中初期跨周期数据的缓存未及时更新,会暂时返回上一周期的旧数据,待后台完成数据校验和同步后,才会加载正确的目标周期数据。
3. 索引逻辑的隐性误区
你预期open[12]是“当前月份往前数12个月”,但实际上[12]是基于目标周期(月线)的K线索引,而非自然月份的计数。当目标周期存在未闭合K线时,索引的基准会发生偏移,导致结果不符合预期。
验证与修正建议
可以通过指定时间范围来精准定位去年同期的月开盘价,避免依赖K线索引的偏移问题,示例代码:
// 获取去年同期的月份和年份 targetYear = year - 1 targetMonth = month // 筛选去年同期的月开盘价 lastYearMonthOpen = request.security(syminfo.tickerid, "M", open, lookahead=barmerge.lookahead_on) lastYearMonthOpen := time.month == targetMonth and time.year == targetYear ? lastYearMonthOpen : na
内容的提问来源于stack exchange,提问作者LetsMakeMoney
相关产品推荐
相关产品推荐

