如何在TradingView的request.security()函数中设置时区?
按自定义时区(GMT-3)获取日线K线数据的解决方案
核心思路
request.security()不支持直接指定时区参数,因此我们需要通过获取高频数据后在本地按目标时区聚合,或者转换日线数据的时区日期后筛选匹配,来实现按GMT-3时区定义日线周期的需求。
方案一:基于高频数据聚合自定义时区日线
通过获取1小时级数据,在本地按GMT-3时区判断日线边界,聚合出目标时区的日线收盘价:
//@version=5 indicator("GMT-3时区日线收盘价", overlay=true) // 定义目标时区 target_tz = timezone.new("GMT-3") // 获取1小时级收盘价(足够高频用于日线聚合) hourly_close = request.security(syminfo.tickerid, "60", close) // 判断当前K线是否进入GMT-3时区的新一天 is_new_gmt3_day = time("D", session.regular, target_tz) != time("D", session.regular, target_tz)[1] // 存储GMT-3时区的日线收盘价:新一天开始时,取前一天最后一小时收盘价 var float gmt3_daily_close = na if is_new_gmt3_day gmt3_daily_close := ta.valuewhen(is_new_gmt3_day[1], hourly_close, 0) // 绘制对比线:蓝线为GMT-3时区日线,黄线为原交易所时区日线 plot(gmt3_daily_close, color=color.blue, title="GMT-3日线收盘价") plot(request.security(syminfo.tickerid, "1D", close[1], gaps=barmerge.gaps_off), color=color.yellow, title="交易所时区日线收盘价")
方案二:转换日线数据时区后筛选匹配
直接获取日线数据,同时转换为GMT-3时区的日期,再匹配当前时区的前一天收盘价:
//@version=5 indicator("GMT-3时区日线收盘价", overlay=true) target_tz = timezone.new("GMT-3") // 获取日线收盘价+对应GMT-3时区的日期戳 daily_data = request.security(syminfo.tickerid, "1D", [close, time("D", session.regular, target_tz)]) daily_close = daily_data[0] daily_gmt3_date = daily_data[1] // 获取当前K线对应的GMT-3时区日期 current_gmt3_date = time("D", session.regular, target_tz) // 匹配GMT-3时区前一天的收盘价 prev_gmt3_daily_close = ta.valuewhen(daily_gmt3_date == current_gmt3_date[1], daily_close, 0) // 绘制对比线 plot(prev_gmt3_daily_close, color=color.blue, title="GMT-3日线收盘价") plot(request.security(syminfo.tickerid, "1D", close[1], gaps=barmerge.gaps_off), color=color.yellow, title="交易所时区日线收盘价")
为什么你的原有方法无效
time == tz的判断逻辑错误:time()返回的是当前K线的时间戳,而tz是GMT-3时区的每日固定时间戳,两者几乎不会相等,导致request.security()无法被正确触发。request.security()本身基于交易所时区的周期返回数据,无法直接修改周期的时区基准,必须在本地完成时区转换和数据筛选/聚合。
内容的提问来源于stack exchange,提问作者J9B10
相关产品推荐
相关产品推荐

