backtrader本身在回测结束前是不会把持仓全部平仓,所以,就需要我们自己判断什么时候是最后一个K线,在最后一个K线前发出全部平仓命令,以使程序在最后的一条K线执行平仓,从而完成一个完美的回测过程。

目的是在回测结束前把所有仓位都平仓掉。

网络上有的使用调用未来数据data[2]来引发错误来实现。实际测试中,此方案无效。

经过一番研究与测试,得出以下结果:

1、可以使用buflen()来取得总共有多少条K线bar。

2、在每次next中,datas中都包括从一开始到当前的所有数据,这样就可以通过len()来获取当前执行到第几个(K线)bar了。

3、可以通过1、2两项的数据进行对比,就可以知道执行到第几条K线bar了。这样我们就可以提前发出全部平仓指令。

代码如下:

def next(self):
    # 判断bar是否结束
    if self.is_bar_stop(self.datas[0]):
        return

# 判断历史数据是不是结束了.结束则平仓所有持仓
def is_bar_stop(self, data):
    if len(data) >= data.buflen() - 2:
        if self.getposition(data).size != 0:
            self.close(data)
            print("------ bar ends ------")
        return True
    else:
        return False