同一账户下的多策略隔离¶
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策略程序