5 秒线
5 秒线是 TWS API 提供的一种实时行情订阅。它把实时数据按 5 秒聚合成小 K 线,通过 realtimeBar() 回调持续推送。
它适合做盘中监控、轻量图表和实时策略状态更新,不适合回补历史数据。想一次性拿过去几天、几个月的 K 线,应使用历史 K 线接口 reqHistoricalData()。
| 项目 | 说明 |
|---|---|
| 请求接口 | reqRealTimeBars() |
| 回调接口 | realtimeBar() |
| 取消接口 | cancelRealTimeBars() |
| 固定周期 | 只能是 5 秒 |
| 常用类型 | TRADES、MIDPOINT、BID、ASK |
| 权限要求 | 通常需要对应品种和交易所的实时行情权限 |
| 订阅性质 | 持续推送,占用行情行数,必须主动取消 |
| 场景 | 是否适合 |
|---|---|
| 做盘中 5 秒级监控 | 适合 |
| 做分钟级指标前的轻量聚合 | 适合 |
| 回补过去几天的 5 秒数据 | 不适合,用历史 K 线 |
| 没有实时行情权限的账户 | 通常不适合,可能返回权限错误 |
和历史 K 线的区别
Section titled “和历史 K 线的区别”历史 K 线是一次性返回过去数据,5 秒线是持续订阅未来数据。程序收到 5 秒线后,要自己决定写入数据库、更新图表或触发策略。
| 对比项 | 实时 5 秒线 | 历史 K 线 |
|---|---|---|
| 接口 | reqRealTimeBars() | reqHistoricalData() |
| 数据方向 | 订阅之后的新数据 | 指定时间段内的历史数据 |
| 周期 | 固定 5 秒 | 可选 1 秒、5 秒、1 分钟、1 天等 |
| 结束回调 | 没有固定结束;持续推送 | 有 historicalDataEnd() |
| 取消方式 | cancelRealTimeBars(reqId) | cancelHistoricalData(reqId) |
实时 5 秒线同时受两类限制影响:
| 限制 | 说明 |
|---|---|
| 行情行数 | 每个活跃订阅都会占用市场数据行数,和 TWS 界面报价、其他 API 行情请求共享额度。 |
| 新请求频率 | 官方要求 10 分钟内不要发起超过 60 个新的实时 5 秒线请求。批量切换合约、频繁重连时尤其要控制节奏。 |
如果需要看很多标的,不要为每个标的无限开启 5 秒线。更稳的做法是维护订阅池:用户看得见、策略正在用的合约才保持订阅;离开页面或策略停止时立即取消。
参考边界样例
Section titled “参考边界样例”请求 AAPL 5 秒线时,TWS Socket 连接和请求发送正常,但账户缺少对应 API 行情权限:
CONNECTED=TrueREQUEST_SENT=TrueCANCEL_SENT=TrueBAR_ROWS=0ERROR=reqId=97201;code=420;msg=实时查询无效:No market data permissions for ISLAND STK. 请求的市场数据对于API来说需要额外订阅。点击“市场数据连接”对话框中的链接获取更多详情。ERROR=reqId=97201;code=300;msg=无法使用tickerId找到EId::97201这类结果说明调用链路是通的,真正缺的是市场数据权限。300 是取消未建立订阅时的跟随错误,不是根因。代码里必须同时处理 realtimeBar() 和 error(),否则程序会一直等待 bar,看起来像“卡住”。