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/

    Can't acees to the datas for indicators

    General Code/Help
    2
    3
    307
    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.
    • C
      camizulub last edited by camizulub

      Hello I am trying to run and strategy that calculates the indicators in a Hourly data frame but trade in a seconds time frame.

      I got this error:

        File "Alpha2.py", line 214, in <module>
          runstrat()
        File "Alpha2.py", line 184, in runstrat
          cerebro.run(stdstats=False)
        File "/home/milo/anaconda3/lib/python3.6/site-packages/backtrader/cerebro.py", line 1127, in run
          runstrat = self.runstrategies(iterstrat)
        File "/home/milo/anaconda3/lib/python3.6/site-packages/backtrader/cerebro.py", line 1217, in runstrategies
          strat = stratcls(*sargs, **skwargs)
        File "/home/milo/anaconda3/lib/python3.6/site-packages/backtrader/metabase.py", line 88, in __call__
          _obj, args, kwargs = cls.doinit(_obj, *args, **kwargs)
        File "/home/milo/anaconda3/lib/python3.6/site-packages/backtrader/metabase.py", line 78, in doinit
          _obj.__init__(*args, **kwargs)
        File "Alpha2.py", line 34, in __init__
          self.trigger = Alligator()
        File "/home/milo/anaconda3/lib/python3.6/site-packages/backtrader/indicator.py", line 53, in __call__
          return super(MetaIndicator, cls).__call__(*args, **kwargs)
        File "/home/milo/anaconda3/lib/python3.6/site-packages/backtrader/metabase.py", line 88, in __call__
          _obj, args, kwargs = cls.doinit(_obj, *args, **kwargs)
        File "/home/milo/anaconda3/lib/python3.6/site-packages/backtrader/metabase.py", line 78, in do in it _obj.__init__(*args, **kwargs)
        File "Alpha2.py", line 18, in __init__
          self.datamed = (self.datas[1].high + self.datas[1].low) / 2
      IndexError: list index out of range**
      

      Here is the code:

      from __future__ import (absolute_import, division, print_function,
                              unicode_literals)
      import os.path
      import sys  # To find out the script name (in argv[0])
      import argparse
      import datetime
      import backtrader as bt
      import backtrader.feeds as btfeeds
      import backtrader.plot as plt
      import backtrader.indicators as btinds
      
      class Alligator(btinds.PeriodN):
          lines = ('signal1','signal2')
          params = (('lrperiod', 89), ('jaw_wind', 13), ('teeth_wind', 8), ('lips_wind', 5),)
          #params = (('p1',5),('p2',20),('p3',50),)
          
          def __init__(self):
              self.datamed = (self.datas[1].high + self.datas[1].low) / 2
              jaw = bt.indicators.SmoothedMovingAverage(self.datamed, period=self.params.jaw_wind, plotname='Jaw')(8)
              teeth = bt.indicators.SmoothedMovingAverage(self.datamed, period=self.params.teeth_wind, plotname='Lips')(5)
              lips = bt.indicators.SmoothedMovingAverage(self.datamed, period=self.params.lips_wind, plotname='Teeth')(3)
              self.lines.signal1 = (lips - teeth)  #Buy
              self.lines.signal2 = (teeth - jaw) #Buy
      
      class St(bt.Strategy):
      
          def log(self, txt, dt=None):
              ''' Logging function for this strategy'''
              dt = dt or self.data0.datetime.datetime(0)
              print('%s, %s' % (dt.isoformat(), txt))
              print(list(enumerate(self.datas)))
              
          def __init__(self):
              self.trigger = Alligator()
              self.spread = btinds.AverageTrueRange(period=20)
      
              
          def notify_order(self, order):
              print('{}: Order ref: {} / Type {} / Status {}'.format(
                  self.data.datetime.datetime(0),
                  order.ref, 'Buy' * order.isbuy() or 'Sell',
                  order.getstatusname()))
              
              if order.status in [order.Submitted, order.Accepted]:
                  return
              
              if order.status in [order.Completed]:
                  if order.isbuy():
                      self.log(
                          'BUY EXECUTED, Ref: %d, Price: %.5f, Cost: %.5f' %
                          (order.ref,order.executed.price,
                           order.executed.value))
                      
                      self.buyprice = order.executed.price
                      
                  else:  # Sell
                      self.log('SELL EXECUTED, Ref: %d,Price: %.5f, Cost: %.5f' %
                               (order.ref,order.executed.price,
                                order.executed.value))
              
                  self.bar_executed = len(self)
                  
              elif order.status in [order.Canceled, order.Margin, order.Rejected]:
                  self.log('Order Canceled/Margin/Rejected')
              
              if not order.alive() and order.ref in self.orefs:
                  self.orefs.remove(order.ref)
              
          def notify_trade(self, trade):
              if not trade.isclosed:
                  return
      
              self.log('OPERATION PROFIT, GROSS %.5f, NET %.5f' %
                       (trade.pnl, trade.pnlcomm))
              
          def next(self):
              txt = ','.join(
                  ['%04d' % len(self.data0),
                   self.data0.datetime.datetime(0).isoformat(),
                   'Open : %.5f' % self.data0.open[0],
                   'High : %.5f' % self.data.high[0],
                   'Low : %.5f' % self.data.low[0],
                   'Close : %.5f' % self.data.close[0]]) 
              print(txt)
      
              if (self.trigger.signal1[0] < 0) and (self.trigger.signal2[0] < 0):
                   o1 = self.sell(exectype = bt.Order.Limit,price=self.data.close[-1],
                                  transmit=False,valid=datetime.datetime.now()+datetime.timedelta(hours=1))
                   
                   print(self.datetime.datetime(0),' : Oref %d / Sell at %.5f' % (
                              o1.ref, self.data.close[-1]))
                  
                   o2 = self.buy(exectype=bt.Order.Limit,price=(self.data.close[-1] - self.spread.atr[0] * 2),
                                  parent=o1,transmit=False)
                   
                   print(self.datetime.datetime(0),' : Oref %d / Sell Take Profit at %.5f' % (
                              o2.ref, (self.data.close[-1] - self.spread.atr[0] * 2)))
                   
                   o3 = self.buy(exectype=bt.Order.Stop,price = (self.spread.atr[0] * 2 +self.data.close[-1]),
                                 parent=o1,transmit = True)
                   
                   print(self.datetime.datetime(0),' : Oref %d / Sell Stop Loss at %.5f' % (
                              o3.ref, (self.spread.atr[0] * 2 +self.data.close[-1])))
                   
                   self.orefs = [o1.ref, o2.ref, o3.ref]
                   
              elif (self.trigger.signal1[0] > 0) and (self.trigger.signal2[0] > 0):
                   o1 = self.buy(exectype = bt.Order.Limit,price=self.data.close[-1],
                                  transmit=False,valid= datetime.datetime.now()+datetime.timedelta(hours=1))
                   
                   print(self.datetime.datetime(0),' : Oref %d / Buy at %.5f' % (
                              o1.ref, self.data.close[-1]))
                  
                   o2 = self.sell(exectype=bt.Order.Limit,price=(self.spread.atr[0] * 2 +self.data.close[-1]),
                                  parent=o1,transmit=False)
                   
                   print(self.datetime.datetime(0),' : Oref %d / Buy Take Profit at %.5f' % (
                              o2.ref, (self.spread.atr[0] * 2 +self.data.close[-1])))
                   
                   o3 = self.sell(exectype=bt.Order.Stop,price = (self.data.close[-1] - self.spread.atr[0] * 2),
                                 parent=o1,transmit = True)
                   
                   print(self.datetime.datetime(0),' : Oref %d / Buy Stop Loss at %.5f' % (
                              o3.ref, (self.data.close[-1] - self.spread.atr[0] * 2))) 
                   
                   self.orefs = [o1.ref, o2.ref, o3.ref]
              
              else:
                   return
                        
      def runstrat():
      
          cerebro = bt.Cerebro()
          modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
          datapath0 = os.path.join(modpath, '/home/milo/Documents/Data/BT_EURUSD.csv')
          datapath1 = os.path.join(modpath, '/home/milo/Documents/Data/BT_EURUSDH.csv')
      
          data0 = btfeeds.GenericCSVData(dataname=datapath0,
                                         timeframe=bt.TimeFrame.Seconds,                                  
                                        nullvalue=0.0,
                                        dtformat=('%Y-%m-%d %H:%M:%S'),
                                        datetime=0,
                                        open=1,
                                        high=2,
                                        low=3,
                                        close=4,
                                        volume=-1,
                                        openinterest=-1)
      
          data1 = btfeeds.GenericCSVData(dataname=datapath1,
                                         timeframe=bt.TimeFrame.Minutes,                                  
                                        nullvalue=0.0,
                                        dtformat=('%Y-%m-%d %H:%M:%S'),
                                        datetime=0,
                                        open=1,
                                        high=2,
                                        low=3,
                                        close=4,
                                        volume=-1,
                                        openinterest=-1)
      
          cerebro.adddata(data0,name ="Seconds Data")
          cerebro.adddata(data1,name ="Hourly Data")
      
      if __name__ == '__main__':
          runstrat()
      
      1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators last edited by

        The code is unreadable ... pleas see the top of the forum.

        1 Reply Last reply Reply Quote 0
        • C
          camizulub last edited by

          Done.

          Solution : It gets the datasx if I move the indicators into the init of the class (strategy). I am trying to do a Data Replay, calculating the indicators in a higher Time Frame but trading in the close of the smallest time frame.

          Is this the right approach?

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