同一账户下的多策略隔离

TqSdk 可以通过交易单元机制支持同一个账户下的多策略交易结果隔离.

使用交易单元机制

要使用交易单元机制, 只需在账号后附加一个 “.” 号, 后跟交易单元名即可. 假定交易账户为海通期货的 4003212 账号:

# 策略程序A
from tqsdk.api import TqApi, TqAccount

api = TqApi(TqAccount("H海通期货", "4003212.mystrategyA", "123456"))  # mystrategyA 就是交易单元名
q = api.get_quote("DCE.a1901")
pos = api.get_position("DCE.a1901")
while api.wait_update():
  api.insert_order("DCE.a1901", "BUY", "OPEN", volume=1)              # 这里下单都会算作 mystrategyA的
  print(pos.volume_long)

策略程序A运行后会不断买开 DCE.a1901, 可以看到持仓量不断上升. 我们再启动策略程序B:

# 策略程序B
from tqsdk.api import TqApi, TqAccount

api = TqApi(TqAccount("H海通期货", "4003212.other", "123456"))        # other 是另一个交易单元名
q = api.get_quote("DCE.a1901")
pos = api.get_position("DCE.a1901")                                   # 取 DCE.a1901 持仓, 拿到的是自己这个交易单元的持仓
print(pos.volume_long)                                             # 取持仓手数, 即使策略程序A已经开了很多仓, 还是会返回0

可以看到, 策略程序B认为 DCE.a1901 的持仓手数为0.

策略程序如果使用交易单元机制, 需要注意以下事项:

  • 只有TqAccount支持在账号后附加交易单元名的方式, TqSim不支持
  • 策略程序中调用 get_position 获取的持仓记录是本交易单元的持仓记录. 策略程序启动时总是处于 “没有持仓” 的状态. 只有策略程序自己的开仓单成交后, 才会出现持仓.
  • 策略程序中调用 get_order 函数,获得的是本策略的委托单信息
  • 策略程序中调用 get_account 获取的账户资金信息, 依然是整个账户的数据, 并不按交易单元切分
  • 策略程序中使用 TargetPosition 设置目标持仓, 不影响其它策略程序

在天勤软件中使用交易单元机制

在天勤软件中启动策略程序, 默认都会自动分配一个交易单元. 详见 在天勤程序化交易软件中运行Python策略程序