tqsdk.algorithm - 算法模块

tqsdk.algorithm.twap - Twap 算法

class tqsdk.algorithm.twap.Twap(api: tqsdk.api.TqApi, symbol: str, direction: str, offset: str, volume: int, duration: float, min_volume_each_order: int, max_volume_each_order: int, account: Optional[Union[tqsdk.account.TqAccount, tqsdk.account.TqKq, tqsdk.sim.TqSim]] = None)

天勤算法 - Twap

Twap 算法实现了在设定的交易时间段内,完成设定的下单手数。

构造 Twap 类的实例,该算法实例就会开始运行,根据以下逻辑下单:

  1. 将用户设置的总手数,拆分为一个随机手数列表,列表的值即为每次下单的手数,列表元素之和为总下单手数,同时每次下单手数也符合用户设置的每次下单手数的上下限;

  2. 将总的交易时间段拆分为随机时间间隔列表,列表的值即为每次下单的时间间隔,这些时间间隔相加应该等于总的下单时间;

  3. 每一次下单,在两个列表中分别取出下单手数、下单预计完成的时间,先用跟盘价下单,在当前时间间隔已经过去 2/3 或者只剩下 2s 时,主动撤掉未成交单,用对手价下单剩余手数;

  4. 在当前时间段已结束并且下单手数全部成交完,会开始下一次下单,重复第 3 步。

基于以上逻辑,用户参数应该满足:

  1. 总的下单手数 >= 单次委托单最大下单手数

  2. 平均每次下单时间 = duration / 下单次数 > 3s

其中,下单次数 = 总的下单手数 / 平均每次下单手数 = 总的下单手数 / ((单次委托单最小下单手数 + 单次委托单最大下单手数) / 2)

注意

时间段 duration,以 s 为单位,时长可以跨非交易时间段,但是不可以跨交易日。

比如,SHFE.cu2101 的白盘交易时间段为 ["09:00:00" ~ "10:15:00"], ["10:30:00", "11:30:00"], ["13:30:00", "15:00:00"],duration 设置为 1200 (20分钟)。

如果当前行情时间是 2020-09-15 09:10:00,那么下单的时间应该在 2020-09-15 09:10:00 ~ 2020-09-15 09:30:00; 如果当前行情时间是 2020-09-15 10:10:00,那么下单的时间应该在 2020-09-15 10:10:00 ~ 2020-09-15 10:15:00,以及 2020-09-15 10:30:00 ~ 2020-09-15 10:45:00。

本模块不支持在回测中使用。

创建 Twap 实例

Args:

api (TqApi): TqApi实例,该task依托于指定api下单/撤单

symbol (str): 拟下单的合约symbol, 格式为 交易所代码.合约代码, 例如 "SHFE.cu1801"

direction (str): "BUY" 或 "SELL"

offset (str): "OPEN", "CLOSE","CLOSETODAY"

volume (int): 需要下单的总手数

duration (int): 算法执行的时长,以秒为单位,时长可以跨非交易时间段,但是不可以跨交易日 * 设置为 60*10, 可以是 10:10~10:15 + 10:30~10:35

min_volume_each_order (int):单笔最小委托单,每笔委托单数默认在最小和最大值中产生

max_volume_each_order (int):单笔最大委托单,每笔委托单数默认在最小和最大值中产生

account (TqAccount/TqKq/TqSim): [可选]指定发送下单指令的账户实例, 多账户模式下,该参数必须指定

Example:

from tqsdk import TqApi
from tqsdk.algorithm import Twap

api = TqApi(auth="信易账户,用户密码")
# 设置twap任务参数
target_twap = Twap(api,"SHFE.rb2012","BUY","OPEN",500,300,10,25)
# 启动循环
while True:
  api.wait_update()
  if target_twap.is_finished():
      break
api.close()
cancel()

取消当前 Twap 算法实例,会将该实例已经发出但还是未成交的委托单撤单。

Example:

from tqsdk import TqApi
from tqsdk.algorithm import Twap

api = TqApi(auth="信易账户,用户密码")
# 设置twap任务参数
quote = api.get_quote("SHFE.rb2012")
target_twap = Twap(api,"SHFE.rb2012","BUY","OPEN",500,300,10,25)
api.wait_update()
# 运行代码。。。
target_twap.cancel()
while True:
  api.wait_update()
  if target_twap.is_finished():
      break
api.close()
is_finished()

返回当前 Twap 算法实例是否已经结束。

Returns:

bool: 当前 Twap 算法实例是否已经结束