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/

    Track Signal name in plot and output data

    General Discussion
    2
    7
    615
    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.
    • P
      param.jeet last edited by

      I am using signal names to identify signals but not to track these names. The naming convention helps to track signals and I also would like to plot this name along with green and red arrows in plot. Is it possible to add signal name in plot? If yes, How?

      from future import (absolute_import, division, print_function,
      unicode_literals)

      import datetime # For datetime objects
      import os.path # To manage paths
      import sys # To find out the script name (in argv[0])

      Import the backtrader platform

      import backtrader as bt

      Create a Stratey

      class TestStrategy(bt.Strategy):

      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
      
          # To keep track of pending orders
          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, %.2f' % order.executed.price)
              elif order.issell():
                  self.log('SELL EXECUTED, %.2f' % order.executed.price)
      
              self.bar_executed = len(self)
      
          elif order.status in [order.Canceled, order.Margin, order.Rejected]:
              self.log('Order Canceled/Margin/Rejected')
      
          # Write down: no pending order
          self.order = None
      
      def next(self):
          # Simply log the closing price of the series from the reference
          self.log('Close, %.2f' % self.dataclose[0])
      
          # Check if an order is pending ... if yes, we cannot send a 2nd one
          if self.order:
              return
      
          # Check if we are in the market
          if not self.position:
      
              # Not yet ... we MIGHT BUY if ...
              if self.dataclose[0] < self.dataclose[-1]:
                      # current close less than previous close
      
                      if self.dataclose[-1] < self.dataclose[-2]:
                          # previous close less than the previous close
      
                          # BUY, BUY, BUY!!! (with default parameters)
                          self.log('BUY CREATE, %.2f' % self.dataclose[0])
      
                          # Keep track of the created order to avoid a 2nd order
                          longentry = self.buy()
                          longentry.addinfo(name='Long_E')
      
          else:
      
              # Already in the market ... we might sell
              if len(self) >= (self.bar_executed + 5):
                  # SELL, SELL, SELL!!! (with all possible default parameters)
                  self.log('SELL CREATE, %.2f' % self.dataclose[0])
      
                  # Keep track of the created order to avoid a 2nd order
                  shortentry = self.sell()
                  shortentry.addinfo(name='Short_E')
                  print(shortentry.info)
      

      if name == 'main':
      # Create a cerebro entity
      cerebro = bt.Cerebro()

      # Add a strategy
      cerebro.addstrategy(TestStrategy)
      
      # Datas are in a subfolder of the samples. Need to find where the script is
      # because it could have been called from anywhere
      modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
      datapath = os.path.join(modpath, 'D:/Projects-Global-Logic/RGEI/Documents/FCPO3-OHLCV.csv')
      
      # Create a Data Feed
      data = bt.feeds.YahooFinanceCSVData(
          dataname=datapath,
          # Do not pass values before this date
          fromdate=datetime.datetime(2000, 1, 1),
          # Do not pass values before this date
          todate=datetime.datetime(2010, 12, 31),
          # Do not pass values after this date
          reverse=False)
      
      # Add the Data Feed to Cerebro
      cerebro.adddata(data)
      
      # Set our desired cash start
      cerebro.broker.setcash(100000.0)
      
      # Print out the starting conditions
      print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
      tradehistory=True
      # Run over everything
      cerebro.run(stdstats=True)
      
      # Print out the final result
      print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
      cerebro.plot(style='candle')
      

      0_1557129920747_aae27249-266f-43dc-9dc6-767e2431b055-image.png

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

        For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
        
        P 1 Reply Last reply Reply Quote 0
        • B
          backtrader administrators @param.jeet last edited by

          @param-jeet said in Track Signal name in plot and output data:

          Is it possible to add signal name in plot?

          No. Only in the legend.

          1 Reply Last reply Reply Quote 0
          • P
            param.jeet @backtrader last edited by

            @backtrader

            Say, I have 5 entry and 5 corresponding exit signals (Green and red Arrow in plot) using different logics. I want to track every green arrow i.e. every buy signal is triggered by one particular logic and so on. Adding name in legend will not solve my purpose as it does not clarify signals by looking at the green arrow. I can only distinguish green arrows if I have the names on top of these green arrows?

            Another, Is it possible to track these signal names in some variable so that I can use these signal names to calculate return signal i.e. logic wise.

            What does .addinfo() do?

            I was assuming this would solve my purpose but it didn't.

            B 1 Reply Last reply Reply Quote 0
            • B
              backtrader administrators @param.jeet last edited by backtrader

              @param-jeet said in Track Signal name in plot and output data:

              as it does not clarify signals by looking at the green arrow

              The green arrow is there for those who have failed this city and not to identify trades and signals.

              @param-jeet said in Track Signal name in plot and output data:

              What does .addinfo() do?
              I was assuming this would solve my purpose but it didn't.

              It's difficult to know how something could solve your problem unless you explain/show how you tried to solve your problem and what failed.

              Your actual problem is being fixed on looking at the chart. Problem which backtrader cannot solve for you. Your options:

              • Write a BuySellObserver which tracks specific orders with specific information added with addinfo Docs - Orders

              • Use tradeid in buy/sell and track the trades in notify_trade. See

                • Docs - Strategy
                • Docs - Trade
                • Blog - Multitrades
              P 1 Reply Last reply Reply Quote 0
              • P
                param.jeet @backtrader last edited by

                @backtrader said in Track Signal name in plot and output data:

                It's difficult to know how something could solve your problem unless you explain/show how you tried to solve your problem and what failed.

                You can see in my code snippet, I have used the command like this right after I signals are generated.
                shortentry.addinfo(name='Short_E')

                I am not able to see what this .addinfo() does, if it does not use this information.

                B 1 Reply Last reply Reply Quote 0
                • B
                  backtrader administrators @param.jeet last edited by

                  @param-jeet said in Track Signal name in plot and output data:

                  I am not able to see what this .addinfo() does, if it does not use this information.

                  Docs - Orders

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