For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
Indicator is only beeing used for one stock of the stocklist
-
Hi, I am trying to implement a strategy with bollinger bands, but the indicator is only being applied on the first stock of the datalist. Furthermore it only buys the first stock and ignores the others completely. I would be grateful for some advice
import backtrader as bt import backtrader.feeds as btfeed from datetime import datetime class dataFeed(btfeed.GenericCSVData): params = ( ('dtformat', '%Y-%m-%d %H:%M:%S'), ('datetime', 0), ('open', 1), ('high', 2), ('low', 3), ('close', 4), ('volume', 5), ('openinterest', -1) ) class BollingerBands(bt.Indicator): lines = ('topband', 'botband') params = (('period', 21), ('devfactor', 2.0), ('movav', bt.ind.MovAv.Simple),) plotinfo = dict(subplot=False) def _plotlabel(self): plabels = [self.p.period, self.p.devfactor] plabels += [self.p.movav] * self.p.notdefault('movav') return plabels def __init__(self): bb = bt.ind.BollingerBands( period=self.p.period, devfactor=self.p.devfactor, movav=self.p.movav) class firstStrategy(bt.Strategy): 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 __init__(self): self.dataclose = self.datas[0].close bb = bt.indicators.BollingerBands( period=21, devfactor=2.0, movav=bt.ind.MovAv.Simple) self.lines.topband = bb.top self.lines.botband = bb.bot def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: # Buy/Sell order submitted/accepted to/by broker - Nothing to do return # Check if an order has been completed # Attention: broker could reject order if not enough cash if order.status in [order.Completed]: if order.isbuy(): self.log('BUY EXECUTED, %.2f' % order.executed.price) elif order.issell(): self.log('SELL EXECUTED, %.2f' % order.executed.price) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') # Write down: no pending order #self.order = None def next(self): for d in self.datas: dt, dn = self.datetime.date(), d._name pos = self.getposition(d).size # Simply log the closing price of the series from the reference self.log('Close, %.2f' % d.close[0]) # Check if an order is pending ... if yes, we cannot send a 2nd one #if self.order: # return # Check if we are in the market if self.dataclose[0] < self.lines.botband[0]: # current close less than previous close # if self.dataclose[-1] < self.dataclose[-2]: # previous close less than the previous close # BUY, BUY, BUY!!! (with default parameters) self.log('BUY CREATE, %.2f' % self.dataclose[0]) # Keep track of the created order to avoid a 2nd order self.order = self.buy() # Already in the market ... we might sell if self.dataclose[0] > self.lines.topband[0]: # SELL, SELL, SELL!!! (with all possible default parameters) self.log('SELL CREATE, %.2f' % self.dataclose[0]) # Keep track of the created order to avoid a 2nd order self.order = self.sell() if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() startcash = 10000 # Add a strategy cerebro.addstrategy(firstStrategy) datalist = [("AM.ATVI.csv"), ("AM.MO.csv"), ("AM.GM.csv"), ("AM.CL.csv")] """ , ("AM.FDX.csv"), ("AM.NAKD.csv"), ("AM.NVDA.csv"), ("AM.OCGN.csv"), ("AM.ON.csv") , ("AM.PDD.csv"), ("AM.PLUG.csv"), ("AM.QCOM.csv"), ("AM.MDLZ.csv"), ("AM.ADP.csv") , ("AM.C.csv"), ("AM.AZN.csv"), ("AM.PEP.csv"), ("AM.ORCL.csv"), ("AM.QTT.csv") , ("AM.RUN.csv"), ("AM.SABR.csv"), ("AM.SNDL.csv"), ("AM.TSLA.csv"), ("AM.UAL.csv") , ("AM.UXIN.csv"), ("AM.WEN.csv"), ("AM.WFC.csv"), ("AM.YY.csv"), ("AM.ZNGA.csv") , ("AM.MSFT.csv"), ("AM.AAPL.csv"), ("AM.FB.csv"), ("AM.BABA.csv"), ("AM.TSM.csv") , ("AM.V.csv"), ("AM.JPM.csv"), ("AM.JNJ.csv") , ("AM.PG.csv"), ("AM.BAC.csv"), ("AM.INTC.csv"), ("AM.VZ.csv"), ("AM.NKE.csv") , ("AM.XOM.csv"), ("AM.KO.csv"), ("AM.T.csv"), ("AM.PFE.csv") , ("AM.MRK.csv"), ("AM.MS.csv"), ("AM.AAL.csv"), ("AM.GT.csv"), ("AM.UBER.csv") , ("AM.AMD.csv"), ("AM.PDD.csv"), ("AM.CVX.csv")]""" #the files are located in my python project for i in range(len(datalist)): data = dataFeed(dataname=datalist[i], timeframe=bt.TimeFrame.Minutes, compression=60) cerebro.adddata(data, name=datalist[i]) cerebro.addindicator(BollingerBands) # Set our desired cash start cerebro.broker.setcash(startcash) # Set the commission #cerebro.broker.setcommission(commission=0.0005) # Add a sizer #cerebro.addsizer(bt.sizers.PercentSizer, percents=50) cerebro.run() # Print out the starting conditions print('Starting Portfolio Value: %.2f' % startcash) # Get final portfolio Value portvalue = cerebro.broker.getvalue() pnl = portvalue - startcash # Print out the final result print('Final Portfolio Value: ${}'.format(portvalue)) print('P/L: ${}'.format(pnl)) cerebro.plot(
-
Please do not use a different user name and ask the same question twice. We are all volunteers and you must be patient for an answer.
https://community.backtrader.com/topic/3491/indicator-for-multiple-datafeeds