Own Indicator to implement : 1 buy signal /0 sell signal. How to implement it ?
-
Hello,
I am new on this forum. I am also new in Python :). I would like to know if it’s possible to add its own indicator ?
Actually, I read different posts on that subject. But I don’t suceed to implement it. Tthe code doesn’t take into account buy or sell signals.
Just below you can read my code :
import pandas as pd import backtrader as bt from backtrader.feeds import PandasData import backtrader.indicators as btind # load dataframe dataframe = pd.read_excel("STOXX50 bis.xlsx",names = ["Datetime","Open","High","Low","Close","Volume","action"]) dataframe['Datetime'] = pd.to_datetime(dataframe['Datetime'],format='%d/%m-/y') class PandasData_Signal(PandasData): # Add a 'action' line to the inherited ones from the base class lines = ('action',) # add the parameter to the parameters inherited from the base class params = (('action', 6),) data = PandasData_Signal(dataname=dataframe, datetime=0, open=1, high=2, low=3, close=4, volume=-1, openinterest=-1, action=6, #openinterest=-1 ) class MLSignal(bt.SignalStrategy): 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): # Keep a reference to the "close" line in the data[0] dataseries self.dataclose = self.datas[0].close self.action = self.datas[0].action self.order = None def next(self): self.log(' Close, %.2f' % self.dataclose[0]) if self.order: return if self.action[0] == 1: self.log('BUY CREATE, %.2f' % self.dataclose[0]) self.order = self.buy() if self.action[0] == 0: self.log('SELL CREATE, %.2f' % self.dataclose[0]) self.order = self.sell() cerebro = bt.Cerebro() # Set our desired cash start cerebro.broker.setcash(100000000.0) cerebro.adddata(data) cerebro.addstrategy(MLSignal) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) print('Final value is %.2f times the initial investment'%(cerebro.broker.getvalue())) cerebro.plot()
Just below, I post you a screenshot from my dataframe :
Just below a screenshot from the pity result...:( There is no buy or sell signal...
Please do not hesitate to help me to understand where the problem is. I really want to know the result from my strategy :)
I wish you a very pleaseant week end,
Best,
Boris
-
-
There is no trace of a single indicator in your code, neither custom nor not-custom. It is therefore 100% unclear what your code and text have to do with indicators.
-
There is a sell signal on the chart, right at the beginning.
-
You have a dataframe with a column called
signal
but you seem to want to act upon a column calledaction
which isn't there.
You probably want to take two steps back, reformat your question, dataframe loading (code formatting, because that code won't execute) and let us know.
-
-
Hi,
Thanks very much for your answer. It works now. I should have been a little bit tired Friday. I made corrections on the indicator.
You were right, There was a mistake on the name of the indicator.
import pandas as pd import backtrader as bt from backtrader.feeds import PandasData import backtrader.indicators as btind # load dataframe dataframe = pd.read_excel("STOXX50 bis.xlsx",names = ["Datetime","Open","High","Low","Close","Volume","signal"]) dataframe['Datetime'] = pd.to_datetime(dataframe['Datetime'],format='%d/%m-/y') class PandasData_Signal(PandasData): # Add a 'action' line to the inherited ones from the base class lines = ('signal',) # add the parameter to the parameters inherited from the base class params = (('signal', 6),) data = PandasData_Signal(dataname=dataframe, datetime=0, open=1, high=2, low=3, close=4, volume=-1, openinterest=-1, signal=6, #openinterest=-1 ) class MLSignal(bt.SignalStrategy): 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): # Keep a reference to the "close" line in the data[0] dataseries self.dataclose = self.datas[0].close self.signal = self.datas[0].signal self.order = None 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, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.buyprice = order.executed.price self.buycomm = order.executed.comm else: # Sell self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') self.order = None def notify_trade(self, trade): if not trade.isclosed: return self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % (trade.pnl, trade.pnlcomm)) def next(self): self.log(' Close, %.2f' % self.dataclose[0]) #Check if we are in the market if not self.position : if self.signal[0] == 1: self.log('BUY CREATE, %.2f' % self.dataclose[0]) #Keep track of the created order to avoid a 2nd order self.order = self.buy() else: #Already in the market...we might sell if self.signal[0] == 0: self.log('SELL CREATE, %.2f' % self.dataclose[0]) self.order = self.sell() cerebro = bt.Cerebro() # Set our desired cash start cerebro.broker.setcash(4000.0) cerebro.adddata(data) cerebro.addstrategy(MLSignal) cerebro.run() print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) print('Final value is %.2f times the initial investment'%(cerebro.broker.getvalue())) cerebro.plot()
I wish you a very nice day,
Best,
Boris