我写的策略是按vnpy提供的策略样式来编写的。开平仓通过用pos等于0,大于0,小于0的方式来决定开仓,平仓,但是模拟运行以来会不停地重复开仓。这个pos是要收到on_trade的回报才更新,那就是要晚一个bar。所以这样的设计模式是不是有问题。只要发起委托,pos就变为0,这时候开仓就可以交易了,但是下一bar平仓交易可能被撤单,就变成同一个品种多空方向都买进了,这时候pos是怎么算?
大神们有遇到这样的问题吗?有什么好的设计模式?
我写的策略是按vnpy提供的策略样式来编写的。开平仓通过用pos等于0,大于0,小于0的方式来决定开仓,平仓,但是模拟运行以来会不停地重复开仓。这个pos是要收到on_trade的回报才更新,那就是要晚一个bar。所以这样的设计模式是不是有问题。只要发起委托,pos就变为0,这时候开仓就可以交易了,但是下一bar平仓交易可能被撤单,就变成同一个品种多空方向都买进了,这时候pos是怎么算?
大神们有遇到这样的问题吗?有什么好的设计模式?
请贴上代码吧,光是这么描述不知道细节是什么
用Python的交易员 wrote:
请贴上代码吧,光是这么描述不知道细节是什么
谢谢陈总回复,我找到你给的修改方法了:
解决办法是每次下单后,记录委托号:
self.vt_orderids =[]
vt_orderids = self.buy(...)
self.vt_orderids.extend(vt_orde
rids)
if self.vt_orderids:
return
这样在尚未收到委托变化回报之前,都不会
挂新的委托出去。
收到回报再清除:
td_orderid = trade.orderid
if td_orderid in self.vt_orderids:
self.vt_orderids.remove(td_orderid)
这种办法确实好,可以解决开仓只能开一次,稍微修改,又可以控制加仓次数。
但是还是遗留了不能解决手动开平仓后pos和持仓不一致的问题。是不是可以直接通过查询持仓来作为开平仓的条件是不是更安全,谢谢大神。
通过self.pos做判断的话,手动下单后需要自行修改json文件里pos的缓存;
如果一个品种只做一个策略的话,可以试试看