跳转到内容

保持更新

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
keepUpToDateTrue 后,请求更像订阅,程序要负责取消。
  • 图表页面打开时先展示一段历史 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=True
BAR_TOTAL_COUNT=reqId=4103;name=aapl_keep_up_to_date;count=78
END=reqId=4103;name=aapl_keep_up_to_date;start=20260613 01:01:33 US/Eastern;end=20260614 01:01:33 US/Eastern
UPDATE_COUNT=0
NON_INFO_ERROR_COUNT=0

这里 UPDATE_COUNT=0 不代表参数错误,只表示测试窗口内最后一根 bar 没有产生更新。市场开盘且最后一根 bar 变化时,程序会通过 historicalDataUpdate() 收到后续更新。

如果你只是下载历史数据,应保持 keepUpToDate=False。如果打开了持续更新,一定要在页面关闭、策略停止或连接断开前调用:

app.cancelHistoricalData(1003)

否则程序会留下持续请求,后续排查限频和回调混乱会很麻烦。