修改TradingView指标每日起始时间为UTC-4(GMT-5)
自定义PineScript每日周期时区(UTC-4/GMT-5)解决方案
问题核心
当前指标默认使用UTC时区的00:00-00:00作为每日周期,导致指标从17:00开始(对应UTC-4时区的时间偏移)。需要将每日周期改为UTC-4时区的17:00至次日17:00,原有的时区下拉选项及syminfo.timezone尝试均未生效,需通过自定义周期逻辑实现。
修改后的完整代码
//@version=5 indicator(title='CPR, VWAP, EMAs, MASTER - CAM', shorttitle='CPR,VWAP,EMAs, MASTER', overlay=true) // 输入参数保持不变 daily_cpr = input.int(title='Number of Daily CPR Back', defval=100, minval=0) onehr_cpr = input.int(title='Number of 1HR CPR Back', defval=0, minval=0) fourhr_cpr = input.int(title='Number of 4HR CPR Back', defval=0, minval=0) eighthr_cpr = input.int(title='Number of 8HR CPR Back', defval=0, minval=0) weekly_cpr = input.int(title='Number of Weekly CPR Back', defval=0, minval=0) monthly_cpr = input.int(title='Number of Monthly CPR Back', defval=0, minval=0) // 通用周期切换判断函数 new_period(condition, src) => result = 0.0 result := condition ? src : result[1] result // -------------------------- // 核心修改:自定义UTC-4时区的每日周期(17:00-次日17:00) // UTC-4的17:00对应UTC时间21:00,因此会话定义为UTC的21:00开始,持续24小时 session_def = "2100-2100:24/7" is_new_daily_session = ta.session.new(session_def) // 跟踪当前自定义日的高低收盘价 var float daily_high = na var float daily_low = na var float daily_close = na if is_new_daily_session daily_high := high daily_low := low daily_close := close else daily_high := math.max(daily_high, high) daily_low := math.min(daily_low, low) daily_close := close // 保存前一个自定义日的高低收盘价(用于计算CPR) var float prev_daily_high = na var float prev_daily_low = na var float prev_daily_close = na if is_new_daily_session prev_daily_high := daily_high[1] prev_daily_low := daily_low[1] prev_daily_close := daily_close[1] // 计算前一个自定义日的CPR值 pivot = (prev_daily_high + prev_daily_low + prev_daily_close) / 3.0 bc = (prev_daily_high + prev_daily_low) / 2.0 tc = pivot - bc + pivot dpp = pivot dbc = bc dtc = tc // -------------------------- one_day = 1000 * 60 * 60 * 24 // 替换原UTC日周期判断为自定义会话的新周期判断 new_day = daily_cpr > 0 and timenow - time < one_day * daily_cpr and is_new_daily_session dpp_ = new_period(new_day, dpp) dtc_ = new_period(new_day, dtc) dbc_ = new_period(new_day, dbc) // 绘图逻辑保持不变 plot(timeframe.isintraday ? dtc_ >= dbc_ ? dtc_ : dbc_ : na, title='Daily TC', style=plot.style_steplinebr, color=color.new(#238859, 0), linewidth=1) plot(timeframe.isintraday ? dpp_ : na, title='Daily PP', style=plot.style_steplinebr, color=color.new(#238859, 0), linewidth=1) plot(timeframe.isintraday ? dtc_ >= dbc_ ? dbc_ : dtc_ : na, title='Daily BC', style=plot.style_steplinebr, color=color.new(#238859, 0), linewidth=1)
关键修改说明
- 自定义会话周期:通过
ta.session.new()定义UTC时间21:00-21:00(对应UTC-4时区的17:00-次日17:00)作为每日周期,替代默认的UTC日周期。 - 跟踪自定义日数据:实时计算当前自定义日的最高、最低、收盘价,切换新周期时保存上一周期的数据,用于计算CPR指标。
- 替换周期触发条件:将原代码中基于UTC日的
new_bar('D')替换为自定义会话的is_new_daily_session,确保CPR指标在目标时区的每日17:00更新。
内容的提问来源于stack exchange,提问作者Cam B
相关产品推荐
相关产品推荐

