请求历史逐笔数据
reqHistoricalTicks() 用来请求历史逐笔成交、历史 bid/ask 报价或历史 midpoint。它要求时间参数写得很明确,不能同时乱填多个时间长度条件。
官方参考:Historical Time and Sales
Python 示例
Section titled “Python 示例”app.reqHistoricalTicks( 96201, # reqId:请求编号 contract, # contract:合约对象 "20260612 15:54:00 US/Eastern", # startDateTime:开始时间 "20260612 15:59:00 US/Eastern", # endDateTime:结束时间 10, # numberOfTicks:请求条数上限 "TRADES", # whatToShow:TRADES / BID_ASK / MIDPOINT 1, # useRth:只使用常规交易时段 False, # ignoreSize:是否忽略只有 size 变化的报价 [], # miscOptions:保留为空)| 参数 | 中文解释 | 注意事项 |
|---|---|---|
reqId | 请求编号 | 回调时原样返回 |
contract | 合约对象 | 必须唯一可解析 |
startDateTime | 开始时间 | 和 endDateTime 至少要明确一个合理窗口 |
endDateTime | 结束时间 | 推荐先用短窗口测试 |
numberOfTicks | 请求条数上限 | 不等于一定只返回这么多,需看 TWS 行为 |
whatToShow | 数据类型 | TRADES、BID_ASK、MIDPOINT |
useRth | 是否只看常规交易时段 | 回测口径要统一 |
ignoreSize | 是否忽略只有 size 变化的 bid/ask | 多用于 BID_ASK |
miscOptions | 额外选项 | 普通请求传空列表 |
脚本请求 AAPL 一个已完成交易日的 5 分钟窗口,TRADES 和 BID_ASK 返回逐笔数据,MIDPOINT 没有在 15 秒内收到回调且没有业务错误:
REQUEST_SENT=True;whatToShow=TRADES;start=20260612 15:54:00 US/Eastern;end=20260612 15:59:00 US/EasternTRADES_ROWS=198DONE_FLAGS=TRADES:True
REQUEST_SENT=True;whatToShow=BID_ASK;start=20260612 15:54:00 US/Eastern;end=20260612 15:59:00 US/EasternBIDASK_ROWS=163DONE_FLAGS=BID_ASK:True
REQUEST_SENT=True;whatToShow=MIDPOINT;start=20260612 15:54:00 US/Eastern;end=20260612 15:59:00 US/EasternMIDPOINT_ROWS=0DONE_FLAGS=INFO_CODES=2104,2106,2158NON_INFO_ERROR_COUNT=0MIDPOINT 无回调可能和产品、数据源、时间窗口或账户权限有关。程序不要无限等待;应设置超时,记录 whatToShow、合约、起止时间、信息码和错误码。
历史逐笔常见问题之一是时间参数不合规。不完整时间参数可能触发:
code=10187;msg=2 out of startTime/endTime/timeLength parameters have to be specified所以示例里明确写出 startDateTime 和 endDateTime,新手不要先尝试复杂的动态时间拼接。