For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

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 :

    0_1555682941994_Capture.PNG

    Just below a screenshot from the pity result...:( There is no buy or sell signal...

    0_1555683029148_Capture2.PNG

    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


  • administrators

    1. 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.

    2. There is a sell signal on the chart, right at the beginning.

    3. You have a dataframe with a column called signal but you seem to want to act upon a column called action 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


Log in to reply
 

});