当前位置: 首页 > news >正文

直接用 CTP 做期货自动交易太乱:天勤式状态管理思路

前言

自己对接 CTP 时,OnRtnOrder、OnRtnTrade、OnRspQryInvestorPosition 交错到达,稍不注意就会出现重复开仓、撤单状态对不上、重启后仓位失忆。很多同事并不是不懂 CTP,而是缺少一个统一的业务截面,被迫在回调里维护多套布尔变量。

天勤TqSdk的做法是把行情、委托、成交、持仓合并成可查询的数据对象,用wait_update推进,用is_changing判断本次更新涉及哪些字段——本质是把 CTP 事件流折叠成同步可读的状态机。下面说明这种思路与直接 CTP 的差异,以及何时仍要下沉到 CTP。

一、直接 CTP 为什么容易乱

CTP 特点开发负担
异步回调每个回调里都要考虑重入与顺序
查询与推送并存同一持仓可能先推送后查询,合并逻辑复杂
断线重连需重订阅、重查、与本地缓存对齐
多合约每个 Instrument 一条状态线

常见反模式:在 OnRtnTrade 里改全局position,在 OnRspQry 里又改一次,策略线程还在读第三个副本。

二、天勤的核心抽象:截面 + 更新帧

可以把它理解成:

  1. 截面:当前时刻所有 quote、order、trade、position 的快照
  2. 更新帧:每次wait_update收到一批 diff,合并进截面
  3. 变化检测is_changing(obj, key)回答“这一帧里该字段变没变”

策略写法从“监听回调改状态”变成“每帧读截面做决策”:

api.wait_update()ifapi.is_changing(quote,"last_price"):...ifapi.is_changing(pos,"pos_long"):...

wait_update文档说明:还会驱动TargetPosTask等后台任务发单,把“报单状态机”从策略里拆出去。

三、执行层:TargetPosTask 分担委托状态机

手写 CTP 时,自己要维护:报单 → 部分成交 → 撤单 → 再报。TargetPosTask在内部根据行情更新价格并撤单重挂(文档有说明),策略侧只维护目标净仓

约束(务必遵守):

  • 同一合约不要与insert_order混用
  • set_target_volume后要继续wait_update
  • 每账户每 symbol 单例,参数构造一次定好

这对“只想表达多空意图”的策略,比全手写 CTP 状态机清晰得多。

四、与 CTP 的关系:天勤不是替代交易所

天勤仍然连接柜台与行情服务,CTP 细节被封装在底层。你得到的是:

  • 统一的 Python 对象模型
  • 回测TqBacktestTqSim/TqKq/TqAccount切换
  • 更少的回调嵌套

若要做极定制的报单算法(如复杂拆单、席位级优化),可能仍需了解 CTP 限制,或在 task 之外扩展——但要评估是否真有必要。

五、迁移路径:从 CTP 思维到天勤思维

CTP 习惯天勤对应
OnRtnOrderget_order+is_changing(order, "status")
OnRtnTradeget_trade+is_changing
持仓查询get_position(symbol)
行情 tickget_quote+is_changing(quote, "last_price")
策略主循环while True: wait_update()

建议新策略直接用天勤写完模拟再考虑是否下沉 CTP;已有 CTP 策略可先把信号层保持不变,交易层用天勤重做一小段对照成交。

六、仍要注意的边界

  • 延迟:多一层封装,极端高频可能不满足,需实测
  • 规则透明:拒单原因仍要会查 order 状态与日志
  • 进程模型:单 API 单线程wait_update,与 CTP 多线程回调模型不同
  • 合规与权限:实盘TqAccount开通条件以官方说明为准

七、清晰开发流程(推荐)

  1. get_kline_serial订数据,K 线策略用datetime触发
  2. 信号输出target_volume字典(多合约 per symbol)
  3. TargetPosTask执行,主循环只wait_update
  4. get_order/get_trade/position做收盘核对
  5. 环境用TqSimTqKqTqAccount渐进切换

状态持久化(进程重启恢复目标仓与指标缓存)可配合团队已有的策略状态持久化方案,避免重启后重复开仓。

