保持更新
keepUpToDate=True 会让历史 K 线请求在初始历史数据返回后,继续更新正在形成的最后一根 bar。它适合“先拉一段历史,再持续刷新最后一根 K 线”的图表或策略预览。
app.reqHistoricalData( 1003, contract, "", # keepUpToDate=True 时通常使用空结束时间 "1 D", "5 mins", "TRADES", 1, 1, True, # 持续更新最后一根 bar [],)| 阶段 | 回调 |
|---|---|
| 初始历史数据 | historicalData() |
| 初始数据结束 | historicalDataEnd() |
| 后续更新 | historicalDataUpdate() |
| 取消请求 | cancelHistoricalData(reqId) |
| 条件 | 说明 |
|---|---|
endDateTime | 必须传空字符串 "",不能指定历史结束时间。 |
barSizeSetting | 至少 5 secs 或更大,不能用 1 secs。 |
keepUpToDate | 传 True 后,请求更像订阅,程序要负责取消。 |
- 图表页面打开时先展示一段历史 K 线,再实时刷新最后一根。
- 行情看板展示“最后一根 bar 正在变化”的效果。
- 策略预览需要最近一段历史数据和近实时更新。
keepUpToDate 不是完整的实时行情替代品。它更新的是历史 K 线请求的最后一根 bar,频率和可用性仍受 TWS、权限、合约类型、市场是否正在交易和请求参数影响。
验证中,keepUpToDate=True 的 AAPL 请求可以建立并返回初始历史数据:
REQUEST_SENT=reqId=4103;name=aapl_keep_up_to_date;duration=1 D;barSize=5 mins;whatToShow=TRADES;useRTH=1;formatDate=1;keepUpToDate=TrueBAR_TOTAL_COUNT=reqId=4103;name=aapl_keep_up_to_date;count=78END=reqId=4103;name=aapl_keep_up_to_date;start=20260613 01:01:33 US/Eastern;end=20260614 01:01:33 US/EasternUPDATE_COUNT=0NON_INFO_ERROR_COUNT=0这里 UPDATE_COUNT=0 不代表参数错误,只表示测试窗口内最后一根 bar 没有产生更新。市场开盘且最后一根 bar 变化时,程序会通过 historicalDataUpdate() 收到后续更新。
如果你只是下载历史数据,应保持 keepUpToDate=False。如果打开了持续更新,一定要在页面关闭、策略停止或连接断开前调用:
app.cancelHistoricalData(1003)否则程序会留下持续请求,后续排查限频和回调混乱会很麻烦。