Backtrader Community

    • 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/

    optstrategy not working in Jupyter

    General Code/Help
    3
    6
    3022
    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.
    • S
      Søren Pallesen last edited by

      Im trying to run a simple example using optstrategy in a Jyputer notebook and it simply just hangs. Any ideas?

      Here is the code:

      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):
          params = (('BBandsperiod', 20),)
      
          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 and buy price/commission
              self.order = None
              self.buyprice = None
              self.buycomm = None
              self.redline = None
              self.blueline = None
      
              # Add a BBand indicator
              self.bband = bt.indicators.BBands(self.datas[0], period=self.params.BBandsperiod)
      
          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 enougth cash
              if order.status in [order.Completed, order.Canceled, order.Margin]:
                  if order.isbuy():
      #                 self.log(
      #                     'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
      #                     (order.executed.price,
      #                      order.executed.value,
      #                      order.executed.comm))
      
                      self.buyprice = order.executed.price
                      self.buycomm = order.executed.comm
                  else:  # Sell
                      pass
      #                 self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
      #                          (order.executed.price,
      #                           order.executed.value,
      #                           order.executed.comm))
      
                  self.bar_executed = len(self)
      
              # Write down: no pending order
              self.order = None
      
          def notify_trade(self, trade):
              if not trade.isclosed:
                  return
      
              #self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
              #         (trade.pnl, trade.pnlcomm))
      
          
      
          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
      
              if self.dataclose < self.bband.lines.bot and not self.position:
              	self.redline = True
      
              if self.dataclose > self.bband.lines.top and self.position:
              	self.blueline = True
      
              if self.dataclose > self.bband.lines.mid and not self.position and self.redline:        	
              	# BUY, BUY, BUY!!! (with all possible 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()
      
              if self.dataclose > self.bband.lines.top and not self.position:
                  # BUY, BUY, BUY!!! (with all possible 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()
      
              if self.dataclose < self.bband.lines.mid and self.position and self.blueline:
                  # SELL, SELL, SELL!!! (with all possible default parameters)
                  #self.log('SELL CREATE, %.2f' % self.dataclose[0])
                  self.blueline = False
                  self.redline = False
                  # Keep track of the created order to avoid a 2nd order
                  self.order = self.sell()
      
      if __name__ == '__main__':
          # Create a cerebro entity
          cerebro = bt.Cerebro()
      
          # Add a strategy
          #cerebro.addstrategy(TestStrategy)
          cerebro.optstrategy(TestStrategy, BBandsperiod=(18, 22))
      
      
          # 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, 'TSLA-USD.csv')
      
          # Create a Data Fee
          data = bt.feeds.GenericCSVData(
              dataname='data/BTC_USDT_poliniex_1d_2017.csv',
              dtformat='%Y-%m-%d', 
              # dtformat='%Y-%m-%d %H:%M:%S',
              # dtformat='%d.%m.%Y %H:%M:%S.%f',
              # tmformat='%H%M%S',  # already the default value
              # datetime=0,  # position at default
              time=-1,  # position of time
              open=1,  # position of open
              high=2,
              low=3,
              close=4,
              volume=5,
              openinterest=-1,  # -1 for not present
              timeframe=bt.TimeFrame.Days)
      
          # Add the Data Feed to Cerebro
          cerebro.adddata(data)
      
          # Set our desired cash start
          cerebro.broker.setcash(1000000.0)
      
          # Add a FixedSize sizer according to the stake
          cerebro.addsizer(bt.sizers.FixedSize, stake=5)
      
          # Set the commission
          cerebro.broker.setcommission(commission=0.002)
      
          # Print out the starting conditions
          #print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
      
          # Run over everything
          cerebro.run()
      
          # Print out the final result
          #print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
      
          # Plot the result
          cerebro.plot()
      

      Here is the output from the Jupyter console:

      0_1512576148930_Udklip.PNG

      A 1 Reply Last reply Reply Quote 0
      • A
        ab_trader @Søren Pallesen last edited by

        @Søren-Pallesen I've heard that jupyter doesn't support multiprocessing. This can be a reason of the error.

        • If my answer helped, hit reputation up arrow at lower right corner of the post.
        • Python Debugging With Pdb
        • New to python and bt - check this out
        1 Reply Last reply Reply Quote 2
        • P
          Paska Houso last edited by

          See this: https://community.backtrader.com/topic/612/optimzation-question/

          Any shell which hijacks the initialization of the Python kernel is bound to have problems with the multiprocessing module under Windows. Google shows some other references from the past:

          • https://community.backtrader.com/topic/328/quick-start-optimization-example-output-problem
          • https://stackoverflow.com/questions/38884587/multithreading-frozen-in-python-spyder-but-not-command-prompt-windows-10
          1 Reply Last reply Reply Quote 2
          • S
            Søren Pallesen last edited by

            Thx for prompt answers. Love this community for that. Any way to use optstrategy without multiprocessing?

            1 Reply Last reply Reply Quote 0
            • P
              Paska Houso last edited by

              • Option 1: maxcpus=1 (disable using multiple cores)
              • Option 2: You give GvR a call and tell him that in 2017 (with 2018 not being that far away) the GIL may no longer be such a good idea. It may be worth a try.
              1 Reply Last reply Reply Quote 0
              • S
                Søren Pallesen last edited by

                Funny and knowleble. Rare combo 🤣. Thx again will give maxcpus a shot. Shame though when you have a 12 core i7 ...

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