在处理并行周期时,应确保使用正确的时间戳。一种常见的方法是使用barstate.isfirst和barstate.islast,以确保只在每个周期的第一个或最后一个bar上返回值。以下是一个示例代码,可以在backtrader中使用以避免“parallel period retuning the wrong values”问题:
from backtrader import indicators as btind
class MyIndicator(btind.SMA):
    lines = ('myline',)
    params = (
        ('period', 21),
        ('_movav', False),  # disable automatic moving average calculation
    )
    def next(self):
        self.l.myline[0] = ...  # calculate current value here
        # Only return value for the last bar of each period
        if self.p.get('usebounds', True):
            if not self.p.usebrackets and self.p.usebounds:
                if self.period == 1:  # Return value for every bar
                    self.l.myline[0] = ...  # calculate value for every bar
                    return self.l.myline[0]
                elif self.barperiod > 0:
                    self.barperiod -= 1
                    return
                else:
                    self.barperiod = self.p.period - 1
                    return self.l.myline[0]
        else:
            return self.l.myline[0]
在这个示例中,MyIndicator类继承自backtrader自带的SMA指标,并在next()方法中处理当前值。由于默认情况下,backtrader会在每个bar上自动计算移动平均值,因此应将_movav参数设置为False。如果您只需要每个周期的最后一个bar上计算指标的值,你可以使用barstate.islast来检查当前bar是否是每个周期的最后一个bar。如果是,计算指标值并在该bar上返回该值。如果不是最后一个bar,则返回None。
                    上一篇:并行中嵌套循环不正常运行