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

Python 写期货自动交易:行情下单与成交回报怎么组织

前言

我接触过很多刚写期货程序化的同事,行情能打印出来,一到下单和成交回报就各写各的:有的在循环里直接insert_order,有的在回调里改全局变量,跑一晚上对不上账。其实不必一开始就搭微服务,关键是把数据订阅、事件驱动、交易执行、状态核对四层分清,让同一套骨架能从模拟走到实盘。

天勤TqSdk把行情、账户、委托、成交都挂在同一个TqApi上,用wait_update推进;下面按这个模型说明模块怎么拆、各层职责是什么,并给出最小闭环示例。策略逻辑可以换成你自己的,但组织方式建议先固定。

一、四层结构怎么记

层级职责天勤里常见入口
数据层订阅行情、K 线、账户截面get_quoteget_kline_serialget_accountget_position
事件层判断本次更新是否值得处理wait_updateis_changing
执行层把信号变成报单或目标仓insert_orderTargetPosTask.set_target_volume
核对层委托、成交、持仓是否一致get_orderget_trade、position 字段

新手常把执行层和核对层混在一起:下单后不跟踪order.status,成交了也不读get_trade,只靠“我以为成交了”推进策略,实盘很快失控。

二、数据层:先订再算

创建TqApi时选定交易单元(本地调试可用TqSim,团队模拟常用TqKq,实盘用TqAccount)。随后一次性订阅本策略需要的对象:

fromtqsdkimportTqApi,TqAuth,TqSim api=TqApi(TqSim(),auth=TqAuth("快期账户","密码"))symbol="SHFE.rb2510"quote=api.get_quote(symbol)kl=api.get_kline_serial(symbol,60,data_length=200)pos=api.get_position(symbol)acc=api.get_account()

get_kline_serialdata_length要大于指标周期,否则均线等指标前面全是 nan。行情对象在首次wait_update之前可能为空,文档也提醒过:刚订阅后quote.datetime可能还是空字符串。

三、事件层:用 wait_update 当心跳

wait_update是天勤策略的主驱动:阻塞等待业务数据更新,同时把之前发出的订阅、报单真正发到网络,并让TargetPosTask等后台任务有机会下单。官方说明里写得很清楚——不调wait_update,很多指令不会真正出去

whileTrue:api.wait_update()# 下面只在“关心的字段变了”时进逻辑

主循环里避免长时间sleep、大段同步计算或阻塞 IO;这些都会推迟下一次wait_update,行情和回报都会变慢。

四、执行层:手写报单 vs 目标持仓

入门理解链路insert_order:方向、开平、限价一目了然,适合学拒单和挂单规则。

信号驱动调仓TargetPosTask:策略只维护“目标净仓几手”,拆单、撤单改价由 task 在后续每次wait_update时处理。注意文档约束:set_target_volume之后必须继续wait_update;同一合约不要和insert_order混用。

fromtqsdk.libimportTargetPosTask task=TargetPosTask(api,symbol)whileTrue:api.wait_update()ifapi.is_changing(kl.iloc[-1],"datetime"):# 此处算信号,示例:目标多头 1 手task.set_target_volume(1)

五、核对层:成交回报从哪来

天勤没有单独的“回调函数列表”,回报体现在数据截面更新上:

  • 委托:get_order()或指定order_id,看statusvolume_left
  • 成交:get_trade()
  • 持仓:get_position(symbol)pos_longpos_short

wait_update返回后,用is_changing过滤订单、成交、持仓字段,再写结构化日志。模拟盘还可对照TqSimtrade_log做二次校验。

六、模块落地到文件时的建议

单文件 demo 可以全写在一个while True里;策略变复杂后建议拆成:

  1. config:合约、周期、账户构造
  2. data:订阅与指标计算(纯函数,不直接下单)
  3. signal:输入 K 线/行情,输出目标方向或目标仓
  4. execution:只负责TargetPosTaskinsert_order
  5. reconcile:每根 K 线或每分钟对 order/trade/position 做一次快照

这样换模拟、换实盘时,通常只改TqApi构造行和环境变量,信号与执行接口不变。

总结

