跳转到内容

交易所时区

交易所时区是最适合人工阅读行情的时间口径。美股通常按 US/Eastern 理解,港股按香港时间理解,期货还要看具体交易所和合约。

官方参考:Historical Bar Data

end_time = "20260612 15:59:00 US/Eastern"

这个字符串包含三部分:

部分含义
20260612日期,格式为 yyyyMMdd
15:59:00时间,格式为 HH:mm:ss
US/Eastern时区,表示美股交易所常用时区
app.reqHistoricalData(
97021,
contract,
"20260612 15:59:00 US/Eastern", # AAPL 按美股交易所时区请求
"2 D",
"1 hour",
"TRADES",
1,
1,
False,
[],
)

AAPL 的 1 小时 K 线返回了带 US/Eastern 的时间:

FORMAT_DATE_1_ROWS=20260612 09:30:00 US/Eastern|20260612 10:00:00 US/Eastern|20260612 11:00:00 US/Eastern
DONE_FLAGS=97101,97102
NON_INFO_ERROR_COUNT=0

这和美股常规交易时段一致,新手可以直接判断这些 bar 对应开盘后的哪个时间段。

最稳的方式是请求合约详情,在 contractDetails() 回调里读取 timeZoneId

def contractDetails(self, reqId, contractDetails):
"""接收合约详情,打印交易所时区。"""
print("SYMBOL=", contractDetails.contract.symbol)
print("TIME_ZONE_ID=", contractDetails.timeZoneId)

拿到 timeZoneId 后,再把它拼到历史行情请求时间里。

问题处理方式
返回时间和图表差一小时检查是否跨夏令时,是否把交易所时间当成电脑所在时区
多个交易所的合约混在一起每个合约用自己的 timeZoneId 解析
数据库存什么时间建议入库时转换成 UTC,同时保存原始交易所时间字符串