前言
很多读者学期货量化 的路径是:先在 Excel 或 Python 里读历史 K 线 CSV,算出均线、突破、胜率,觉得"策略有了"。下一步想接到真实或模拟交易时,不知道程序还要接哪些环节------不是再写一个指标公式,而是:谁提供实时 K 线、什么时候算一次信号、怎么下单、怎么确认持仓真的变了。
本文面向只会用 K 线算信号、还没跑通自动下单 的国内期货 Python 学习者,用天勤 TqSdk 把"研究脚本"接到"模拟盘可交易"的最小路径写清楚。会解释 TqApi、get_kline_serial、wait_update、datetime、TargetPosTask 各是什么角色,不默认你已开户或懂 CTP。
一、期货自动交易比"算信号"多哪几步
可以记成五条,缺一条就会出现"能打印价格但从不下单"或"乱下单":
- 账户与环境 :
TqApi+ 认证 + 模拟账户(如TqSim或TqKq)。 - 实时 K 线 :
get_kline_serial(合约, 周期秒数, data_length=...)。 - 事件循环 :
while True里api.wait_update(),等待行情服务推送并更新内存表。 - 触发时机 :用 K 线表最后一行的
datetime是否变化 判断新 bar(见专题),在iloc[-2]上算你原来的信号。 - 执行与核对 :
TargetPosTask.set_target_volume或insert_order,再用get_position/get_trade核对。
你原来的 ma5 > ma20 可以几乎原样搬进第 4 步,变的是数据来源和触发条件。
二、把 CSV 研究换成实时 K 线表
python
from tqsdk import TqApi, TqAuth, TqSim, tafunc
api = TqApi(TqSim(), auth=TqAuth("快期账户", "密码"))
symbol = "SHFE.rb2510" # 上期所螺纹钢,换成你可交易的合约
kl = api.get_kline_serial(symbol, 60, data_length=200) # 60 秒=1 分钟线
kl 是一张随市场更新的表;datetime 列由行情服务写入 ,表示每根 K 线的时间。研究里 df.iloc[-1] 若在实盘里直接用于"收盘价突破",往往用的是未收盘 的最后一根,会导致一分钟内信号闪多次;实盘应改为在 iloc[-2] 上判断,并用下一节的 datetime 触发。
三、触发:何时算一次信号
python
while True:
api.wait_update()
if not api.is_changing(kl.iloc[-1], "datetime"):
continue
ma5 = tafunc.ma(kl.close, 5)
ma20 = tafunc.ma(kl.close, 20)
long_sig = ma5.iloc[-2] > ma20.iloc[-2] and ma5.iloc[-3] <= ma20.iloc[-3]
含义:只有在新 1 分钟 K 线(此处 duration=60)开始时,才用刚收盘那根 的金叉逻辑。wait_update 必须放在循环里,否则表不更新。
四、执行:TargetPosTask 表达"目标几手"
国内期货程序化里,用 目标净持仓 比逐笔手写报单更不易乱(尤其有平今平昨时)。天勤 TargetPosTask 在后续 wait_update 里撤单、报单:
python
from tqsdk.lib import TargetPosTask
task = TargetPosTask(api, symbol)
if long_sig:
task.set_target_volume(1)
# 循环必须继续 wait_update,task 才会动作
文档要求:同一合约不要与 insert_order 混用。
五、核对:持仓是否真的变了
python
pos = api.get_position(symbol)
if api.is_changing(pos, "pos_long") or api.is_changing(pos, "pos_short"):
print(symbol, "净仓", pos.pos)
模拟阶段建议下一笔极小仓位,对照成交与持仓;团队模拟可用 TqKq() 在快期 APP 里看仓。
六、再往后:模拟与实盘
跑通 TqSim 后,通常只改 TqApi 构造(如 TqKq()、TqAccount(期货公司,...)),信号函数一行不改 。退出时 api.close(),避免连接残留。
总结
只会 K 线算信号 的读者,接入国内期货交易的下一步是:用天勤订实时 serial、用 datetime 变化 控制算信号频率、用 [-2] 做收盘决策、用 TargetPosTask 表达目标手数、用 position/trade 核对。这五步与指标公式无关,却是从研究到程序化的分水岭。
建议先在模拟环境跑通一周日志,再考虑实盘小仓位;勿在未核对成交的情况下加大手数。
FAQ
1)想先理解每一笔报单?
可短期用 insert_order 学习,再加交易时段、资金检查,再切 task。
2)没有快期账户?
按天勤文档注册;模拟也需要 TqAuth。
3)信号一天只有一次,循环会空转吗?
过滤后 CPU 很低,空转正常。
4)回测怎么接?
加 TqBacktest 参数,捕获 BacktestFinished 后 close()。
风险提示
本文用于技术入门,不构成投资建议。