Python 期货自动交易可按数据订阅 → wait_update 事件驱动 → 执行(insert_order 或 TargetPosTask)→ get_order/get_trade/position 核对四层组织。天勤把行情、账户、委托、成交放在同一TqApi截面里,避免自己维护多套 CTP 回调状态机。

落地时先订合约与 K 线,主循环里短逻辑 + 字段级is_changing;执行层选手写报单或目标持仓二选一;核对层用订单、成交、持仓字段写日志,模拟盘可对照trade_log。策略变复杂后再拆 config、signal、execution、reconcile 模块,换环境只改账户构造。

FAQ

1)必须先有行情才能下单吗?

实盘和模拟都依赖合约信息(最小变动价位、交易状态等)。应先wait_update收到有效quote再报单,否则容易拒单或价格无效。

2)TargetPosTask 和 insert_order 能一起用吗?

官方明确不建议同一合约同时使用,否则 task 与手写报单会冲突。

3)多合约怎么组织?

每个合约一个TargetPosTask实例(同一账户同一合约单例);信号层为每个 symbol 维护独立目标仓,不要共用一个全局“方向变量”。

4)回报要不要单独线程收?

天勤模型下用wait_update统一收包即可;再开线程抢 CTP 回调容易和 API 内部状态打架。

风险提示

本文讨论程序结构与技术实现,不构成投资建议。实盘前请在模拟环境充分验证。

http://www.gsyq.cn/news/1463819.html

相关文章:

  • 保姆级排错指南:华为AC+AP三层漫游配置后,客户端为啥上不了网?
  • 别再只测网速了!用笔记本网卡抓取Wi-Fi Beacon帧,手把手教你精准测量信号强度
  • 别再只盯着指纹支付了!聊聊Android手机里那个‘隐形保险箱’TEE的另类玩法
  • 运筹学实战:用分支定界法搞定项目投资决策,避开这3个常见建模坑
  • 河南隔音房定制价格_影响成本的 5 大因素
  • AIGS框架落地实操:普通IT团队也能玩转企业Agent
  • APK-Installer:Windows上安装Android应用的终极指南
  • 从Beacon帧到信号地图:Python脚本自动化解析Wi-Fi热点功率与分布
  • 告别变砖风险:红米AC2100刷机前,用这个命令先给你的路由器做个“体检”
  • 2026 年南山全屋定制工厂怎么选?本地业主都在用这几个方法 - 产品测评官
  • OpenRAM深度解析:一个开源内存编译器,如何挑战Synopsys GMC和商业方案?
  • 从钣金加工到成品装配,弱电箱是如何制造出来的?
  • 告别信息泄露:手把手教你用ret2dlresolve在x86/x64下无libc地址getshell
  • n-carousel轮播图(多端如何设置不同图片高度)
  • 终极JSON对比神器:3分钟快速找出数据差异的完整指南
  • 浙江大学让机器人“用眼睛思考“:比文字快22倍的视觉推理新方案
  • 跨境电商防关联浏览器科普|独立环境为什么能防封号
  • 【linux】免密登录
  • 运筹学对偶理论:从“生产 vs 出租”的生意经,看懂强对偶与互补松弛
  • 【Springboot毕设全套源码+文档】基于springboot的网上课程资源远程教育资源共享平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • 从CT机到你的屏幕:一次DICOM医学影像的完整‘旅程’与格式揭秘
  • 2026 年深圳宝安小户型全屋定制 带榻榻米和衣帽间如何实现高性价比 - 产品测评官
  • 从Codex更新看AI Agent未来:通用智能体正在崛起
  • 深圳 ai 智能开发公司哪家便宜:独家排名最新深度推荐 - 17322238651
  • 计算机毕业设计之基于LSTM模型的NBA小前锋综合实力分析与预测
  • 终极Windows系统清理工具:免费快速解决C盘爆红问题
  • 2026年当下,如何甄别一家真正可靠的废钢回收企业? - 2026年企业资讯
  • 外贸独立站技术复盘:无货源代购订单履约技术实现
  • 保姆级教程:Quartus II 16.0在Win10/Win11下的完整安装与破解流程(含网卡ID获取与License配置)
  • java键盘录入