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/

    Question regarding Fractal Indicator

    Indicators/Strategies/Analyzers
    2
    9
    1814
    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.
    • A
      AArzt93 last edited by

      Hi,

      I have some experience w python but Im fairly new to bt.
      Im currently codeing up a simply dummy strategy with the fractal indicator. The logic is simple:
      Buy if the current bullish_fractal is higher than the last bullish_fractal.

      class Rotation_Strategy(bt.Strategy):

         # ## added in loggin fuction as it helpful in bug fixing
         # def log(self, txt, dt=None): 
         #     dt = self.datas[0].datetime.date(0)
         #     print('%s, %s' % (dt.isoformat(), txt))
          
          def __init__(self):
              self.dclose = self.datas[0].close
              self.high = self.datas[0].high
              self.open = self.datas[0].open
              self.low = self.datas[0].low
              self.fractal = Fractal(self.data, period=5, bardist=0.01) 
             
          
          
          def notify_order(self, order):
              
              if order.status in [order.Completed]:
                  self.bar_executed = len(self)
                  
          ### record entry price for logging purposes
                  if order.isbuy():
                      self.bar_entry = order.executed.price
                  
                          
          def next(self):
            
              
              if not self.position:
                  if self.fractal.fractal_bullish[0] > self.fractal.fractal_bullish[-1]:
                      self.buy(size=1)
                        
                            
              else:
                  if len(self) >= (self.bar_executed + 3):
                      self.close()
      

      However, when I run this logic, it takes the LAST BAR (regardless of whether it has a bullish_fractal or not) - But
      I want it to take the value of the last bullish fractal. Hope that made sense.

      Thx!

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

        @aarzt93 said in Question regarding Fractal Indicator:

        However, when I run this logic, it takes the LAST BAR (regardless of whether it has a bullish_fractal or not) - But
        I want it to take the value of the last bullish fractal. Hope that made sense.

        Sorry, but at least here it doesn't make any sense.

        Additionally, if you want to post code (or output) please see the top of the forum

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

          Thx for reply and sorry about the code thing. Let me rephrase that question:
          I want to buy if the current bullish fractal is higher than the last bullish fractal.
          With the code that I posted, it simply looks at the last bar and checks if I there
          has been a bullish fractal at the last bar - and since thats never the case, because
          the fractal indicator has period 5, it doesnt give me any signals.

          Hope that makes sense now.
          Thank you

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

            I believe you are mistaken into what the Fractal study does. It shows you things that have happened in the past ... and it actually logs them in the past.

            You are never going to get a real-time signal to buy/sell with Fractal, and that's why it is called a Study and categorized as one in the sources.

            From the reference quoted in the documentation for Fractal

            • https://www.investopedia.com/articles/trading/06/fractals.asp
            The obvious drawback here is that fractals are lagging indicators. A fractal can't be drawn until we are two days into the reversal
            

            You need to look the appropriate (period-wise) number of bars in the past to understand in the study identified a turning point in the past. If you then believe the trend is going to continue, you can enter.

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

              Quote from Investopedia: "The obvious drawback here is that fractals are lagging indicators. A fractal can't be drawn until we are two days into the reversal."

              I get that part about the past.

              Here is the simple idea:
              If the market made a bullish fractal - call it "low 2"- on day 0, which I know earliest 2 bars (days) later (given I use a 5 bar fractal) and this bullish fractal is higher than the last bullish fractal BEFORE - call that one "low 1"- so a higher low so to speak. Now I want to after enter long on day 3, so 2 days after low 2 (because it doesnt reveal itself any earlier).

              The problem (at least for me) again:
              How do I access the last bullish fractal (low 1) in my buying logic? This:

              self.fractal.fractal_bearish[-1] 
              

              gives me somehow just the last bar and not low 1

              I initally thought that

                          if self.fractal.fractal_bearish[0] > self.fractal.fractal_bearish[-1]:
                              self.buy(size=1)
              

              would do the job, but it doesnt.

              I hope that this made sense.

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

                @aarzt93 said in Question regarding Fractal Indicator:

                How do I access the last bullish fractal (low 1) in my buying logic? This:
                self.fractal.fractal_bearish[-1]

                gives me somehow just the last bar and not low 1

                Yes, index -1 will always give you the last value (aka last bar), which is right before the current one, which is at index 0. This is so for all indicators and lines.

                @aarzt93 said in Question regarding Fractal Indicator:

                I initally thought that

                            if self.fractal.fractal_bearish[0] > self.fractal.fractal_bearish[-1]:
                                self.buy(size=1)
                

                would do the job, but it doesnt.

                You haven't then got this.

                @aarzt93 said in Question regarding Fractal Indicator:

                Quote from Investopedia: "The obvious drawback here is that fractals are lagging indicators. A fractal can't be drawn until we are two days into the reversal."
                I get that part about the past.

                Depending on the period you use, the last bullish, bearish indication, will be at least -x periods in the past. For the default period of 5 this will will [-2].

                Comparing if the value is greater than or less than makes no sense, because you are looking for an indication at a given point in time (when the study marks that a swing happened) and not for a value which is greater than or less than. Any value which is not an indication will be a NaN because there is nothing there.

                A 2 Replies Last reply Reply Quote 0
                • A
                  AArzt93 @backtrader last edited by

                  @backtrader
                  okay, so is there a way to store all the bearish/bullish fractals in a container (dict/array) and have them printed out, so that I can gather some statistics on them ?

                  1 Reply Last reply Reply Quote 0
                  • A
                    AArzt93 @backtrader last edited by

                    @backtrader
                    I have done the following:
                    I created an empty container in the constructor of the strategy.

                    self.__special_array_for_later = []
                    

                    Then I wanted to fill it up with the bearish fractals (highs) when iterating over the bars:

                            if self.fractal.fractal_bearish:
                                self.__special_array_for_later.append(self.high[-2])
                    

                    But when I print it out later it gives me all the high prices instead of only those highs that were marked with
                    a bearish fractal.

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

                      @aarzt93 said in Question regarding Fractal Indicator:

                      But when I print it out later it gives me all the high prices instead of only those highs that were marked with
                      a bearish fractal.

                      @aarzt93 said in Question regarding Fractal Indicator:

                          if self.fractal.fractal_bearish:
                              self.__special_array_for_later.append(self.high[-2])
                      

                      @backtrader said in Question regarding Fractal Indicator:

                      Any value which is not an indication will be a NaN because there is nothing there.

                      It was clearly stated that values which are not marked as fractal are NaN, so you should be specifically looking to skip NaN values. In any case the logic is flawed, because the mark for a fractal doesn't happen now, it happens two periods in the past, exactly as the high you want to store.

                      @aarzt93 said in Question regarding Fractal Indicator:

                      okay, so is there a way to store all the bearish/bullish fractals in a container (dict/array) and have them printed out, so that I can gather some statistics on them ?

                      They are already stored in the indicator itself, which is a line. You probably want to read the documentation here: Docs - Platform Concepts and look for Slicing

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