交易接口与下单
拿到行情后,下一步就是交易。TqSdk 提供两种交易方式:手动下单(insert_order / cancel_order,精细控制每一步)和目标持仓(TargetPosTask,只管目标手数,框架自动调仓)。
账户与持仓查询
下单前,先了解怎么查账户资金和持仓:
account = api.get_account()
position = api.get_position("SHFE.rb2410")
print("可用资金:", account.available)
print("多头持仓:", position.volume_long, "手")
Account 常用字段
| 字段 | 含义 |
|---|---|
balance | 账户权益 |
available | 可用资金 |
float_profit | 浮动盈亏 |
position_profit | 持仓盈亏 |
margin | 已占用保证金 |
risk_ratio | 风险度(保证金/权益) |
commission | 手续费 |
Position 常用字段
| 字段 | 含义 |
|---|---|
volume_long / volume_short | 多头 / 空头持仓手数 |
volume_long_today / volume_long_yd | 今仓 / 昨仓 |
open_price_long / open_price_short | 多头 / 空头开仓均价 |
float_profit_long / float_profit_short | 多头 / 空头浮动盈亏 |
margin_long / margin_short | 多头 / 空头保证金 |
get_account()和get_position()返回的也是动态引用,随wait_update()自动更新。
insert_order:发送委托单
# 限价开多 2 手
order = api.insert_order(symbol="SHFE.rb2410", direction="BUY", offset="OPEN",
volume=2, limit_price=3800)
# 市价开多 2 手(不填 limit_price)
order = api.insert_order(symbol="SHFE.rb2410", direction="BUY", offset="OPEN", volume=2)
参数详解
| 参数 | 含义 |
|---|---|
symbol | 合约代码 |
direction | "BUY"(买)或 "SELL"(卖) |
offset | "OPEN"(开仓)/ "CLOSE"(平仓)/ "CLOSETODAY"(平今) |
volume | 下单手数 |
limit_price | 限价(数字)/ None(市价)/ "BEST"(最优一档)/ "FIVELEVEL"(最优五档) |
advanced | "FAK"(部成部撤)/ "FOK"(全成或全撤),可选 |
关键:
insert_order只是登记指令,真正的报单在下一次wait_update()时才发出。
Order 对象状态
order = api.insert_order(symbol="SHFE.rb2410", direction="BUY", offset="OPEN", volume=2, limit_price=3800)
while order.status != "FINISHED":
api.wait_update()
print("状态:", order.status, "已成交:", order.volume_orign - order.volume_left, "手")
| 字段 | 含义 |
|---|---|
order_id | 委托单 ID |
status | "ALIVE"(有效)/ "FINISHED"(已结束) |
volume_orign | 原始报单手数 |
volume_left | 剩余未成交手数 |
limit_price | 委托价格 |
上期所平仓:平今 vs 平昨
上期所(SHFE)和能源中心(INE)的合约必须区分平今和平昨:
# 上期所:平今仓用 CLOSETODAY,平昨仓用 CLOSE
api.insert_order("SHFE.au2412", "SELL", "CLOSETODAY", 1) # 平今仓
api.insert_order("SHFE.au2412", "SELL", "CLOSE", 1) # 平昨仓
# 其他交易所:统一用 CLOSE
api.insert_order("DCE.m2501", "SELL", "CLOSE", 1)
cancel_order:撤单
# 撤销指定委托单
api.cancel_order(order)
# 撤销所有挂单
api.cancel_order()
同样,撤单指令也是在下一次 wait_update() 时才真正发出。
TargetPosTask:目标持仓工具
如果你不想自己管下单/撤单/追单的细节,用 TargetPosTask——只需指定目标持仓手数,框架自动调整到位:
from tqsdk import TqApi, TqAuth, TargetPosTask
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
target_pos = TargetPosTask(api, "SHFE.rb2410")
while True:
api.wait_update()
if 条件满足:
target_pos.set_target_volume(1) # 正数=多头,负数=空头,0=空仓
set_target_volume 后,调仓动作在后续 wait_update() 中自动执行——下单、追单、平仓,直到实际净持仓达到目标。
TargetPosTask 注意事项
- 每个合约只创建一个实例,重复创建会冲突。
set_target_volume后必须继续调用wait_update(),否则不会执行。- 不要同时对同一合约使用
insert_order()和TargetPosTask,否则会报错。 - 以最后一次
set_target_volume为准。
查询委托和成交
orders = api.get_order() # 所有委托单
trades = api.get_trade() # 所有成交记录
for oid, order in orders.items():
if order.status == "ALIVE":
print("挂单中:", oid, order.volume_left, "手")
小结
insert_order手动下单,cancel_order撤单——精细但繁琐。TargetPosTask只管目标手数,自动调仓——简单省事,推荐新手优先使用。- 上期所平仓必须区分
CLOSETODAY/CLOSE。 - 所有交易指令在
wait_update()时才真正发出。
策略光有交易还不够,通常还需要技术指标来生成信号: 技术指标 ta。