交易所时区
交易所时区是最适合人工阅读行情的时间口径。美股通常按 US/Eastern 理解,港股按香港时间理解,期货还要看具体交易所和合约。
官方参考:Historical Bar Data
end_time = "20260612 15:59:00 US/Eastern"这个字符串包含三部分:
| 部分 | 含义 |
|---|---|
20260612 | 日期,格式为 yyyyMMdd |
15:59:00 | 时间,格式为 HH:mm:ss |
US/Eastern | 时区,表示美股交易所常用时区 |
完整请求示例
Section titled “完整请求示例”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/EasternDONE_FLAGS=97101,97102NON_INFO_ERROR_COUNT=0这和美股常规交易时段一致,新手可以直接判断这些 bar 对应开盘后的哪个时间段。
如何确定合约时区
Section titled “如何确定合约时区”最稳的方式是请求合约详情,在 contractDetails() 回调里读取 timeZoneId:
def contractDetails(self, reqId, contractDetails): """接收合约详情,打印交易所时区。""" print("SYMBOL=", contractDetails.contract.symbol) print("TIME_ZONE_ID=", contractDetails.timeZoneId)拿到 timeZoneId 后,再把它拼到历史行情请求时间里。
| 问题 | 处理方式 |
|---|---|
| 返回时间和图表差一小时 | 检查是否跨夏令时,是否把交易所时间当成电脑所在时区 |
| 多个交易所的合约混在一起 | 每个合约用自己的 timeZoneId 解析 |
| 数据库存什么时间 | 建议入库时转换成 UTC,同时保存原始交易所时间字符串 |