TqSdk2 交易单元

当我们有较多策略需要对同一账户的同一合约进行作用时,我们可能会需要能区分出不同策略的表现效果,同时不同策略我们也希望能够使用 TargetPosTask 来进行调仓动作

TqSdk2 专业版 提供了交易单元来解决以上需求场景,交易单元可以支持:

  • 同一账户下, 支持对指定交易单元进行下单和调仓操作,不干扰其他交易单元;

  • 账户盈亏、持仓、委托和成交支持分交易单元查询;

  • 采用本地数据库对交易单元数据进行本地保存,支持交易单元跨交易日生效

  • 同一进程中支持多交易单元调用

交易单元使用样例

以下样例演示了 TqSdk2 基础接口和交易单元的配合使用场景.

对 TqKq()/TqAccount() 传入 default_trading_unit 来指定/启用后续程序中的默认交易单元操作对象

  • default_trading_unit 传入参数,即代表启用了交易单元,同时后续操作在不额外指定交易单元时,均认为对初始化指定的该交易单元操作

  • 一个进程中可以对多个交易单元进行操作

  • default_trading_unit 目前只支持传入1-99的int类型值,不同的数值代表不同的交易单元

下面我们通过一个简单的例子,看看如何使用交易单元:

from tqsdk2 import TqApi, TqKq, TargetPosTask, TqAuth

# 传入参数 default_trading_unit=1,来启用交易单元,后续操作中不指定交易单元时,都表示对交易单元1进行操作
api = TqApi(TqKq(default_trading_unit=1), auth=TqAuth("信易账户","账户密码"))
quote = api.get_quote("SHFE.rb2109")

# 对快期模拟账户使用交易单元1对rb2109下单,多头调整为3手
target_pos_1 = TargetPosTask(api, "SHFE.rb2109")
target_pos_1.set_target_volume(3)

# 对快期模拟账户使用交易单元2下单对rb2109下单,空头调整为2手
target_pos_2 = TargetPosTask(api, "SHFE.rb2109", trading_unit=2)
target_pos_2.set_target_volume(-2)

# 获取交易单元1的持仓
position_1 = api.get_position("SHFE.rb2109")
# 获取交易单元2的持仓
position_2 = api.get_position("SHFE.rb2109",trading_unit=2)
print(position_2)
while True:
    api.wait_update()
    if position_1.pos == 3 and position_2.pos == -2:
        print(f"交易单元1净仓位为{position_1.pos},交易单元2净仓位为{position_2.pos}")
        break
api.close()

交易单元接口说明

以下接口提供了交易单元的基础操作功能:

  • 天勤账户类
    • TqKq() 快期模拟账户支持

    • TqAccount(),TqCtp(),TqRohon() 实盘账户支持

    • TqSim() 和回测暂不支持交易单元

交易单元平仓原理

  • insert_order,按用户不同交易单元下的今仓和昨仓情况来支持平仓指令,对于不区分平今和平昨交易所的统一按总账户的先平今仓再平昨仓规则来操作

  • TargetposTask,在交易单元下,Position 对象中按交易单元自己有的今仓和昨仓来进行区分,对于不区分平今和平昨指令的交易所,都按有今仓先平今仓,没今仓平老仓的顺序来平仓。

    例如 TargetposTask 交易单元进行平仓时,假设交易单元1有昨仓1手,今仓1手,交易单元2有昨仓3手,今仓2手,总账户是昨仓4手,今仓3手。

    对于不区分平今和平昨指令的交易所,对交易单元2使用 TargetposTask 按offset_priority “今昨,开”进行平仓时先平2手今仓(等于交易单元2的2手今仓)然后再平1手今仓(即交易单元2的1手昨仓)再平2手昨仓(即交易单元2的2手昨仓)

    即可能存在各个交易单元的昨仓、和今仓分别相加不等于总账户对应的昨仓和今仓,但是各个交易单元的总仓位(不区分今昨仓)之和,应该和总账户的仓位一致

交易单元删除操作

交易单元删除功能目前在测试阶段,以私有变量提供,删除之后在第二个交易日生效,示例代码如下:

from tqsdk2 import TqApi, TqKq, TqAuth

# 通过传入default_trading_unit来启用交易单元
api = TqApi(TqKq(default_trading_unit=1), auth=TqAuth("信易账户", "账户密码"))

#  删除交易单元方法目前在测试阶段,以私有变量形式展现,当调用交易单元删除指令后,第二个交易日生效
api._delete_trading_unit()

api.close()

使用注意事项

  • 交易单元只对专业版权限用户开放使用

  • 对交易单元数据的删除操作需要第二日生效。

  • 在使用交易单元时,不要同时对主账户进行交易,否则可能会导致交易单元使用报错

  • 交易单元的历史数据储存在本机,目前暂不支持跨机器读取交易单元信息功能

  • 交易单元的 Account 对象中目前只提供 close_profit 字段,其他字段均为 NaN