1. 不同的价差交易策略交易相同的价差会发生什么?
1.1 一般的理解:价差和单边合约一样是一个交易标的
CTA策略的交易标的是一个具体的单边合约。假如我们运行两个CTA策略A和B实例,它们交易的合约都是C。同时运行A和B,那么我们可以发现A和B可以独立地统计各自的持仓,也就是说它们的pos可能是不一样的,不会相互干扰。
而价差交易策略的交易标的是价差。假如我们运行两个价差交易策略SA和SB实例,它们交易的价差都是S1。同时运行SA和SB,SA和SB也应该可以独立地统计各自的持仓,也就是说它们的spread_pos也应该是不一样的,不应该相互干扰。
然而,我们可以发现SA对S1开仓成功后,SB并没有开仓过,可是我们发现SB的spread_pos已经变成和SA的spread_pos相同的数量!
有点迷糊,细想一下,是啊,谁让你交易了相同的价差标的呢?
1.2 不同价差交易策略交易不同名称价差(但是价差的各腿是相同的)
不行就改,咱们按照价差S1的设置再创建一个价差S2,但是给它取一个不同的名称,区别一下!
接下来吧价差交易策略SB的标的该出S2,再次运行价差交易策略SB。
奇怪的现象发生了:SB并没有开仓过,可是SB的spread_pos仍然变成和SA的spread_pos相同的数量!
2. 问题出在哪里?
查看一下委托单:
其中"来源"一栏中的内容为 “SpreadTrading_价差名称”,就是这里过于简单,导致委托单只关联了价差,而没有关联价差交易策略名称,
所以在价差交易的SpreadTradeEngine引擎无法按照价差策略来推送类似委托单order,成交单trade和价差持仓信息等。
价差交易策略一旦发出委托,调用了SpreadStrategyTemplate的start_long_algo()或者start_short_algo(),而这两个函数最终调用了SpreadStrategyEngine的start_algo()
def start_algo(
self,
direction: Direction,
price: float,
volume: float,
payup: int,
interval: int,
lock: bool,
offset: Offset
) -> str:
""""""
if not self.trading:
return ""
algoid: str = self.strategy_engine.start_algo(
self,
self.spread_name, # 这里只有价差名称,没有传递策略名称
direction,
offset,
price,
volume,
payup,
interval,
lock
)
self.algoids.add(algoid)
return algoid
- 从此不知道委托单到底是哪个价差交易策略发出来的了!
- 成交单虽然可以委托单号查询到是哪个委托单,但是1的原因,所以找不到是哪个价差交易策略的成交单了
- 于是成交单只能被被推送到价差
4. 应该怎么解决这个问题?
这里只讨论原则性问题:
- 价差交易策略发出问题时传递价差交易策略名称,而不是价差名称;
- 将改变价差价差交易策略名称写入OrderData的reference字段,建立与价差策略实例的关联;
- SpreadStrategyEngine在收到order,trade时,安照价差策略实例进行order,trade保存、统计和相关持仓计算,包括spread_pos的计算
当然,这样的改动是大了些,可是已经存在目前的问题,修改是必须的!