vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 103
声望: 2

实盘中的一个策略,跑了一星期没问题,开仓代码如下。

        #开仓
        if 时间=开仓时间:                       
            if self.pos == 0:
                if bar.close_price > Price[1]:
                    self.buy(bar.close_price, 1)
                    self.f1.write("开仓做多"+"\n")
                if bar.close_price < Price[0]:
                    self.short(bar.close_price, 1)
                    self.f1.write("开仓做空"+"\n")
            elif self.pos > 0:
                if 条件3:
                    self.sell(bar.close_price, 1)
                    self.short(bar.close_price, 1)
                    self.f1.write("平多仓,反手"+"\n")
            else:
                if 条件4:
                    self.cover(bar.close_price, 1)
                    self.buy(bar.close_price, 1)  
                    self.f1.write("平空仓,反手"+"\n")

按理来说,不会出现持仓大于一手的情况的,可是今天我发现竟然有两手持仓,下面是我自己保存的日志

记录开盘价,时间是2019-10-29 09:01:00,价格是.....
平多仓,反手
平空仓,反手
平空仓,反手
开仓做多

执行了两次平空仓,而且有“开仓做多”这个字眼,
这就奇怪了,按理来说只有pos == 0才会执行“开仓做多”这个代码呀。
请问应该从哪里找原因?谢谢。。

Administrator
avatar
加入于:
帖子: 1868
声望: 85

以上逻辑是写在on_bar还是on_tick里面的?

self.pos是在策略收到成交回报后才会更新,如果因为某种原因你的交易接口卡了或者断了,之前发出的委托回来的成交回报没收到,导致self.pos还是0,此时如果on_bar或者on_tick被触发,就会重复发单。

Member
avatar
加入于:
帖子: 103
声望: 2

用Python的交易员 wrote:

以上逻辑是写在on_bar还是on_tick里面的?

self.pos是在策略收到成交回报后才会更新,如果因为某种原因你的交易接口卡了或者断了,之前发出的委托回来的成交回报没收到,导致self.pos还是0,此时如果on_bar或者on_tick被触发,就会重复发单。

是写在on_bar里面的。
1分钟bar的话应该不会存在成交回报没收到的情况吧?

如果是的话,可以利用什么代码来判断吗?

Administrator
avatar
加入于:
帖子: 1868
声望: 85

用的是BitMEX吗?我们之前发现了一个BITMEX的原始TICK时间戳可能乱序的问题,会导致on_bar在短时间内被重复触发

Member
avatar
加入于:
帖子: 103
声望: 2

用Python的交易员 wrote:

用的是BitMEX吗?我们之前发现了一个BITMEX的原始TICK时间戳可能乱序的问题,会导致on_bar在短时间内被重复触发

不是,做的螺纹。
我检查了一下,on_bar开始忘记加cancal all order了,
如果平了仓,反手开仓未成功,的确会导致self.pos == 0重新开仓,但也不会开两手呀

不知是不是这个原因导致的。
我先改一下代码试试。

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