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/

    Quickstart - cerebro.optstrategy() no result (3.7 Windows)

    General Code/Help
    2
    4
    1115
    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.
    • K
      Kerginaldo Mattos last edited by Kerginaldo Mattos

      Hi, I'm new to python and to backtrader. Trying out the quickstart tutorial, everything worked fine, until the optimizer topic, the program does not execute bt.Strategy methods, I put some print values and it seens like the init or stop funcions doesn't execute.

      If I change the code to run once, just with cerebro.addstrategy(TestStrategy) it works fine.

      When I execute the code, It only prints "calling run()"

      from __future__ import (absolute_import, division, print_function,
                              unicode_literals)
      
      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 = (
              ('maperiod', 10),
              ('printlog', True),
          )
      
          def log(self, txt, dt=None, doprint=True):
              ''' Logging function fot this strategy'''
              if self.params.printlog or doprint:
                  dt = dt or self.datas[0].datetime.date(0)
                  print('%s, %s' % (dt.isoformat(), txt))
      
          def __init__(self):
      
              print('init start')
      
              # 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
      
              # Add a MovingAverageSimple indicator
              self.sma = bt.indicators.SimpleMovingAverage(
                  self.datas[0], period=self.params.maperiod)
      
              print('init end')        
      
          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, 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
                      self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                               (order.executed.price,
                                order.executed.value,
                                order.executed.comm))
      
                  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 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
      
              # Check if we are in the market
              if not self.position:
      
                  # Not yet ... we MIGHT BUY if ...
                  if self.dataclose[0] > self.sma[0]:
      
                      # 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()
      
              else:
      
                  if self.dataclose[0] < self.sma[0]:
                      # 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()
      
          def stop(self):
              self.log('(MA Period %2d) Ending Value %.2f' %
                       (self.params.maperiod, self.broker.getvalue()), doprint=True)
      
      
      if __name__ == '__main__':
          # Create a cerebro entity
          cerebro = bt.Cerebro()
      
      
      
          # 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 = 'C:\spy.CSV'
      
          # Create a Data Feed
          data = bt.feeds.YahooFinanceCSVData(
              dataname=datapath,
              # Do not pass values before this date
              fromdate=datetime.datetime(2000, 1, 1),
              # Do not pass values before this date
              todate=datetime.datetime(2020, 12, 31),
              # Do not pass values after this date
              reverse=False)
      
      
          # Add the Data Feed to Cerebro
          cerebro.adddata(data)
      
          # Set our desired cash start
          cerebro.broker.setcash(100000.0)
      
          # Add a FixedSize sizer according to the stake
          cerebro.addsizer(bt.sizers.FixedSize, stake=2)
      
          # Set the commission
          cerebro.broker.setcommission(commission=0.0)
      
          # Add a strategy
          strats = cerebro.optstrategy(
              TestStrategy,
              maperiod=range(10, 15))    
      
          print('calling run()')
      
          # Run over everything
          cerebro.run()
      
      
      1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators last edited by

        Don't take this personally. It's clear you are new, else you wouldn't miss this at the top of each page in the community.

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

        which has the effect of making your code readable.

        On the positive side you have let us know that you are running under Windows whilst playing with optimization. Further details would have cleared the situation, but the most obvious thing:

        • As a newbie you have been sold the benefits of using Jupyter or Spyder or something similar.

        Those shells hijack the Python core and eventually destroy the multiprocessing facilities of Python under Windows.

        See this for example: https://community.backtrader.com/topic/744/optstrategy-not-working-in-jupyter

        No, there is nothing which can be done, except that you use a proper shell for executing the scripts.

        1 Reply Last reply Reply Quote 1
        • K
          Kerginaldo Mattos last edited by

          oh thanks!

          I didn't understood how to use the backtick, sorry, bad english. It's ok now

          I'll search for something to use multiprocessing on windows, I've never used Python, so just installed windows version and followed the tutorial.

          Thanks again!

          1 Reply Last reply Reply Quote 0
          • K
            Kerginaldo Mattos last edited by

            I was using IDLE and running the script with F5

            It works OK when executed from the command line.

            As a suggestion, you could add a warning on the quickstart tutorial, just saying that the optimization uses multiprocessing.

            Thanks again!

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