VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 38
声望: 1

根据文档,下单的时候有个net参数可以设置净仓下单模式,多数情况下是正常的,但是偶尔(概率并不小)仍然会出现锁仓的情况。
比如当前的pos是1,
调用self.sell(order_price, 2, net=True)
大概率是会先平1手多仓,然后再开1手空仓。
但是有一定概率会直接开2手空仓,造成有1手锁仓的问题。

反之当前pos是-1的时候,
调用self.buy(order_price, 2, net=True)
大概率是会先平1手空仓,然后再开1手多仓。
但是有一定概率会直接开2手多仓,造成有1手锁仓的问题。

出问题的概率只是相对低,实际并不低,
我对接simnow,写了个run.py,同时开启所有主力合约。
过1天,就有一大堆锁仓的。

每次下单之前我都会调用self.cancel_all(),所以实际伪代码类似下面这种:

self.cancel_all()
self.buy(order_price, self.target_pos-self.pos, net=True)

因为有可能上次报单价格没有成交,所以会先撤单,再重新下单。
我猜可能是由于撤单和成交回报不同步导致的vnpy对仓位的判断错误而导致的净仓转换的问题。

请问这种要怎么解决呢?

Member
avatar
加入于:
帖子: 38
声望: 1

原来CTA还有个TargetPosTemplate模板,文档里都没提到这个。先试试用这个模板会不会锁仓
果然文档只是参考,要弄明白还得看框架的源码啊。

Member
avatar
加入于:
帖子: 1468
声望: 105

havenonetosay wrote:

根据文档,下单的时候有个net参数可以设置净仓下单模式,多数情况下是正常的,但是偶尔(概率并不小)仍然会出现锁仓的情况。
比如当前的pos是1,
调用self.sell(order_price, 2, net=True)
大概率是会先平1手多仓,然后再开1手空仓。
但是有一定概率会直接开2手空仓,造成有1手锁仓的问题。

反之当前pos是-1的时候,
调用self.buy(order_price, 2, net=True)
大概率是会先平1手空仓,然后再开1手多仓。
但是有一定概率会直接开2手多仓,造成有1手锁仓的问题。

出问题的概率只是相对低,实际并不低,
我对接simnow,写了个run.py,同时开启所有主力合约。
过1天,就有一大堆锁仓的。

每次下单之前我都会调用self.cancel_all(),所以实际伪代码类似下面这种:

self.cancel_all()
self.buy(order_price, self.target_pos-self.pos, net=True)

因为有可能上次报单价格没有成交,所以会先撤单,再重新下单。
我猜可能是由于撤单和成交回报不同步导致的vnpy对仓位的判断错误而导致的净仓转换的问题。

请问这种要怎么解决呢?

出现这种情况的原因,大概率是还有活动委托的撤单回报尚未收到。

底层OffsetConverter组件对于开平的转换,是基于仓位的【可用】数量进行的,所以如果之前已经挂出的委托撤单后,回报尚未收到的情况下(即冻结部分没有解锁),此时反向委托就会造成开仓。

TargetPosTemplate内部实现了一个简单的交易状态机,必须没有在途委托时才允许重下,所以不会有这个问题。

Member
avatar
加入于:
帖子: 38
声望: 1

MTF wrote:

havenonetosay wrote:

根据文档,下单的时候有个net参数可以设置净仓下单模式,多数情况下是正常的,但是偶尔(概率并不小)仍然会出现锁仓的情况。
比如当前的pos是1,
调用self.sell(order_price, 2, net=True)
大概率是会先平1手多仓,然后再开1手空仓。
但是有一定概率会直接开2手空仓,造成有1手锁仓的问题。

反之当前pos是-1的时候,
调用self.buy(order_price, 2, net=True)
大概率是会先平1手空仓,然后再开1手多仓。
但是有一定概率会直接开2手多仓,造成有1手锁仓的问题。

出问题的概率只是相对低,实际并不低,
我对接simnow,写了个run.py,同时开启所有主力合约。
过1天,就有一大堆锁仓的。

每次下单之前我都会调用self.cancel_all(),所以实际伪代码类似下面这种:

self.cancel_all()
self.buy(order_price, self.target_pos-self.pos, net=True)

因为有可能上次报单价格没有成交,所以会先撤单,再重新下单。
我猜可能是由于撤单和成交回报不同步导致的vnpy对仓位的判断错误而导致的净仓转换的问题。

请问这种要怎么解决呢?

出现这种情况的原因,大概率是还有活动委托的撤单回报尚未收到。

底层OffsetConverter组件对于开平的转换,是基于仓位的【可用】数量进行的,所以如果之前已经挂出的委托撤单后,回报尚未收到的情况下(即冻结部分没有解锁),此时反向委托就会造成开仓。

TargetPosTemplate内部实现了一个简单的交易状态机,必须没有在途委托时才允许重下,所以不会有这个问题。

我刚开始对于TargetPosTemplate里面反手的时候“先平后不开”的操作不理解,现在明白了为什么要等下次再开仓了,就是为了确保报单成交或者确认撤回以后再开。

Member
avatar
加入于:
帖子: 1468
声望: 105

是的

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】