跳转到内容

返回日期格式

formatDate 控制历史 K 线返回的日期格式。它影响 BarData.date 字段,也会影响你后续如何解析和保存 K 线。

formatDate含义新手建议
1返回可读字符串时间调试时最直观
2返回 Unix 时间戳风格程序化存储更方便

使用 formatDate=1,AAPL 5 分钟线返回类似:

20260612 09:30:00 US/Eastern

使用 formatDate=2 请求 AAPL 小时线,返回的是 Unix 秒级时间戳。本次验证中,2 D + 1 hour 返回 14 根 K 线:

BAR_TOTAL_COUNT=reqId=4102;name=aapl_1hour_unix;count=14
BAR=reqId=4102;date=1781184600;open=293.71;high=293.95;low=290.37;close=291.59;volume=3422903;wap=292.438;barCount=30066

日线或更大周期的 date 可能只包含日期,不一定带完整时间。代码里不要假设所有 bar 的日期格式完全一样。

def historicalData(self, reqId, bar):
"""接收历史 K 线,并保留 TWS 原始日期字符串。"""
row = {
"reqId": reqId,
"date": bar.date,
"open": float(bar.open),
"high": float(bar.high),
"low": float(bar.low),
"close": float(bar.close),
"volume": int(bar.volume),
}
print(row)

第一版程序建议先保存原始 bar.date,再在清洗层统一转换时区。这样排查问题时可以对照 TWS 原始输出。

历史 K 线时间通常和 TWS 登录、交易所、请求格式有关。不要简单用电脑所在时区覆盖返回值。对于美股这类跨时区品种,建议在入库时额外保存:

字段作用
raw_dateTWS 原始返回
exchange_timezone交易所时区,例如 US/Eastern
utc_time统一换算后的 UTC 时间
local_time页面展示时再换算成本地时间

这样后续做回测、画图和结果对照时不会混淆。