跳转到内容

不可用历史数据

不是所有 TWS 图表或交易所数据都能通过历史行情 API 返回。遇到空结果或错误时,要先判断数据本身是否可用,再判断代码参数是否写错。

官方参考:Historical Data Limitations

场景说明
30 秒及以下 bar 太久以前的数据小周期旧数据通常有时间范围限制。
过期期权、FOP、权证、结构化产品过期后历史数据可能不可用。
过期期货太久以前的数据超出保留范围后不可取。
过期期货价差历史数据可能不可用。
已停止交易或退市证券可能没有可请求历史数据。
技术指标加权均线、布林带等图表指标不是历史数据 API 的直接返回项。
过早的连续合约数据连续合约和直接合约的可用范围可能不同。

历史 API 返回的是原始价格、成交量、收益率或盘口相关数据,不是 TWS 图表上所有叠加指标。

app.reqHeadTimeStamp(
3001,
contract,
"TRADES",
1,
1,
)
参数类型中文含义说明
reqIdint请求编号匹配 headTimestamp() 回调。
contractContract合约对象要先写清楚股票、期货、期权等合约字段。
whatToShowstr数据口径例如 TRADESMIDPOINTBID_ASK
useRTHint是否只看常规交易时段1 只看常规交易时段,0 包含更多可用时段。
formatDateint时间格式1 返回字符串,2 返回 Unix 秒级时间戳。
REQUEST_SENT=reqId=3001;name=aapl_trades_rth_string;whatToShow=TRADES;useRTH=1;formatDate=1
REQUEST_SENT=reqId=3002;name=aapl_trades_all_string;whatToShow=TRADES;useRTH=0;formatDate=1
REQUEST_SENT=reqId=3003;name=aapl_trades_rth_unix;whatToShow=TRADES;useRTH=1;formatDate=2
CONNECTED=True
CONTRACT=AAPL STK SMART NASDAQ USD
HEAD_ROWS=3
HEAD=reqId=3001;name=aapl_trades_rth_string;timestamp=19801212-14:30:00
HEAD=reqId=3002;name=aapl_trades_all_string;timestamp=19801212-14:30:00
HEAD=reqId=3003;name=aapl_trades_rth_unix;timestamp=345479400
NON_INFO_ERROR_COUNT=0

这表示 AAPL TRADES 历史数据在该请求口径下有很早的可用起点。其他产品、过期合约、退市证券或特殊数据类型不一定有同样结果。

问题处理
没有更早数据缩短回测范围,或换直接合约而不是连续合约。
过期衍生品不可用使用仍可查询的直接合约,或另找历史数据源。
图表指标不可用先请求 K 线,再在程序里计算指标。
空结果但无错误检查交易时段、useRTHwhatToShow 和合约状态。
有权限错误检查市场数据订阅和账户权限。

批量程序应把“不可用”当成一种正常结果记录下来,而不是无限重试。无限重试既不能让不存在的数据出现,还可能触发限频。