vn.py官网
开源量化社区
Member
avatar
加入于:
帖子: 26
声望: 0

我写的策略是按vnpy提供的策略样式来编写的。开平仓通过用pos等于0,大于0,小于0的方式来决定开仓,平仓,但是模拟运行以来会不停地重复开仓。这个pos是要收到on_trade的回报才更新,那就是要晚一个bar。所以这样的设计模式是不是有问题。只要发起委托,pos就变为0,这时候开仓就可以交易了,但是下一bar平仓交易可能被撤单,就变成同一个品种多空方向都买进了,这时候pos是怎么算?
大神们有遇到这样的问题吗?有什么好的设计模式?

Administrator
avatar
加入于:
帖子: 5108
声望: 296

请贴上代码吧,光是这么描述不知道细节是什么

Member
avatar
加入于:
帖子: 26
声望: 0

用Python的交易员 wrote:

请贴上代码吧,光是这么描述不知道细节是什么

谢谢陈总回复,我找到你给的修改方法了:
解决办法是每次下单后,记录委托号:

写在_init_里

self.vt_orderids =[]

写在on_bar里

vt_orderids = self.buy(...)
self.vt_orderids.extend(vt_orde
rids)

然后每次下单前,加上判断

if self.vt_orderids:
return
这样在尚未收到委托变化回报之前,都不会
挂新的委托出去。
收到回报再清除:
td_orderid = trade.orderid

删掉已经下单的成功的ID

if td_orderid in self.vt_orderids:
self.vt_orderids.remove(td_orderid)

这种办法确实好,可以解决开仓只能开一次,稍微修改,又可以控制加仓次数。
但是还是遗留了不能解决手动开平仓后pos和持仓不一致的问题。是不是可以直接通过查询持仓来作为开平仓的条件是不是更安全,谢谢大神。

Member
avatar
加入于:
帖子: 3164
声望: 185

通过self.pos做判断的话,手动下单后需要自行修改json文件里pos的缓存;
如果一个品种只做一个策略的话,可以试试看

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

沪公网安备 31011502017034号