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

Creating unique identifiers on my indicator.



  • Hey I've been working on my mean reversion strategy but I'm having a hard time creating a unique identifier for each respective band.
    Here is my code so far:

    import backtrader as bt
    
    
    class MeanReversionLong(bt.Strategy):
    
        lines = ('kama',
                 'top1',
                 'bot1',
                 'top2',
                 'bot2',
                 'top3',
                 'bot3',
                 'top4',
                 'bot4')
    
        params = (
            ('period', 30),
            ('fast', 1.4),
            ('slow', 7.7),
            ('perc1', 0.3),
            ('perc2', 0.6),
            ('perc3', 0.9),
            ('perc4', 1.35)
        )
    
        """Create and define indicator(s)"""
        def __init__(self):
            self.ama1 = bt.indicators.AdaptiveMovingAverageEnvelope(period=self.p.period,
                                                                    fast=self.p.fast,
                                                                    slow=self.p.slow,
                                                                    perc=self.p.perc1,
                                                                    plotname='ama1')
            plotlinelabels =
            #  Plot and give each individual band a unique identifier, 1st step
            #  Formula for the upper band is: Kama * (1 + 0.3%) switch out + with - for the below band
    
            self.ama2 = bt.indicators.AdaptiveMovingAverageEnvelope(period=self.p.period,
                                                                    fast=self.p.fast,
                                                                    slow=self.p.slow,
                                                                    perc=self.p.perc2,
                                                                    plotname='ama2')
            #  Plot and give each individual band a unique identifier, 2nd step
            #  Formula for the upper band is: Kama * (1 + 0.6%) switch out + with - for the below band
    
            self.ama3 = bt.indicators.AdaptiveMovingAverageEnvelope(period=self.p.period,
                                                                    fast=self.p.fast,
                                                                    slow=self.p.slow,
                                                                    perc=self.p.perc3,
                                                                    plotname='ama3')
            #  Plot and give each individual band a unique identifier, 3rd step
            #  Formula for the upper band is: Kama * (1 + 0.9%) switch out + with - for the below band
    
            self.ama4 = bt.indicators.AdaptiveMovingAverageEnvelope(period=self.p.period,
                                                                    fast=self.p.fast,
                                                                    slow=self.p.slow,
                                                                    perc=self.p.perc4,
                                                                    plotname='ama4')
            #  Plot and give each individual band a unique identifier, 4th step
            #  Formula for the upper band is: Kama * (1 + 1.35%) switch out + with - for the below band
    
        """Define trade logic"""
        def __next__(self):
            pass
    
    

    What I want is to be able to use each top and bottom band and make them display values when I plot. So far my output is: Figure_0.png
    As you can see here I can only access the moving average, what is the best way to create unique identifiers for each respective band so I can easily access them in:

    def __next__(self):
    

    I've tried doing this to no effect:

    self.l.top1 = self.ama1(self.p.period * (1 + self.p.perc1)
    bt.LinePlotterIndicator(self.l.top1, name='top1)
    

    What am I doing wrong?

    cept0r



  • Solved it!
    After hours of trying different things I managed to solve it using this code:

        def __init__(self):
            self.ama = bt.indicators.AdaptiveMovingAverage(period=self.p.period,
                                                           fast=self.p.fast,
                                                           slow=self.p.slow,
                                                           plotname='AdaptiveMovingAverage',
                                                           color='yellow')
    
            #  Create upper & lower band 1
            self.l.top = self.ama * (1 + self.p.perc / 100)
            top = bt.LinePlotterIndicator(self.l.top, name='top', subplot=False)
            top.plotinfo.plotname = 'top'
    
            self.l.bot = self.ama * (1 - self.p.perc / 100)
            bot = bt.LinePlotterIndicator(self.l.bot, name='bot', subplot=False)
            bot.plotinfo.plotname = 'bot'
    
            #  Create upper & lower band 2
            self.l.top2 = self.ama * (1 + self.p.perc2 / 100)
            top2 = bt.LinePlotterIndicator(self.l.top2, name='top2', color='cyan', subplot=False)
            top2.plotinfo.plotname = 'top2'
    
            self.l.bot2 = self.ama * (1 - self.p.perc2 / 100)
            bot2 = bt.LinePlotterIndicator(self.l.bot2, name='bot2', color='cyan', subplot=False)
            bot2.plotinfo.plotname = 'bot2'
    
            #  Create upper & lower band 3
            self.l.top3 = self.ama * (1 + self.p.perc3 / 100)
            top2 = bt.LinePlotterIndicator(self.l.top3, name='top3', color='red', subplot=False)
            top2.plotinfo.plotname = 'top3'
    
            self.l.bot3 = self.ama * (1 - self.p.perc3 / 100)
            bot2 = bt.LinePlotterIndicator(self.l.bot3, name='bot3', color='red', subplot=False)
            bot2.plotinfo.plotname = 'bot3'
    
            #  Create upper & lower band 4
            self.l.top4 = self.ama * (1 + self.p.perc4 / 100)
            top2 = bt.LinePlotterIndicator(self.l.top4, name='top4', color='orange', subplot=False)
            top2.plotinfo.plotname = 'top4'
    
            self.l.bot4 = self.ama * (1 - self.p.perc4 / 100)
            bot2 = bt.LinePlotterIndicator(self.l.bot4, name='bot4', color='orange', subplot=False)
            bot2.plotinfo.plotname = 'bot4'
    


  • This can be wrapped into single indicator:

    class AmaBands(bt.Indicator):
    
        lines = ('ama', 'top', 'bot', 'top2', 'bot2', 'top3', 'bot3', 'top4', 'bot4')
    
        params = (('period',2), ('fast',2), ('slow',5), 
                  ('perc', 1.0), ('perc2', 2.0), ('perc3', 3.0), ('perc4', 4.0))
        
        plotlines = dict(ama=dict(color='yellow'),
                         top=dict(color='blue'), bot=dict(color='blue'),
                         top2=dict(color='cyan'), bot2=dict(color='cyan'),
                         top3=dict(color='green'), bot3=dict(color='green'),
                         top4=dict(color='orange'), bot4=dict(color='orange'),)
    
        def __init__(self):
    
            self.lines.ama = bt.indicators.AdaptiveMovingAverage(
                period=self.p.period, fast=self.p.fast, slow=self.p.slow)
    
            self.lines.top = self.ama * (1 + self.p.perc/100)
            self.lines.top2 = self.ama * (1 + self.p.perc2/100)
            self.lines.top3 = self.ama * (1 + self.p.perc3/100)
            self.lines.top4 = self.ama * (1 + self.p.perc4/100)
    
            self.lines.bot = self.ama * (1 - self.p.perc/100)
            self.lines.bot2 = self.ama * (1 - self.p.perc2/100)
            self.lines.bot3 = self.ama * (1 - self.p.perc3/100)
            self.lines.bot4 = self.ama * (1 - self.p.perc4/100)
    

    Then called in the strategy:

        def __init__(self):
            self.dataclose = self.datas[0].close
            self.ind = AmaBands(plot=True, subplot=False)
    
        def next(self):
            self.log('%0.2f, %0.2f, %0.2f' % (
                     self.dataclose[0], self.ind.top[0], self.ind.bot[0]))
    


  • @ab_trader
    Oh sweet!
    Thanks


Log in to reply
 

});