前言
读者问“期货自动交易程序最短要多长”,本质是:在国内期货市场,用 Python 把行情 → 决策 → 下单 → 核对连起来最少需要哪些部件。不是均线公式,而是TqApi 循环与K 线 datetime 触发这类工程骨架。
本文用天勤TqSdk给出五模块说明和一段可跑示例,并逐块解释在螺纹钢等期货合约上各自解决什么问题。适合零实盘经验、已装 TqSdk 的读者照抄改calc_target。
一、五模块(期货语义)
- 环境:连接谁——模拟
TqSim、快期模拟TqKq或实盘TqAccount。 - 订阅:订哪个合约的 K 线或 quote。
- 循环:
wait_update收国内期货行情包。 - 触发+信号:何时算——此处用 K 线表最后一行
datetime是否变化(字段由行情服务写入)。 - 执行+核对:
TargetPosTask设目标手数;get_position看是否到位。
二、完整示例(建议整段运行一次)
fromtqsdkimportTqApi,TqAuth,TqSimfromtqsdk.libimportTargetPosTaskdefcalc_target(kl):"""输入 K 线表,返回目标净仓手数或 None 表示本 bar 无操作"""returnNone# 读者在此写均线等逻辑api=TqApi(TqSim(),auth=TqAuth("快期账户","密码"))symbol="SHFE.rb2510"kl=api.get_kline_serial(symbol,60,data_length=200)task=TargetPosTask(api,symbol)try:whileTrue:api.wait_update()ifnotapi.is_changing(kl.iloc[-1],"datetime"):continuetgt=calc_target(kl)iftgtisnotNone:task.set_target_volume(tgt)pos=api.get_position(symbol)ifapi.is_changing(pos,"pos"):print("核对",symbol,"净仓",pos.pos)exceptKeyboardInterrupt:passfinally:api.close()阅读要点:duration=60为 1 分钟 K 线;datetime变表示新 bar;calc_target内应使用iloc[-2];set_target_volume后循环不能停;pos核对防止你以为成交了其实没有。
三、扩展顺序
- 在
calc_target写双均线,返回 -1/0/1 乘以手数。 - 加
quote交易时段过滤(国内夜盘品种)。 - 拆 config / signals / main。
TqKq()→TqAccount仅改TqApi行。
四、勿删的最小要素
去掉wait_update、去掉datetime过滤、去掉close,就不是可靠的期货自动交易骨架,只是行情演示。
总结
期货自动交易最小骨架= 环境 + serial + wait_update +datetime 触发+ TargetPosTask + position 核对。天勤把国内期货行情表与交易对象放在同一 API;读者只需填充calc_target。
先模拟跑通打印与一笔小单,再谈资金规模。
FAQ
1)能否更短?
再短会缺核对或 close,不推荐。
2)insert_order 版?
可替换 task,仍要 wait_update 与触发。
3)多合约?
tasks/targets 字典。
4)回测?
make_api 加 TqBacktest。
风险提示
本文提供示例结构,不构成投资建议。