Backtrader Community

    • 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/

    Array index Out of range for Multitimeframe sampling mainly on compression more than 50

    Indicators/Strategies/Analyzers
    1
    2
    257
    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.
    • RamSurya
      RamSurya last edited by

      The following code listed below works perfectly fine when working on resampling till compression value 50 however after 50 I am getting a strange error. Like Array index out of range even after using the Data coupling concept... Kindly help me out with the BUG. After referring through the Main code and strategy code. The same code works well on every time frame less than 50 mins such as 30 mins, 40 mins, etc. Moreover, as I am new to this platform I would like to work with people who are working on crypto, I would love to connect and work together.

      "ERROR":

      Traceback (most recent call last):
        File ".\resampler_main.py", line 102, in <module>
          back = cerebro.run()
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\cerebro.py", line 1127, in run
          runstrat = self.runstrategies(iterstrat)
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\cerebro.py", line 1298, in runstrategies
          self._runnext(runstrats)
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\cerebro.py", line 1630, in _runnext
          strat._next()
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\strategy.py", line 347, in _next
          super(Strategy, self)._next()
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\lineiterator.py", line 263, in _next
          indicator._next()
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\lineiterator.py", line 263, in _next
          indicator._next()
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\lineiterator.py", line 263, in _next
          indicator._next()
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\lineiterator.py", line 282, in _next
          self.nextstart()  # only called for the 1st value
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\indicators\crossover.py", line 41, in nextstart
          self.l.nzd[0] = self.data0[0] - self.data1[0]  # seed value
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\lineseries.py", line 467, in __getitem__
          return self.lines[0][key]
        File "C:\Users\ramsu\Anaconda3\envs\crypto\lib\site-packages\backtrader\linebuffer.py", line 163, in __getitem__
          return self.array[self.idx + ago]
      IndexError: array index out of range
      

      Following is the main code to run the cerebro:

      cerebro = bt.Cerebro()
      
      # adding data for a list of stocks
      for instrument in cryptos:
          df = pd.read_csv(rf"C:\Users\ramsu\ltphd\data\Crypto_data\Backtesting\\{instrument}.csv",
                           index_col=0, parse_dates=True)
          df = df[-10000:]
          # adding the data into the pandas frame
          data = bt.feeds.PandasData(
              dataname=df, timeframe=bt.TimeFrame.Minutes, compression=1)
          # Adding the data
          cerebro.adddata(data, name=instrument)
          # resampling the data
          cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes,
                               compression=60, rightedge=False)
      
      cerebro.addstrategy(long)
      
      cerebro.broker.setcash(100000.0)
      
      cerebro.addsizer(bt.sizers.PercentSizer, percents=5)
      cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name="sharpe")
      cerebro.addanalyzer(bt.analyzers.Returns,     _name="returns")
      cerebro.addanalyzer(bt.analyzers.Transactions, _name="trans")
      cerebro.addwriter(bt.WriterFile, csv=True,
                        out=os.path.realpath('log_file'), rounding=2)
      
      back = cerebro.run()
      
      print(cerebro.broker.getvalue())
      

      Listed below is the simple long strategy test code.

      class long(bt.Strategy):
      
          def __init__(self):
      
              self.crossover = []
              self.fast_emas = []
              self.slow_emas = []
              for index in range(0, len(cryptos)+len(cryptos), 2):
                  self.fast_ema = bt.ind.EMA(self.datas[index].close, period=5)
                  self.slow_ema = bt.ind.EMA(self.datas[index+1].close, period=20)
      
                  self.crossover.append(bt.ind.CrossOver(
                      self.fast_ema, self.slow_ema()))
                  self.fast_emas.append(self.fast_ema)
                  self.slow_emas.append(self.slow_ema())
      
          def next(self):
              for index, value in enumerate(list(range(0, len(cryptos)+len(cryptos), 2))):
                  # print(self.crossover[index])
                  # print(index)
                  if not self.getposition(self.datas[value]).size:
                      # print(self.getposition(self.datas[value]).size)
                      if self.crossover[index] > 0:
                          print(f"Higher time is {self.datas[value+1].datetime.datetime(0)} slowMA is {self.slow_emas[index][0] }\
                          Timeframe is {self.datas[value].datetime.datetime(0)}  LONGMA is {self.fast_emas[index][0]} \
                          Buying at{self.datas[value]._name} instrument at", self.datas[value].close[0])
                          self.buy(data=self.datas[value])
                  elif self.crossover[index] < 0:
                      self.close(data=self.datas[value])
                      print(
                          f"Higher time is {self.datas[value+1].datetime.datetime(0)} slowMA is {self.slow_emas[index][0]} \
                          Timeframe is {self.datas[value].datetime.datetime(0)} LONGMA is {self.fast_emas[index][0]} \
                          Buying at{self.datas[value]._name} instrument at", self.datas[value].close[0])
      
      1 Reply Last reply Reply Quote 0
      • RamSurya
        RamSurya last edited by

        I have resolved the issue sorry for the trouble !!.

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