You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别各类品种图表的交易日切换时间(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:53:19