从 CTP 直连习惯迁移到天勤:会话、回报与查询怎么对齐
前言
我入行那几年,CTP + Spi 是标配:登录、订阅、OnRtnDepthMarketData、OnRtnOrder,回报在回调里一条条处理。后来团队试天勤,最别扭的不是 Python 语法,而是找不到「Session 对象」——同事在群里问「Thost 登录放哪」,我说:别找了,你把 TqApi 当成「已经登录好的会话」,后面全是 wait_update 之后读快照。
还有一次典型翻车:旧策略里留了个线程专门收 CTP 回报,主线程又跑天勤的 wait_update,两边同时改持仓字典,模拟盘里仓位忽多忽少,查了一下午以为是柜台 bug,其实是两套事件模型打架。迁过来的人,多半不是不会 Python,而是等事件的习惯没转过来。下面是我贴在工位上的概念对照和最小迁移骨架,细节以 advanced/for_ctp_user.rst 为准。
一、思维转换:回调推数据 → 主动问「这一帧谁变了」
CTP 的世界里,交易所推什么你收什么;天勤的世界里,你先说我要订哪些合约,然后在循环里问:这一帧 quote 变了吗、account 变了吗、order 变了吗。
| CTP 习惯 | 天勤近似 |
|---|---|
| OnRtnDepthMarketData | get_quote + is_changing(quote) |
| 查资金 | get_account() |
| 查持仓 | get_position(symbol) |
| 报单 | insert_order / TargetPosTask |
| 阻塞等下一包 | wait_update() |
刚开始你会觉得「没有回调不踏实」——其实回报仍在,只是合并进对象状态里,你要学会用 is_changing(order, "status") 去盯,而不是等一个 Python 函数被调用。
二、最小迁移骨架
下面这段我用来带新人跑通第一天:能打印价、资金、持仓,就算迁移成功一半。
from tqsdk import TqApi, TqAuth, TqSim
api = TqApi(TqSim(), auth=TqAuth("账户", "密码"))
quote = api.get_quote("SHFE.rb2510")
acc = api.get_account()
pos = api.get_position("SHFE.rb2510")
while True:
api.wait_update()
if api.is_changing(quote):
print("行情", quote.last_price)
if api.is_changing(acc):
print("资金", acc.available)
if api.is_changing(pos):
print("持仓", pos.pos_long, pos.pos_short)
注意:没有「注册 Spi」;get_quote 本身就是订阅。CTP 里你可能习惯先 Login 再 Subscribe,天勤里构造 TqApi 时把账户和 auth 配对好,后面统一在循环里读。
三、报单与回报:从 OnRtnOrder 到 order 对象
CTP 里你会打印报单引用、回执、成交三段;天勤里对应 order 对象的状态字段。我迁移时会在日志里固定打:order_id、状态、剩余手数、拒单原因原文,这样和老 CTP 日志还能对照习惯。
撤单仍是显式操作:cancel_order,字段和前置条件以 usage/trade.rst 为准。不要假设「撤单一定成功」,和 CTP 一样要看回报。
若你原来用「报单 → 等成交 → 再报下一笔」的状态机,可以保留状态机,只是触发条件从回调改成 is_changing(order)。
四、我见过的迁移坑(真实工单类)
- 线程 + wait_update 混用:单线程是天勤模型底线,CTP 收包线程请拆掉或整策略留在 CTP。
- sleep 等回报:回报不到就 sleep,会卡住整个行情泵;用
is_changing或记录「已发送未成交」状态。 - 持仓字段对不上:今昨、多空拆开,和自算盈亏不一致时,把
position全字段打印和柜台终端对一眼。 - 开平今写错:期货规则仍在,只是 API 名字不同,对照文档别凭 CTP 肌肉记忆。
五、什么时候还得碰 CTP
极底层定制、特殊柜台、天勤未覆盖的网关,可能仍要原生接口。但对多数「Python 写策略、想少维护 Spi」的团队,迁到天勤是为了把连接、字段、回测模拟收成一条线。若你只是讨厌回调,仍要 CTP 独有功能,那就得老老实实评估边界,别硬迁一半。
总结
从 CTP 迁天勤,我以为是改 API 名,后来发现是改等世界的方式:从「推到我脸上」变成「我问这一帧更新了啥」。你先别急着重写策略逻辑,用上面最小骨架在模拟盘跑一个白盘,能稳定打印价、钱、仓,再迁下单和风控,心态会稳很多。文档 for_ctp_user 我建议大家打印出来勾一遍——我当年要是先勾,能少吵好几轮「是不是天勤慢了」的无效讨论。迁完之后,维护重心会从 Spi 版本转到合约换月和日志纪律,这是好事,得认。
FAQ
1)还能和 openctp 并存吗?
策略主体已迁天勤的话,一般不再混 Spi;两套并存只增加幽灵 bug。
2)延迟会不会比 CTP 直连差?
要实测;很多人换来的是字段统一和代码短,不是微秒级优势。
3)多账户怎么对应?
见 TqMultiAccount 文档,别在单账户思维里硬套。
4)实盘构造用什么?
TqAccount 或文档里对应柜台类,和 CTP 的 Login 不是一行对应一行。
5)回报还会丢吗?
网络闪断任何框架都会遇到;靠日志、重连预案和人工兜底,不是换 API 就消失。
风险提示
本文用于期货量化技术实践讨论,不构成投资建议。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)