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/

    It's a silly question, but it really confuses me. Please help me.

    General Discussion
    2
    4
    672
    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.
    • M
      Mike Van last edited by

      The code in Quickstart really confuses me.
      The code is as follows

      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
                          self.order = self.buy()
      
          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
                  self.order = self.sell()
      

      Two questions:

      1. what does len(self) mean and why it can be executed?
      2. why we can call the function notify_order()? I read the bt.Strategy but found the answer.
      B 1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators last edited by

        First thing (it's at the top of each page)

        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
        • B
          backtrader administrators @Mike Van last edited by

          @mike-van said in It's a silly question, but it really confuses me. Please help me.:

          1. what does len(self) mean and why it can be executed?

          It's the number of bars processed so far.

          @mike-van said in It's a silly question, but it really confuses me. Please help me.:

          1. why we can call the function notify_order()? I read the bt.Strategy but found the answer.

          You don't call it. It is called when a status change takes place in an order. Docs - Strategy

          M 1 Reply Last reply Reply Quote 0
          • M
            Mike Van @backtrader last edited by

            @backtrader Thanks for your help

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