import backtrader class MA_CrossOver(backtrader.Strategy): '''This is a long-only strategy which operates on a moving average cross Note: - Although the default Buy Logic: - No position is open on the data - The ``fast`` moving averagecrosses over the ``slow`` strategy to the upside. Sell Logic: - A position exists on the data - The ``fast`` moving average crosses over the ``slow`` strategy to the downside Order Execution Type: - Market ''' alias = ('SMA_CrossOver',) params = ( # period for the fast Moving Average ('fast', 24), # period for the slow moving average ('slow', 72), # moving average to use ('_movav', backtrader.ind.MovAv.SMA) ) def __init__(self): sma_fast = self.p._movav(period=self.p.fast) sma_slow = self.p._movav(period=self.p.slow) self.buysig = backtrader.ind.CrossOver(sma_fast, sma_slow) def log(self, txt, dt=None): ''' Logging function fot this strategy''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log('BUY EXECUTED, %.6f' % order.executed.price) elif order.issell(): self.log('SELL EXECUTED, %.6f' % order.executed.price) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') self.order = None def next(self): if self.position.size: if self.buysig < 0: self.sell() elif self.buysig > 0: self.buy()