总结

CTP 直连的复杂度主要在异步回调与多源状态合并。天勤用wait_update推进统一截面,用is_changing做帧级判断,用TargetPosTask承接调仓状态机,策略只关心目标持仓与信号,所以天勤已经适合绝大多数 Python 期货程序化场景;极定制执行仍需评估性能与规则。从 CTP 迁移时,把回报处理改成“每帧读 get_order/get_trade/position”,往往比继续堆回调变量更稳。

FAQ

1)天勤还能用 CTP 账户吗?

实盘通过TqAccount等对接期货公司,底层仍是柜台链路,具体以开通说明为准。

2)回调式策略能否与天勤混用?

不建议双驱动;选一种模型,避免两套状态。

3)回测状态机与实盘一致吗?

同一套wait_update逻辑,执行假设仍有差异,需模拟验证。

4)多账户?

天勤支持多账户模式,task 与 get_order 需指定account参数。

风险提示

本文讨论软件开发思路,不构成投资建议。

http://www.jsqmd.com/news/952040/

相关文章:

  • 【字节跳动】巨量引擎第二层内核 纯工业级机密参数201-500
  • uBlock Origin终极指南:5分钟打造纯净无广告的浏览器体验
  • Spring Boo从“会用”到“精通”:Spring Boot 入门
  • 毕设可用的中文电影对话问答系统:PyTorch版Seq2Seq+Luong注意力实现
  • AI工具如何72小时内重构对账流程?揭秘头部金融机构已验证的4层智能校验架构
  • MATLAB一键运行的音频水印工具包:支持DWT-DCT-SVD嵌入提取、多音频测试与图像水印可视化评估
  • 2026年新发布:广东钢板网工厂联系指南与市场趋势解析 - 2026年企业资讯
  • 泰坦尼克号生存预测三模型实战包:逻辑回归+ID3决策树+随机森林Python完整实现
  • 别再只调API了!用Keras从零复现Facenet人脸识别模型(附完整代码与CASIA-WebFace数据集处理)
  • 期货量化 wait_update 超时怎么办:天勤 TqTimeoutError 分级处理
  • 避坑指南:STM32低功耗停止模式唤醒后时钟配置的那些事儿
  • 列车轮对几何参数在线检测关键技术解析【附数据】
  • C++ 编码规范
  • 2026年大客户营销咨询选购指南,品牌排名 - mypinpai
  • 别再死记硬背!一张图+一个故事帮你理清正交、酉、正规矩阵的关系与区别
  • Zotero PDF预览插件:让文献浏览告别窗口切换的困扰
  • Transformer QKV 计算瓶颈?一次关于长上下文显存爆炸的硬核排查与优化
  • AI简历不是“加个ChatGPT”,而是重构求职链路——12个企业级落地案例拆解
  • 2026年深圳全屋定制一站式服务避坑 别被假工厂全流程忽悠了 - 产品测评官
  • 智能担保系统架构设计全图解(含LLM+规则引擎双模决策链路)
  • 别再死记硬背了!用Multisim/PSpice仿真带你直观理解PFC的三种工作模式(CCM/DCM/CrM)
  • PPTist:5分钟打造专业演示文稿的终极免费在线PPT制作工具
  • Mac窗口置顶神器Topit:如何让重要窗口永远在最前方
  • 紧急预警:标注数据漂移正 silently 毁掉你的模型效果!——用AI工具构建动态标注质量监控仪表盘(Python+Prometheus实战)
  • CentOS 7生产环境PHP 8.1安装避坑实录:Remi源、扩展冲突与SELinux策略
  • ov5647摄像头模块、MIPI的MCLK主时钟
  • 2026年酒泉驾考驾校价格比较:新亿阳驾校性价比高吗? - mypinpai
  • 从开关电源到第三代半导体:聊聊PFC技术这几十年的‘进化史’
  • Python 爬虫进阶技巧:自定义请求头编码适配多国语言网页爬取
  • 3步掌握iOS虚拟定位:iFakeLocation完全指南