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



  • 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


  • administrators

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

  • administrators

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



  • @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.


  • administrators

    @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:



  • @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.


  • administrators

    @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