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/

    Indicator with look back

    Indicators/Strategies/Analyzers
    2
    2
    131
    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.
    • J T
      J T last edited by

      Hi
      I am at wits end after searching for answers and also reading the dox. I reckon my understanding is still not good enough and hoping for some expert advice. My indicator is not complete yet, but stuck at some parts. I am trying to do it as declarative in __init__as it possibly can as I feel a part of me missing if I dont.

      Code as follows and I keep getting an empty array in ys which I think its the problem.

      class CandlePower(bt.Indicator):
          """
          1. Buyers or Sellers in control - e.g green candle - close price is closer to top or bottom of candle
          2. Is there strength in the move - size of candle relative to the others in the period. Use a plot of xs and ys, find slope of the line through the points. xs is just the x axis 1, 2 & 3. ys are size of candle bar. 
      
          """
          lines = ('candle_power', 'perc_of_range', 'slope')
          params = (dict(period=3, safediv=True))
      
          plotlines = dict(
                      candle_power=dict(_name='CP', marker='v', markersize=6.0, ls='', color='pink', _skipnan=True),
                      slope=dict(_name='slope', _plotskip=True),
                      perc_of_range=dict(_name='perc_of_range', _plotskip=True),
      
                      )
      
          plotinfo = dict(subplot=True)
      
          def __init__(self):
              # Any operation involving lines objects during __init__ generates another lines object
              # self.candle_size = [self.data.open(i) - self.data.close(i) for i in range(0 - self.p.period + 1, 1, 1)]  # returns list [-0.2,-0.1, 0.05] of len period
              # super(CandlePower, self).__init__()
              self.l.perc_of_range = bt.If(self.data.close >= self.data.open, bt.DivByZero((self.data.high - self.data.close), (self.data.high - self.data.low), zero=0.0),
                                           bt.DivByZero((self.data.close - self.data.low), (self.data.high - self.data.low), zero=0.0))
      
              xs = np.array(list(range(1, self.p.period + 1)), dtype=np.float64)  # converts [1,2,3] to array and this is a constant
              candle_size = self.data.close - self.data.open  # lineOperation obj, even if I change this to a line, ys is still empty.
              ys = candle_size.get(size=self.p.period)  # get the last 3 periods, returns an array.
              ys = np.array(ys, dtype=np.float64)  # convert to np array like xs
              self.l.slope = ((mean(xs) * mean(ys)) - mean(xs * ys)) / ((mean(xs) * mean(xs)) - mean(xs * xs)) * 100000  # returns slope of sizes of candles to see if inc or dec
      
          def next(self):
              # Any operation involving lines objects during next yields regular Python types like floats and bools
      
              if 0 <= self.l.perc_of_range[0] >= 0.25 and self.l.slope[0] > 5:  # 0 - 0.25
                  self.l.candle_power[0] = 2
      
              elif 0.76 < self.l.perc_of_range[0] <= 1.00 and self.l.slope[0] < - 5:  # 0.76 - 1.00
                  self.l.candle_power[0] = -2
              else:
                  self.l.candle_power[0] = float('nan')
      

      And since I am here, I like to take the chance to ask one more question.
      Becasue my oop is weak, I like to ask what does super(CandlePower, self).init do? When would I need this line?

      Thanks in advance!

      1 Reply Last reply Reply Quote 0
      • A
        ab_trader last edited by

        This

        ys = candle_size.get(size=self.p.period)
        

        will work in the next(), not in the init().

        1 Reply Last reply Reply Quote 2
        • 1 / 1
        • First post
          Last post
        Copyright © 2016, 2017, 2018 NodeBB Forums | Contributors
        $(document).ready(function () { app.coldLoad(); }); }