在处理并行周期时,应确保使用正确的时间戳。一种常见的方法是使用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。
上一篇:并行中嵌套循环不正常运行