前言
国内期货程序化交易里,策略算完信号后要通过天勤向期货公司报单。趋势类策略常用TargetPosTask:在wait_update()里自动限价或对价调仓,默认相当于当日有效挂单(GFD),单子可以挂在场上排队等成交。跨期价差、套利类策略则不同:例如做多豆粕近月、做空远月,要求两腿尽量同时成交;若收盘前只成交一腿,另一腿挂在夜盘前,就变成裸露的单边方向风险。
手写报单时,天勤api.insert_order()产生的委托对象带有time_condition(objs.py):GFD当日有效、IOC立即完成否则撤销、GTC撤销前有效等;还可配合FAK/FOK等高级参数。TargetPosTask封装了趋势场景常见路径,要精细控制「未成即撤」须直接调insert_order。下面说明各参数在期货场景怎么选、和 task 如何分工。
一、time_condition 枚举(Order 对象)
| 值 | 含义 |
|---|---|
| GFD | 当日有效 |
| GTC | 撤销前有效 |
| IOC | 立即完成,否则撤销 |
| GFS | 本节有效 |
| GFA | 集合竞价有效 |
模拟撮合trade_base.py对IOC有特殊处理:不能立即成交的限价单直接撤。
二、insert_order 示例
order=api.insert_order(symbol="SHFE.rb2510",direction="BUY",offset="OPEN",volume=2,limit_price=3500,advanced="FAK",# 以你本地文档支持的 advanced 参数为准)具体advanced与time_condition组合以官方insert_order签名为准。报单后必须wait_update才能看到order.status、volume_left变化。
三、场景选择
| 场景 | 建议 |
|---|---|
| 趋势调仓 | TargetPosTask,默认 GFD 类 |
| 价差吃单 | IOC/FAK,减少残单 |
| 收盘前挂单 | 避免 GTC 过夜 |
| 集合竞价 | GFA,需确认品种支持 |
手写 IOC 后检查volume_left:大于 0 且迅速FINISHED,说明未成交部分已撤。
四、与 TargetPosTask 的分工
文档禁止同合约混用 task 与insert_order。若策略 90% 用 task、10% 用 FAK 点价,应统一改为insert_order或拆成两阶段进程。临时 FAK 应急后,恢复 task 前对账pos。
五、拒单与 last_msg
部分组合交易所不支持,会is_error真,last_msg提示参数非法。应在模拟盘枚举合法组合。
六、volume_condition 与成交充分度
volume_condition控制成交量条件:ANY任意数量、MIN最小、ALL全部。与FAK/FOK组合时,语义是「能成交多少算多少」还是「必须全部成交否则全撤」。套利两腿若要求同时全成,FOK 更严但失败率更高;趋势入场通常 ANY 或 FAK 即可。
| volume_condition | 典型搭配 | 残单风险 |
|---|---|---|
| ANY | GFD 限价 | 高 |
| ANY | FAK | 低 |
| ALL | FOK | 极低,易废单 |
七、监控在途 IOC 单
IOC/FAK 报单生命周期很短,仍要在wait_update后立刻检查:
order=api.insert_order(...)whileorder.status!="FINISHED":api.wait_update()filled=order.volume_orign-order.volume_left log("fak_result",filled=filled,left=order.volume_left,msg=order.last_msg)若filled == 0,策略要有备选:放宽限价、换 PASSIVE、或放弃本次信号。不要假设 FAK 一定成交。
八、日终残单扫描
收盘前遍历get_order(),任何status == "ALIVE"的 GFD/GTC 单都应显式cancel_order或调set_target_volume对齐。日终日志记alive_count,不为 0 则告警。
总结
报单有效期决定残单风险。天勤在Order.time_condition与insert_order高级参数里暴露 GFD、IOC 等选项;趋势用TargetPosTask即可,价差和点价场景手写insert_order时显式选 IOC/FAK,并在wait_update后检查volume_left。禁止与 task 混用同合约,是避免状态机打架的前提。
FAQ
1)task 能设 IOC 吗?
task 内部封装,不直接暴露 time_condition;要 IOC 就手写单。
2)IOC 部分成交?
剩余撤销,pos为部分成交量。
3)市价单还要 time_condition 吗?
price_type=ANY时规则因交易所而异,模拟盘先测。
4)多账户 insert_order?
传account=参数。
本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。