不可用历史数据
不是所有 TWS 图表或交易所数据都能通过历史行情 API 返回。遇到空结果或错误时,要先判断数据本身是否可用,再判断代码参数是否写错。
官方参考:Historical Data Limitations
常见不可用场景
Section titled “常见不可用场景”| 场景 | 说明 |
|---|---|
| 30 秒及以下 bar 太久以前的数据 | 小周期旧数据通常有时间范围限制。 |
| 过期期权、FOP、权证、结构化产品 | 过期后历史数据可能不可用。 |
| 过期期货太久以前的数据 | 超出保留范围后不可取。 |
| 过期期货价差 | 历史数据可能不可用。 |
| 已停止交易或退市证券 | 可能没有可请求历史数据。 |
| 技术指标 | 加权均线、布林带等图表指标不是历史数据 API 的直接返回项。 |
| 过早的连续合约数据 | 连续合约和直接合约的可用范围可能不同。 |
历史 API 返回的是原始价格、成交量、收益率或盘口相关数据,不是 TWS 图表上所有叠加指标。
先查最早可用时间
Section titled “先查最早可用时间”app.reqHeadTimeStamp( 3001, contract, "TRADES", 1, 1,)| 参数 | 类型 | 中文含义 | 说明 |
|---|---|---|---|
reqId | int | 请求编号 | 匹配 headTimestamp() 回调。 |
contract | Contract | 合约对象 | 要先写清楚股票、期货、期权等合约字段。 |
whatToShow | str | 数据口径 | 例如 TRADES、MIDPOINT、BID_ASK。 |
useRTH | int | 是否只看常规交易时段 | 1 只看常规交易时段,0 包含更多可用时段。 |
formatDate | int | 时间格式 | 1 返回字符串,2 返回 Unix 秒级时间戳。 |
AAPL 参考输出
Section titled “AAPL 参考输出”REQUEST_SENT=reqId=3001;name=aapl_trades_rth_string;whatToShow=TRADES;useRTH=1;formatDate=1REQUEST_SENT=reqId=3002;name=aapl_trades_all_string;whatToShow=TRADES;useRTH=0;formatDate=1REQUEST_SENT=reqId=3003;name=aapl_trades_rth_unix;whatToShow=TRADES;useRTH=1;formatDate=2CONNECTED=TrueCONTRACT=AAPL STK SMART NASDAQ USDHEAD_ROWS=3HEAD=reqId=3001;name=aapl_trades_rth_string;timestamp=19801212-14:30:00HEAD=reqId=3002;name=aapl_trades_all_string;timestamp=19801212-14:30:00HEAD=reqId=3003;name=aapl_trades_rth_unix;timestamp=345479400NON_INFO_ERROR_COUNT=0这表示 AAPL TRADES 历史数据在该请求口径下有很早的可用起点。其他产品、过期合约、退市证券或特殊数据类型不一定有同样结果。
| 问题 | 处理 |
|---|---|
| 没有更早数据 | 缩短回测范围,或换直接合约而不是连续合约。 |
| 过期衍生品不可用 | 使用仍可查询的直接合约,或另找历史数据源。 |
| 图表指标不可用 | 先请求 K 线,再在程序里计算指标。 |
| 空结果但无错误 | 检查交易时段、useRTH、whatToShow 和合约状态。 |
| 有权限错误 | 检查市场数据订阅和账户权限。 |
批量程序应把“不可用”当成一种正常结果记录下来,而不是无限重试。无限重试既不能让不存在的数据出现,还可能触发限频。