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/

    Own Indicator to implement : 1 buy signal /0 sell signal. How to implement it ?

    Indicators/Strategies/Analyzers
    2
    3
    1096
    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.
    • M
      Mistigri5 last edited by

      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

      1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators last edited by

        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.

        1 Reply Last reply Reply Quote 1
        • M
          Mistigri5 last edited by Mistigri5

          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

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