如何识别各类品种图表的交易日切换时间(GMT+0时区)
解决方案:自适应交易日切换的水平位指标实现
核心问题拆解
原通过syminfo.type判断交易日起始时间的方案存在覆盖盲区(如XAU/USD这类特殊品种),需改用标的精准映射+动态逻辑兼容的方式,同时严格对齐GMT+0时区,适配多时间框架。
完整实现代码
//@version=5 indicator("自适应交易日水平位", overlay=true) // 1. 特殊标的-交易日起始时间映射表(GMT+0,可按需扩展) var table symTimeMap = table.new(position.top_right, 2, 3) // 格式:[标的ID] => 起始时间(HHMM) symTimeMap.set(0, 0, "XAU/USD") symTimeMap.set(1, 0, "2200") symTimeMap.set(0, 1, "EUR/USD") symTimeMap.set(1, 1, "2100") symTimeMap.set(0, 2, "SPX500") symTimeMap.set(1, 2, "0000") // 2. 获取当前标的的交易日起始时间(GMT+0) getSessionStart() => // 优先匹配映射表中的特殊标的 for i = 0 to table.rows(symTimeMap)-1 if table.get(symTimeMap, 0, i) == syminfo.tickerid return str.totime(table.get(symTimeMap, 1, i), "HHMM") // 映射表无匹配时,按标的类型 fallback syminfo.type == "forex" or syminfo.type == "futures" ? str.totime("2100", "HHMM") : str.totime("0000", "HHMM") sessionStart = getSessionStart() // 3. 通用交易日切换判断函数(支持任意时间框架) isNewSession(timeframe) => sessionTime = time(timeframe, str.tostring(sessionStart, "HHMM") + "-" + str.tostring(sessionStart, "HHMM"), "GMT+0") sessionTime != sessionTime[1] // 4. 多时间框架切换示例 dailyNewSession = isNewSession("1D") fourHourNewSession = isNewSession("240") // 5. 水平位绘制逻辑(示例) var float prevDayHigh = na if dailyNewSession prevDayHigh = ta.highest(close, 1) // 替换为实际前交易日数据计算逻辑 line.new(bar_index[1], prevDayHigh, bar_index, prevDayHigh, color=color.red, width=2)
关键优化点
- 精准覆盖特殊品种:通过映射表直接指定XAU/USD这类非标准类型标的的时间,避免类型判断漏洞
- 多时间框架兼容:
isNewSession函数支持传入任意时间框架参数,无需重复编写逻辑 - GMT+0严格对齐:所有时间判断强制使用GMT+0时区,杜绝本地时区干扰
- 可扩展性强:新增特殊品种仅需在映射表中添加一行,无需修改核心逻辑
补充:自动识别方案(适合大量品种场景)
如果不想手动维护映射表,可通过统计历史K线开盘时间自动识别:
// 自动统计交易日起始时间(示例) var int mostFreqSession = 0 var int[] sessionCounts = array.new_int(24) if barstate.islast // 统计过去100根日线的开盘小时 for i = 0 to 99 sessionHour = hour(time("1D", "", "GMT+0")[i]) array.set(sessionCounts, sessionHour, array.get(sessionCounts, sessionHour) + 1) // 取出现频率最高的小时作为起始时间 mostFreqSession = array.indexof(sessionCounts, array.max(sessionCounts)) * 100
内容的提问来源于stack exchange,提问作者curiousgeorge
相关产品推荐
相关产品推荐

