Pine Script V5跨时间框架绘制每日ATR箱体问题求助
问题分析与解决方案
你的代码主要存在三个核心问题:
- 参数类型不匹配:
box.new的left/right需要的是K线索引值(bar_index),但你用request.security获取的time_tradingday是时间戳(毫秒数),两者完全不兼容,导致箱体位置错误。 - 未来数据违规:
time_tradingday[0]+1是当前交易日结束后的时间戳,在当日K线尚未走完时属于未来数据,触发了Pine Script的未来数据限制报错。 - 跨周期逻辑错误:直接用当前周期的
bar_index会随时间框架变化,因为不同周期的K线索引计数是独立的,日线的一根K线对应当前周期的多根K线,不能直接用单根bar_index定义箱体范围。
修正方案
要在任意时间框架下基于日线数据绘制ATR箱体,正确的做法是:
- 用
request.security获取日线级别的开盘价、ATR值,以及当日在当前周期对应的起始和结束bar_index。 - 只在日线K线的范围内绘制箱体,避免未来数据。
- 管理箱体的创建和删除,避免重复绘制。
修正后的代码
//@version=5 indicator("日线ATR箱体", overlay=true) // 1. 获取日线级别数据:开盘价、5周期ATR、当日的起始bar_index daily_data = request.security(syminfo.tickerid, "D", [open, ta.atr(5), bar_index]) daily_open = daily_data[0] daily_atr = daily_data[1] daily_bar_idx = daily_data[2] // 2. 确定当前周期中,日线K线的起始和结束边界 // 当日线K线切换时,记录当前周期的起始bar_index var int current_daily_start = na if ta.change(daily_bar_idx) current_daily_start := bar_index // 日线箱体的右边界:如果是最后一根K线,用当前bar_index;否则用下一个日线切换前的bar_index daily_box_right = barstate.islast ? bar_index : ta.valuewhen(ta.change(daily_bar_idx), bar_index, 0) - 1 // 3. 绘制ATR箱体:仅在日线起始点创建,避免重复绘制 var box atr_box = na if not na(current_daily_start) and ta.change(daily_bar_idx) // 删除旧箱体 if not na(atr_box) box.delete(atr_box) // 创建新箱体 atr_box := box.new( left = current_daily_start, top = daily_open + daily_atr, right = daily_box_right, bottom = daily_open - daily_atr, border_color = color.yellow, border_width = 1, bgcolor = color.new(color.yellow, 90) ) // 更新最后一根K线的箱体右边界 else if barstate.islast and not na(atr_box) box.set_right(atr_box, bar_index)
代码解释
- 跨周期数据获取:通过
request.security一次性获取日线的开盘价、ATR和当日的bar_index,确保数据同步。 - 边界确定:用
ta.change(daily_bar_idx)检测日线K线的切换点,记录当前周期的起始bar_index;对于未走完的日线,用barstate.islast动态更新箱体右边界,避免未来数据。 - 箱体管理:用
var变量保存箱体对象,只在日线切换时创建新箱体并删除旧箱体,避免重复绘制。
内容的提问来源于stack exchange,提问作者Ingo Croco
相关产品推荐
相关产品推荐

