交易接口与下单

拿到行情后,下一步就是交易。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 注意事项

  1. 每个合约只创建一个实例,重复创建会冲突。
  2. set_target_volume必须继续调用 wait_update(),否则不会执行。
  3. 不要同时对同一合约使用 insert_order()TargetPosTask,否则会报错。
  4. 以最后一次 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