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

相关文章:

  • 5分钟掌握原神成就数据导出:YaeAchievement终极免费方案
  • 打破模型孤岛:小马算力(TokenPony)如何重构企业大模型接入底座?
  • 避坑指南:用PS的GCP点做SBAS轨道精炼,为什么你的结果误差反而变大了?
  • SBAS-InSAR轨道精炼避坑指南:别再手动瞎选GCP了,试试这个自动化思路
  • 避坑指南:Dell服务器S100/S300控制器创建虚拟磁盘的3个常见错误
  • Dell服务器RAID管理:不用阵列卡,如何用PERC工具交换虚拟磁盘启动顺序?
  • 深策科技AI营销/GEO优化报价分析:廊坊老板的判断框架
  • Ceph分布式存储实战:块存储RBD、对象网关RGW与文件系统CephFS详解
  • 3000-4000元实况拍照手机横评:4款热门手机谁更值得买?
  • 跨境电商防关联浏览器科普|独立环境为什么能防封号
  • 5个实用技巧掌握RISC-V可视化处理器模拟器
  • 用Python实战MUSIC和ESPRIT算法:从理论到代码实现DOA估计(附Pyroomacoustics示例)
  • 口述编程入门:什么是vibe-coding?从写代码到说代码的范式革命(2026程序员必学)
  • 基于数据视角分析斯洛文尼vs塞浦路斯:攻防指标量化拆解
  • 午餐吃什么?让 HarmonyOS 帮你掷骰子——一个“营养搭配抽签”小工具
  • VcXsrv:Windows系统上运行Linux GUI应用的终极解决方案
  • 线上留学论文一对一辅导机构深度测评(客观实测对比)
  • 毕设可用的中文电影对话问答系统:PyTorch版Seq2Seq+Luong注意力实现
  • 从Java字节码到破解实战:深入理解if_icmpgt与iconst指令在软件保护中的应用与对抗
  • 3分钟实现智能图像分层:layerdivider让复杂插画秒变可编辑图层
  • ov5647摄像头模块、MIPI的MCLK主时钟
  • 训练Mask-RCNN时,那个神秘的events文件怎么用TensorBoard打开看损失曲线?
  • SpringBoot+Vue旅行指南系统源码+论文
  • INT8量化致视觉语义对齐失效的分析
  • 星穹铁道自动化助手:三月七小助手完整使用指南
  • 济南全市乡镇街道及区县两级GIS矢量数据(CGCS2000坐标系,含完整SHP文件组)
  • 告别手动分析:用快马平台AI高效构建小说解析工具
  • 从芯片手册到可调模块:手把手拆解SX1308升压电路,看懂那个蓝色电位器到底在调什么
  • Qwen3.6-Plus实战指南:编程智能体如何嵌入真实开发流
  • 系统架构设计师-信息安全核心技术加解密、PKI、访问控制