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

回测boll_channel_strategy.py 这个demo策略 , 且在开平仓处打印日志:
enter image description here
部分日志结果:
平空 2019-07-11 20:30:00 11619.0
平空 2019-07-11 20:45:00 11586.5
平空 2019-07-11 21:00:00 11680.0
平空 2019-07-11 21:15:00 11665.5
平空 2019-07-11 21:30:00 11633.0
平空 2019-07-11 21:45:00 11649.0
平空 2019-07-11 22:00:00 11700.5
平空 2019-07-11 22:15:00 11678.5
开多 2019-07-11 22:30:00 11786.5
开多 2019-07-11 22:45:00 11775.0
开多 2019-07-11 23:00:00 11775.5
开多 2019-07-11 23:15:00 11743.5
开空 2019-07-11 23:30:00 11680.0
开空 2019-07-11 23:45:00 11532.0
enter image description here

日志打印出的7月11日有很多次开平仓操作, 但是 实际委托记录上只有1条, 实在弄不明白是什么原因,请大神不吝赐教!

Administrator
avatar
加入于:
帖子: 3588
声望: 190

因为可能是你之前挂了很多委托没有撤单,然后在7月11日被一次性触发了

Member
avatar
加入于:
帖子: 47
声望: 1
    def on_15min_bar(self, bar: BarData):
        """"""
        self.cancel_all()
        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return

但是我有执行 self.cancel_all() 方法进行撤单操作! 为什么没有撤单成功呢?

Administrator
avatar
加入于:
帖子: 3588
声望: 190

你是不是下单逻辑写在on_bar或者其他更小的时间周期里了

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

on_tick() 和 on_bar() 都没写逻辑 ,下单逻辑都是写在 on_15min_bar()中的

    def on_tick(self, tick: TickData):
        """
        Callback of new tick data update.
        """
        self.bg.update_tick(tick)

    def on_bar(self, bar: BarData):
        """
        Callback of new bar data update.
        """
        self.bg.update_bar(bar)

    def on_15min_bar(self, bar: BarData):
        """"""
        self.cancel_all()

        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return

        self.boll_up, self.boll_down = am.boll(self.boll_window, self.boll_dev)
        self.cci_value = am.cci(self.cci_window)
        self.atr_value = am.atr(self.atr_window)

        if self.pos == 0:
            self.intra_trade_high = bar.high_price
            self.intra_trade_low = bar.low_price
            if self.cci_value > 0:
                print("开多", bar.datetime, bar.close_price)
                self.buy(self.boll_up, self.fixed_size, True)
            elif self.cci_value < 0:
                print("开空", bar.datetime, bar.close_price)
                self.short(self.boll_down, self.fixed_size, True)
        elif self.pos > 0:
Administrator
avatar
加入于:
帖子: 3588
声望: 190

哦哦,你这是用在比特币上对吧,有些交易所的API不是非常稳定,可能因为用户请求太多或者网络抖动,导致一段时间内的请求失败,所以要写更细致的委托控制(基于on_order收到的回报检查是否全都撤单成功)

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

是的 ,用在bitmex btc合约上的, 但是我只是本地回测,这个也跟api不稳定有关吗?

Administrator
avatar
加入于:
帖子: 3588
声望: 190

回测跟服务器环境无关了,请再提供下你输出的代码部分,上面贴的图看不到

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

我 换了一个图片地址
enter image description here
部分日志结果:
平空 2019-07-11 20:30:00 11619.0
平空 2019-07-11 20:45:00 11586.5
平空 2019-07-11 21:00:00 11680.0
平空 2019-07-11 21:15:00 11665.5
平空 2019-07-11 21:30:00 11633.0
平空 2019-07-11 21:45:00 11649.0
平空 2019-07-11 22:00:00 11700.5
平空 2019-07-11 22:15:00 11678.5
开多 2019-07-11 22:30:00 11786.5
开多 2019-07-11 22:45:00 11775.0
开多 2019-07-11 23:00:00 11775.5
开多 2019-07-11 23:15:00 11743.5
开空 2019-07-11 23:30:00 11680.0
开空 2019-07-11 23:45:00 11532.0
enter image description here

日志打印出的7月11日有很多次开平仓操作, 但是 实际委托记录上只有1条, 实在弄不明白是什么原因,请大神不吝赐教!

Administrator
avatar
加入于:
帖子: 3588
声望: 190

不要贴有道笔记的链接,别人看不到的

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

图片地址已更新

Administrator
avatar
加入于:
帖子: 3588
声望: 190

委托第三个参数stop,你填的都是True,这种情况下发出的委托都是停止单,触发价格没碰到的情况下,是不会真正执行交易的,也就不会记录限价单委托数据,而下一轮撤单后又再下了新的停止单。

这个是正常的策略运行逻辑,或者你可以缓存之前停止单的委托记录,如果已经下了同样价格的,就不再撤单重复下,只是代码写起来会复杂很多。

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