Pine Script午夜VWAP重置异常技术求助:时区与小周期问题
问题:Pine Script午夜VWAP在短周期债券合约中无法按时重置
问题现象
- 编写的午夜VWAP无法稳定在纽约时间午夜重置,1分钟以下周期的债券品种(如30秒周期ZF合约)问题尤为明显,1分钟及以上周期基本正常。
- 代码中时区改为
UTC+3:00时功能正常,但改为UTC-4:00仍无法解决问题。 - 本地位于圣地亚哥(PST时区),图表设置为纽约时间(EST),截图显示VWAP线在代码定义的UTC时间点出现断裂。
- 联系TradingView支持后对方称功能正常,核心需求是让VWAP在纽约时间午夜重置,而非默认的纽约时间18点。
原代码
//@version=5 indicator('VWAP Midnight', overlay=true) var float vwapsum = na var float volumesum = na //------------------------------------------------ Midnight = timestamp("UTC-5:00",year, month, dayofmonth, 00, 00, 00) newSession = Midnight == time ? 1 : 0 //------------------------------------------------ vwapsum := newSession ? hl2 * volume : hl2 * volume + vwapsum[1] volumesum := newSession ? volume : volume + volumesum[1] myvwap = vwapsum / volumesum coloring = color.aqua av = myvwap A = plot(av, style=plot.style_circles, color=color.new(coloring, 0))
问题原因
- 短周期时间匹配问题:
time变量对应K线的开盘时间,30秒周期的K线时间戳每30秒更新一次,很难精确命中纽约午夜对应的UTC时间戳,导致Midnight == time的判断无法触发。 - 时区硬编码缺陷:纽约时区存在夏令时(EDT,UTC-4)和冬令时(EST,UTC-5)切换,硬编码
UTC-5:00会导致夏令时期间时区偏移错误,进而重置时间点偏差。
解决方案
改用基于纽约时区日期切换的判断逻辑,自动处理夏令时,同时适配短周期K线:
//@version=5 indicator('VWAP Midnight (NYC)', overlay=true) // 使用纽约时区自动处理夏令时/冬令时 nyc_timezone = timezone.new_york // 获取当前K线的纽约日期 current_nyc_date = time.new(time, nyc_timezone).date // 获取上一根K线的纽约日期 prev_nyc_date = time.new(time[1], nyc_timezone).date // 日期切换即判定为新交易日(午夜重置) new_session = current_nyc_date != prev_nyc_date var float vwapsum = na var float volumesum = na // 更新VWAP累计值 vwapsum := new_session ? hl2 * volume : hl2 * volume + vwapsum[1] volumesum := new_session ? volume : volume + volumesum[1] myvwap = vwapsum / volumesum plot(myvwap, style=plot.style_circles, color=color.new(color.aqua, 0))
修改说明
- 用
timezone.new_york替代硬编码的UTC偏移,自动适配纽约夏令时/冬令时切换,避免时区偏差。 - 通过比较当前与上一根K线的纽约日期来判断新交易日,无需精确匹配午夜时间戳,完美适配30秒等短周期K线。
- 逻辑更稳定,只要纽约日期切换就会重置VWAP,确保午夜时分的重置触发。
内容的提问来源于stack exchange,提问作者Adrian Ortiz
相关产品推荐
相关产品推荐

