当前位置: 首页 > 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.gsyq.cn/news/1463655.html

相关文章:

  • AI工具如何72小时内重构对账流程?揭秘头部金融机构已验证的4层智能校验架构
  • 避坑指南:STM32低功耗停止模式唤醒后时钟配置的那些事儿
  • 泰坦尼克号生存预测三模型实战包:逻辑回归+ID3决策树+随机森林Python完整实现
  • Transformer QKV 计算瓶颈?一次关于长上下文显存爆炸的硬核排查与优化
  • 别再死记硬背!一张图+一个故事帮你理清正交、酉、正规矩阵的关系与区别
  • AI简历不是“加个ChatGPT”,而是重构求职链路——12个企业级落地案例拆解
  • CentOS 7生产环境PHP 8.1安装避坑实录:Remi源、扩展冲突与SELinux策略
  • ov5647摄像头模块、MIPI的MCLK主时钟
  • 2026运城市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 2026年硅胶密封圈供应商排名,哪家口碑好 - mypinpai
  • YOLOv11城市道路路面病害目标检测数据集-2722张-Pothole-detection-1
  • IPO材料智能生成系统崩溃事件复盘(附证监会反馈原文+AI修正日志),仅限本周开放下载
  • YOLO26 数据清洗自动化:基于聚类的噪声样本过滤——从特征提取到综合流水线的完整工程实践
  • AI赋能转正决策:从数据采集、能力建模到自动评估(2024最新Gartner验证框架)
  • 图片:数字化时代的视觉语言
  • 如何遗忘比如何记忆更重要——AI Agent框架的一些总结
  • 高级实时动漫视频超分辨率技术深度解析:Anime4K开源项目架构设计与性能优化实战指南
  • 3分钟实现智能图像分层:layerdivider让复杂插画秒变可编辑图层
  • ctf show web入门99
  • 086、医疗影像病灶检测:YOLO 在 X 光、CT 切片上的小样本与正负样本不均衡方案
  • AI如何重塑秋冬服装赛道?实现降本增效新突破
  • 深圳配眼镜推荐指南:3 家硬核之选,少花冤枉钱还能 get 专业配镜 - 配眼镜新资讯
  • 终极指南:用开源神器TCC-G15彻底解决Dell G15散热烦恼
  • 085、安防监控行人属性检测:YOLO + 多属性分类 Head 的联合设计
  • 如何3步制作专业LRC歌词:零基础入门完整指南
  • 2026岳阳市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 084、自动驾驶行人车辆检测:多类别、多尺度、实时性的三角平衡方案
  • 5分钟终极指南:如何用Deceive实现Riot游戏隐身模式,专注游戏不被干扰
  • 新手零基础入门claude desktop:利用快马平台生成交互式学习项目
  • MySQL5.7 数据库安装、初始化、密码修改、远程连接完整实战