Pinescript V5绘制纽约开盘时段箱体无显示问题求助
Pinescript V5 纽约时段箱体绘制问题排查与修复
问题根源分析
原代码无法显示箱体的核心问题如下:
- 语法错误:
nysess = not na (time("","0930-1030"))中not na的调用格式错误,正确写法应为not na(time("","0930-1030"))(括号需紧跟na)。 - 回测日期判断失效:使用
timenow判断日期范围,回测时timenow指向当前实时时间而非K线时间,导致indate始终为false,箱体无法触发创建。 - 箱体创建时机错误:在纽约时段内的每根K线重复执行
box.new,既会生成大量冗余箱体,又因时段内高低价未最终确定导致位置偏差。 - 高低价计算逻辑缺陷:
ta.highest(high,12)依赖固定K线数量(仅适配1分钟周期),切换其他周期后无法准确捕获时段高低点。 - 时区计算误差:手动计算时间边界未考虑纽约时区(UTC-4/UTC-5)的夏令时/冬令时差异,导致时间范围偏移。
修复后的代码
indicator("NY 9:30-10:30 Box", overlay=true) // 输入参数:日期范围与纽约时段 startDate = input.time(timestamp("15 December 2022 14:30"), title="Start Date (UTC)", tooltip="纽约冬令时9:30对应UTC14:30") endDate = input.time(timestamp("16 December 2022 14:30"), title="End Date (UTC)") nySession = input.session("0930-1030", title="New York Session") // 判断当前K线是否在指定日期范围内 inDateRange = time >= startDate and time <= endDate // 追踪纽约时段内的最高价与最低价(var变量保留跨bar数据) var float sessionHigh = na var float sessionLow = na // 进入纽约时段时初始化高低价 if not na(time("D", session=nySession)) and inDateRange sessionHigh := high sessionLow := low // 时段内持续更新高低价 else if not na(time("D", session=nySession)) and inDateRange sessionHigh := ta.max(sessionHigh, high) sessionLow := ta.min(sessionLow, low) // 时段结束后创建箱体(仅执行一次) if na(time("D", session=nySession)) and not na(time("D", session=nySession)[1]) and inDateRange sessionStartTime = time("D", session=nySession)[1] sessionEndTime = time_close[1] box.new(sessionStartTime, sessionHigh, sessionEndTime, sessionLow, color=color.new(color.blue, 90), border_color=color.blue)
关键修改说明
- 语法修正:修复
not na调用格式,改用session参数直接指定纽约时段,避免手动时间计算误差。 - 回测适配:用
time替代timenow判断日期范围,确保回测时基于K线时间触发逻辑。 - 动态高低价追踪:使用
var变量跨bar保存时段内的高低价,进入时段初始化、时段内实时更新,保证数据准确性。 - 单次创建箱体:仅在K线离开纽约时段时创建箱体,避免重复生成,且此时段高低价已最终确定。
内容的提问来源于stack exchange,提问作者Lex Deeley
相关产品推荐
相关产品推荐

