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?
-
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()}')
-
@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()}')