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/

    TA-LIB expecting numpy array?

    General Code/Help
    1
    2
    250
    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.
    • V
      Vypy1 last edited by

      Hey, in the docs of Ta-Lib on BT it is mentioned that BT manages the conversion of the input of ndarray in the background but I get an error when I execute the below code which says:

      TypeError: Argument 'open' has incorrect type (expected numpy.ndarray, got LineBuffer)
      

      Not sure why I have passed in arguments similar to what are mentioned in code samples on Ta-Lib reference on bt.

      # Bracket order
      
      import datetime
      import backtrader as bt
      
      
      class St(bt.Strategy):
          params = dict(
              ma=bt.ind.SMA,
              p1=20,
              p2=50,
              stop = 0.98,
              tgt = 1.05   
          )
      
          def __init__(self):
              self.dataclose = self.datas[0].close
      #         self.dataopen = self.datas[0].open
      #         self.datahigh = self.datas[0].high
      #         self.datalow = self.datas[0].low
              ma1 = self.p.ma(period=self.p.p1)
              ma2 = self.p.ma(period=self.p.p2)
              self.cross = bt.ind.CrossOver(ma1, ma2)
              self.engulf = ta.CDLENGULFING(self.data.open, self.data.high, self.data.low, self.data.close)
      
              self.orefs = list()
              print(f'Order Numbers are : {self.orefs}')
              self.execprice = None
              
      
          def log(self, txt, dt=None):
              dt = self.datas[0].datetime.date()
              print(f'{dt}: {txt}')
          
                  
          def notify_order(self, order):
              print(f'{self.data.datetime.date()}: Close: {self.dataclose[0]}, Order ref: {order.ref} / Type {"Buy" * order.isbuy() or "Sell"} / Status {order.getstatusname()}')
              
           
              if order.status == order.Completed:
                  self.execprice = order.executed.price
                  self.log(f'Executed price: {self.execprice}')
      
      
              if not order.alive() and order.ref in self.orefs:
                  self.orefs.remove(order.ref)
                  print(f'Order Numbers are {self.orefs}')
                  
      
          def next(self):
              self.log(f'Close: {self.dataclose[0]}')
              
              if self.orefs:
                  return  # pending orders do nothing
      
              if not self.position:
                  
                  if (self.ma1[0] > self.ma2[0]) and (self.engulf[0] == 100):  # crossing up
      
                      p1 = self.data.open[1]
                      p2 = self.p.stop * self.data.open[1] # Stop and Tgt prices should be set from the executed price 
                      p3 = self.p.tgt * self.data.open[1] # not the submitted price     
      
                  
                      os = self.buy_bracket(price=p1, stopprice=p2, limitprice=p3, exectype = bt.Order.Market)
                      self.log(f'Buy at {p1}, Stop sell at {p2}, Tgt sell at {p3}')
                      
      
                      self.orefs = [o.ref for o in os]
                      print(f'Order Numbers are : {self.orefs}')     
      
      
      
      cerebro = bt.Cerebro()
      cerebro.broker.set_cash(100000)
      print(f'Cash Available: {cerebro.broker.get_cash()}')
      
      data = bt.feeds.PandasData(dataname=hdfc, datetime=None, open=-1, high=-1, low=-1, close=-1, volume=-1)
      cerebro.adddata(data)
      cerebro.addsizer(bt.sizers.FixedSize, stake = 50)
      cerebro.addstrategy(St)
      cerebro.run()
      
      print(f'Final Value: {cerebro.broker.get_cash()}')
      
      V 1 Reply Last reply Reply Quote 0
      • V
        Vypy1 @Vypy1 last edited by

        @vypy1 Was able to fix this.

        For anyones future reference.

        # Bracket order
        
        import datetime
        import backtrader as bt
        
        
        class St(bt.Strategy):
            params = dict(
                ma=bt.ind.SMA,
                p1=20,
                p2=50,
                stop = 0.98,
                tgt = 1.05   
            )
        
            def __init__(self):
                self.dataclose = self.datas[0].close
        #         self.dataopen = self.datas[0].open
        #         self.datahigh = self.datas[0].high
        #         self.datalow = self.datas[0].low
                self.ma1 = bt.indicators.SMA(period=self.p.p1)
                self.ma2 = bt.indicators.SMA(period=self.p.p2)
                self.cross = bt.ind.CrossOver(self.ma1, self.ma2)
                self.engulf = bt.talib.CDLENGULFING(self.data.open, self.data.high, self.data.low, self.data.close)
        
                self.orefs = list()
                print(f'Order Numbers are : {self.orefs}')
                self.execprice = None
                
        
            def log(self, txt, dt=None):
                dt = self.datas[0].datetime.date()
                print(f'{dt}: {txt}')
            
                    
            def notify_order(self, order):
                print(f'{self.data.datetime.date()}: Close: {self.dataclose[0]}, Order ref: {order.ref} / Type {"Buy" * order.isbuy() or "Sell"} / Status {order.getstatusname()}')
                
             
                if order.status == order.Completed:
                    self.execprice = order.executed.price
                    self.log(f'Executed price: {self.execprice}')
        
        
                if not order.alive() and order.ref in self.orefs:
                    self.orefs.remove(order.ref)
                    print(f'Order Numbers are {self.orefs}')
                    
        
            def next(self):
                self.log(f'Close: {self.dataclose[0]}')
                
                if self.orefs:
                    return  # pending orders do nothing
        
                if not self.position:
                    
                    if (self.ma1[0] > self.ma2[0]) and (self.engulf[0] == 100):  # crossing up
        
                        p1 = self.data.open[1]
                        p2 = self.p.stop * self.data.open[1] # Stop and Tgt prices should be set from the executed price 
                        p3 = self.p.tgt * self.data.open[1] # not the submitted price     
        
                    
                        os = self.buy_bracket(price=p1, stopprice=p2, limitprice=p3, exectype = bt.Order.Market)
                        self.log(f'Buy at {p1}, Stop sell at {p2}, Tgt sell at {p3}')
                        
        
                        self.orefs = [o.ref for o in os]
                        print(f'Order Numbers are : {self.orefs}')     
        
        
        
        cerebro = bt.Cerebro()
        cerebro.broker.set_cash(100000)
        print(f'Cash Available: {cerebro.broker.get_cash()}')
        
        data = bt.feeds.PandasData(dataname=hdfc, datetime=None, open=-1, high=-1, low=-1, close=-1, volume=-1)
        cerebro.adddata(data)
        cerebro.addsizer(bt.sizers.FixedSize, stake = 50)
        cerebro.addstrategy(St)
        cerebro.run()
        
        print(f'Final Value: {cerebro.broker.get_cash()}')
        
        1 Reply Last reply Reply Quote 0
        • 1 / 1
        • First post
          Last post
        Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors