Navigation

    Backtrader Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    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

    Indicators/Strategies/Analyzers
    2
    2
    86
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      pythontrader last edited by

      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(
      
      1 Reply Last reply Reply Quote -1
      • run-out
        run-out last edited by

        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

        RunBacktest.com

        1 Reply Last reply Reply Quote 2
        • 1 / 1
        • First post
          Last post
        Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors