How to buy maximum stakes?



  • Dear all
    I want to do buy max stakes what I can buy by my assets. I write codes following, but Sell and Buy are outpuy many times and it is strange. Are there any misses?

    class TestStake(bt.Sizer):
    	params = (('stake', 1),)
    
    	def _getsizing(self, comminfo, cash, data, isbuy):
    		if isbuy:
    			divide = math.floor(cash/data.close[0])
    			self.p.stake = divide
    			return self.p.stake
    
    		# Sell situation
    		position = self.broker.getposition(data)
    		if not position.size:
    			return 0  # do not sell if nothing is open
    
    		return self.p.stake
        ...
        ...
        ...
     	cerebro.addsizer(TestStake)
    

  • administrators

    but Sell and Buy are outpuy many times

    What this means is unclear. And the actual buy/sell logic is not presented.

    In any case this cash/data.close[0] will give you the possible stake for the current close price. The price may be different the next day, because there may be a gap. That means that the operation may or may not succeed.

    This is because backtrader wants to be as realistic as possible and not execute an operation which cannot be executed in real life.

    An option you have to make sure that the calculated size can be gotten is to activate the cheat-on-close functionality in the broker to get matched on the same day the order is issued.

    See Docs - Broker



  • Thank you for your reply.
    I write the code following.

    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 math
    # Import the backtrader platform
    import backtrader as bt
    # Create a Stratey
    class TestStrategy(bt.Strategy):
    	params = (
    		('maperiod', 15), 
    		('period', 15), 
    	)
    
    	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.sma = bt.indicators.SimpleMovingAverage(
    			self.datas[0], period=self.params.maperiod)
    
    	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
    				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
    		# 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()
    
    class LongOnly(bt.Sizer):
    	params = (('stake', 1),)
    	def _getsizing(self, comminfo, cash, data, isbuy):
    		if isbuy:
    			divide = math.floor(cash/data.close[0])
    			self.p.stake = divide
    			return self.p.stake
    		# Sell situation
    		position = self.broker.getposition(data)
    		if not position.size:
    			return 0  # do not sell if nothing is open
    		return self.p.stake
    
    if __name__ == '__main__':
    	cerebro = bt.Cerebro()
    	# Add a strategy
    	cerebro.addstrategy(TestStrategy)
    	# Add Sizer
    	cerebro.addsizer(LongOnly)
    	# because it could have been called from anywhere
    	modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
    	datapath = os.path.join('datas/orcl-1995-2014.txt')
    
    	# 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(2000, 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(1000.0)
    
    	# Set the commission
    	cerebro.broker.setcommission(commission=0.0)
    
    	# 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()
    

    And I get the output following. I think it is strange.
    For example, Date 2000-02-02 is make "BUY CREATE", but "BUY EXECUTED" shows "Price: 0.00, Cost: 0.00, Comm 0.00".
    So, why it can not make excuted an order? How to understand these outputs?

    Starting Portfolio Value: 1000.00
    2000-01-25, BUY CREATE, 26.61
    2000-01-26, BUY EXECUTED, Price: 26.76, Cost: 990.12, Comm 0.00
    2000-01-27, SELL CREATE, 24.43
    2000-01-28, SELL EXECUTED, Price: 24.28, Cost: 990.12, Comm 0.00
    2000-01-28, OPERATION PROFIT, GROSS -91.76, NET -91.76
    2000-02-02, BUY CREATE, 25.61
    2000-02-03, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-02-03, BUY CREATE, 26.73
    2000-02-04, BUY EXECUTED, Price: 27.17, Cost: 896.61, Comm 0.00
    2000-02-18, SELL CREATE, 27.61
    2000-02-22, SELL EXECUTED, Price: 27.88, Cost: 896.61, Comm 0.00
    2000-02-22, OPERATION PROFIT, GROSS 23.43, NET 23.43
    2000-02-22, BUY CREATE, 27.97
    2000-02-23, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-02-23, BUY CREATE, 29.73
    2000-02-24, BUY EXECUTED, Price: 29.79, Cost: 923.49, Comm 0.00
    2000-03-30, SELL CREATE, 36.98
    2000-03-31, SELL EXECUTED, Price: 37.81, Cost: 923.49, Comm 0.00
    2000-03-31, OPERATION PROFIT, GROSS 248.62, NET 248.62
    2000-04-06, BUY CREATE, 38.75
    2000-04-07, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-04-07, BUY CREATE, 41.08
    2000-04-10, BUY EXECUTED, Price: 41.26, Cost: 1155.28, Comm 0.00
    2000-04-11, SELL CREATE, 36.48
    2000-04-12, SELL EXECUTED, Price: 36.75, Cost: 1155.28, Comm 0.00
    2000-04-12, OPERATION PROFIT, GROSS -126.28, NET -126.28
    2000-04-18, BUY CREATE, 37.22
    2000-04-19, BUY EXECUTED, Price: 37.07, Cost: 1037.96, Comm 0.00
    2000-04-19, SELL CREATE, 35.16
    2000-04-20, SELL EXECUTED, Price: 34.80, Cost: 1037.96, Comm 0.00
    2000-04-20, OPERATION PROFIT, GROSS -63.56, NET -63.56
    2000-04-27, BUY CREATE, 36.45
    2000-04-28, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-04-28, BUY CREATE, 37.69
    2000-05-01, BUY EXECUTED, Price: 37.66, Cost: 979.16, Comm 0.00
    2000-05-04, SELL CREATE, 35.01
    2000-05-05, SELL EXECUTED, Price: 34.89, Cost: 979.16, Comm 0.00
    2000-05-05, OPERATION PROFIT, GROSS -72.02, NET -72.02
    2000-05-05, BUY CREATE, 36.22
    2000-05-08, BUY EXECUTED, Price: 35.51, Cost: 887.75, Comm 0.00
    2000-05-08, SELL CREATE, 34.10
    2000-05-09, SELL EXECUTED, Price: 34.75, Cost: 887.75, Comm 0.00
    2000-05-09, OPERATION PROFIT, GROSS -19.00, NET -19.00
    2000-05-15, BUY CREATE, 36.31
    2000-05-16, BUY EXECUTED, Price: 36.60, Cost: 878.40, Comm 0.00
    2000-05-18, SELL CREATE, 34.45
    2000-05-19, SELL EXECUTED, Price: 33.94, Cost: 878.40, Comm 0.00
    2000-05-19, OPERATION PROFIT, GROSS -63.84, NET -63.84
    2000-05-30, BUY CREATE, 34.98
    2000-05-31, BUY EXECUTED, Price: 34.54, Cost: 794.42, Comm 0.00
    2000-06-22, SELL CREATE, 38.43
    2000-06-23, SELL EXECUTED, Price: 38.10, Cost: 794.42, Comm 0.00
    2000-06-23, OPERATION PROFIT, GROSS 81.88, NET 81.88
    2000-06-26, BUY CREATE, 38.99
    2000-06-27, BUY EXECUTED, Price: 38.84, Cost: 893.32, Comm 0.00
    2000-06-27, SELL CREATE, 38.78
    2000-06-28, SELL EXECUTED, Price: 38.70, Cost: 893.32, Comm 0.00
    2000-06-28, OPERATION PROFIT, GROSS -3.22, NET -3.22
    2000-06-28, BUY CREATE, 39.11
    2000-06-29, BUY EXECUTED, Price: 38.69, Cost: 889.87, Comm 0.00
    2000-06-29, SELL CREATE, 38.13
    2000-06-30, SELL EXECUTED, Price: 37.90, Cost: 889.87, Comm 0.00
    2000-06-30, OPERATION PROFIT, GROSS -18.17, NET -18.17
    2000-06-30, BUY CREATE, 39.64
    2000-07-03, BUY EXECUTED, Price: 38.25, Cost: 841.50, Comm 0.00
    2000-07-03, SELL CREATE, 37.81
    2000-07-05, SELL EXECUTED, Price: 36.22, Cost: 841.50, Comm 0.00
    2000-07-05, OPERATION PROFIT, GROSS -44.66, NET -44.66
    2000-07-20, BUY CREATE, 36.84
    2000-07-21, BUY EXECUTED, Price: 36.51, Cost: 839.73, Comm 0.00
    2000-07-21, SELL CREATE, 35.57
    2000-07-24, SELL EXECUTED, Price: 36.36, Cost: 839.73, Comm 0.00
    2000-07-24, OPERATION PROFIT, GROSS -3.45, NET -3.45
    2000-07-25, BUY CREATE, 35.83
    2000-07-26, BUY EXECUTED, Price: 35.28, Cost: 811.44, Comm 0.00
    2000-07-27, SELL CREATE, 35.39
    2000-07-28, SELL EXECUTED, Price: 35.42, Cost: 811.44, Comm 0.00
    2000-07-28, OPERATION PROFIT, GROSS 3.22, NET 3.22
    2000-07-31, BUY CREATE, 35.45
    2000-08-01, BUY EXECUTED, Price: 35.46, Cost: 851.04, Comm 0.00
    2000-08-01, SELL CREATE, 34.48
    2000-08-02, SELL EXECUTED, Price: 34.42, Cost: 851.04, Comm 0.00
    2000-08-02, OPERATION PROFIT, GROSS -24.96, NET -24.96
    2000-08-03, BUY CREATE, 36.51
    2000-08-04, BUY EXECUTED, Price: 36.93, Cost: 812.46, Comm 0.00
    2000-09-08, SELL CREATE, 40.81
    2000-09-11, SELL EXECUTED, Price: 40.58, Cost: 812.46, Comm 0.00
    2000-09-11, OPERATION PROFIT, GROSS 80.30, NET 80.30
    2000-09-28, BUY CREATE, 38.42
    2000-09-29, BUY EXECUTED, Price: 38.36, Cost: 882.28, Comm 0.00
    2000-09-29, SELL CREATE, 37.13
    2000-10-02, SELL EXECUTED, Price: 37.60, Cost: 882.28, Comm 0.00
    2000-10-02, OPERATION PROFIT, GROSS -17.48, NET -17.48
    2000-10-19, BUY CREATE, 34.30
    2000-10-20, BUY EXECUTED, Price: 34.06, Cost: 851.50, Comm 0.00
    2000-10-30, SELL CREATE, 29.82
    2000-10-31, SELL EXECUTED, Price: 30.76, Cost: 851.50, Comm 0.00
    2000-10-31, OPERATION PROFIT, GROSS -82.50, NET -82.50
    2000-11-17, BUY CREATE, 27.17
    2000-11-20, BUY EXECUTED, Price: 22.93, Cost: 664.97, Comm 0.00
    2000-11-20, SELL CREATE, 23.34
    2000-11-21, SELL EXECUTED, Price: 23.39, Cost: 664.97, Comm 0.00
    2000-11-21, OPERATION PROFIT, GROSS 13.34, NET 13.34
    2000-11-30, BUY CREATE, 24.99
    2000-12-01, BUY EXECUTED, Price: 24.87, Cost: 795.84, Comm 0.00
    2000-12-14, SELL CREATE, 25.93
    2000-12-15, SELL EXECUTED, Price: 27.76, Cost: 795.84, Comm 0.00
    2000-12-15, OPERATION PROFIT, GROSS 92.48, NET 92.48
    2000-12-15, BUY CREATE, 26.93
    2000-12-18, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-18, BUY CREATE, 30.18
    2000-12-19, BUY EXECUTED, Price: 30.00, Cost: 900.00, Comm 0.00
    2000-12-20, SELL CREATE, 26.88
    2000-12-21, SELL EXECUTED, Price: 26.23, Cost: 900.00, Comm 0.00
    2000-12-21, OPERATION PROFIT, GROSS -113.10, NET -113.10
    2000-12-21, BUY CREATE, 27.82
    2000-12-22, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-22, BUY CREATE, 30.06
    2000-12-26, BUY EXECUTED, Price: 29.70, Cost: 772.20, Comm 0.00
    2000-12-29, SELL CREATE, 27.41
    Final Portfolio Value: 739.73
    

  • administrators

    Reading that is hugely difficult unless you care to add

         ```
    

    before and after the code and output.

    A guess is that the orders are not executed and the print out is wrong (printing executed when it's not actually executed)



  • I`m sorry to understand hugely difficul. I am not used to use these interface.
    I rewrite the code and output following.
    I have why are there miss print out?

    • Code
    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 and buy price/commission
    		self.order = None
    		self.buyprice = None
    		self.buycomm = None
    		self.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.maperiod)
    	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
    	* 
    	* list item
    		# 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
    				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
    		# 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()
    class LongOnly(bt.Sizer):
    	params = (('stake', 1),)
    	def _getsizing(self, comminfo, cash, data, isbuy):
    		if isbuy:
    			divide = math.floor(cash/data.close[0])
    			self.p.stake = divide
    			return self.p.stake
    	# Sell situation
    	position = self.broker.getposition(data)
    	if not position.size:
    		return 0 # do not sell if nothing is open
    	return self.p.stake
    
    if name == 'main':
    	cerebro = bt.Cerebro()
    	# Add a strategy
    	cerebro.addstrategy(TestStrategy)
    	# Add Sizer
    	cerebro.addsizer(LongOnly)
    	# because it could have been called from anywhere
    	modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
    	datapath = os.path.join('datas/orcl-1995-2014.txt')
    	
    	# 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(2000, 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(1000.0)
    	
    	# Set the commission
    	cerebro.broker.setcommission(commission=0.0)
    	
    	# 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()
    
    • Output
    Starting Portfolio Value: 1000.00
    2000-01-25, BUY CREATE, 26.61
    2000-01-26, BUY EXECUTED, Price: 26.76, Cost: 990.12, Comm 0.00
    2000-01-27, SELL CREATE, 24.43
    2000-01-28, SELL EXECUTED, Price: 24.28, Cost: 990.12, Comm 0.00
    2000-01-28, OPERATION PROFIT, GROSS -91.76, NET -91.76
    2000-02-02, BUY CREATE, 25.61
    2000-02-03, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-02-03, BUY CREATE, 26.73
    2000-02-04, BUY EXECUTED, Price: 27.17, Cost: 896.61, Comm 0.00
    2000-02-18, SELL CREATE, 27.61
    2000-02-22, SELL EXECUTED, Price: 27.88, Cost: 896.61, Comm 0.00
    2000-02-22, OPERATION PROFIT, GROSS 23.43, NET 23.43
    2000-02-22, BUY CREATE, 27.97
    2000-02-23, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-02-23, BUY CREATE, 29.73
    2000-02-24, BUY EXECUTED, Price: 29.79, Cost: 923.49, Comm 0.00
    2000-03-30, SELL CREATE, 36.98
    2000-03-31, SELL EXECUTED, Price: 37.81, Cost: 923.49, Comm 0.00
    2000-03-31, OPERATION PROFIT, GROSS 248.62, NET 248.62
    2000-04-06, BUY CREATE, 38.75
    2000-04-07, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-04-07, BUY CREATE, 41.08
    2000-04-10, BUY EXECUTED, Price: 41.26, Cost: 1155.28, Comm 0.00
    2000-04-11, SELL CREATE, 36.48
    2000-04-12, SELL EXECUTED, Price: 36.75, Cost: 1155.28, Comm 0.00
    2000-04-12, OPERATION PROFIT, GROSS -126.28, NET -126.28
    2000-04-18, BUY CREATE, 37.22
    2000-04-19, BUY EXECUTED, Price: 37.07, Cost: 1037.96, Comm 0.00
    2000-04-19, SELL CREATE, 35.16
    2000-04-20, SELL EXECUTED, Price: 34.80, Cost: 1037.96, Comm 0.00
    2000-04-20, OPERATION PROFIT, GROSS -63.56, NET -63.56
    2000-04-27, BUY CREATE, 36.45
    2000-04-28, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-04-28, BUY CREATE, 37.69
    2000-05-01, BUY EXECUTED, Price: 37.66, Cost: 979.16, Comm 0.00
    2000-05-04, SELL CREATE, 35.01
    2000-05-05, SELL EXECUTED, Price: 34.89, Cost: 979.16, Comm 0.00
    2000-05-05, OPERATION PROFIT, GROSS -72.02, NET -72.02
    2000-05-05, BUY CREATE, 36.22
    2000-05-08, BUY EXECUTED, Price: 35.51, Cost: 887.75, Comm 0.00
    2000-05-08, SELL CREATE, 34.10
    2000-05-09, SELL EXECUTED, Price: 34.75, Cost: 887.75, Comm 0.00
    2000-05-09, OPERATION PROFIT, GROSS -19.00, NET -19.00
    2000-05-15, BUY CREATE, 36.31
    2000-05-16, BUY EXECUTED, Price: 36.60, Cost: 878.40, Comm 0.00
    2000-05-18, SELL CREATE, 34.45
    2000-05-19, SELL EXECUTED, Price: 33.94, Cost: 878.40, Comm 0.00
    2000-05-19, OPERATION PROFIT, GROSS -63.84, NET -63.84
    2000-05-30, BUY CREATE, 34.98
    2000-05-31, BUY EXECUTED, Price: 34.54, Cost: 794.42, Comm 0.00
    2000-06-22, SELL CREATE, 38.43
    2000-06-23, SELL EXECUTED, Price: 38.10, Cost: 794.42, Comm 0.00
    2000-06-23, OPERATION PROFIT, GROSS 81.88, NET 81.88
    2000-06-26, BUY CREATE, 38.99
    2000-06-27, BUY EXECUTED, Price: 38.84, Cost: 893.32, Comm 0.00
    2000-06-27, SELL CREATE, 38.78
    2000-06-28, SELL EXECUTED, Price: 38.70, Cost: 893.32, Comm 0.00
    2000-06-28, OPERATION PROFIT, GROSS -3.22, NET -3.22
    2000-06-28, BUY CREATE, 39.11
    2000-06-29, BUY EXECUTED, Price: 38.69, Cost: 889.87, Comm 0.00
    2000-06-29, SELL CREATE, 38.13
    2000-06-30, SELL EXECUTED, Price: 37.90, Cost: 889.87, Comm 0.00
    2000-06-30, OPERATION PROFIT, GROSS -18.17, NET -18.17
    2000-06-30, BUY CREATE, 39.64
    2000-07-03, BUY EXECUTED, Price: 38.25, Cost: 841.50, Comm 0.00
    2000-07-03, SELL CREATE, 37.81
    2000-07-05, SELL EXECUTED, Price: 36.22, Cost: 841.50, Comm 0.00
    2000-07-05, OPERATION PROFIT, GROSS -44.66, NET -44.66
    2000-07-20, BUY CREATE, 36.84
    2000-07-21, BUY EXECUTED, Price: 36.51, Cost: 839.73, Comm 0.00
    2000-07-21, SELL CREATE, 35.57
    2000-07-24, SELL EXECUTED, Price: 36.36, Cost: 839.73, Comm 0.00
    2000-07-24, OPERATION PROFIT, GROSS -3.45, NET -3.45
    2000-07-25, BUY CREATE, 35.83
    2000-07-26, BUY EXECUTED, Price: 35.28, Cost: 811.44, Comm 0.00
    2000-07-27, SELL CREATE, 35.39
    2000-07-28, SELL EXECUTED, Price: 35.42, Cost: 811.44, Comm 0.00
    2000-07-28, OPERATION PROFIT, GROSS 3.22, NET 3.22
    2000-07-31, BUY CREATE, 35.45
    2000-08-01, BUY EXECUTED, Price: 35.46, Cost: 851.04, Comm 0.00
    2000-08-01, SELL CREATE, 34.48
    2000-08-02, SELL EXECUTED, Price: 34.42, Cost: 851.04, Comm 0.00
    2000-08-02, OPERATION PROFIT, GROSS -24.96, NET -24.96
    2000-08-03, BUY CREATE, 36.51
    2000-08-04, BUY EXECUTED, Price: 36.93, Cost: 812.46, Comm 0.00
    2000-09-08, SELL CREATE, 40.81
    2000-09-11, SELL EXECUTED, Price: 40.58, Cost: 812.46, Comm 0.00
    2000-09-11, OPERATION PROFIT, GROSS 80.30, NET 80.30
    2000-09-28, BUY CREATE, 38.42
    2000-09-29, BUY EXECUTED, Price: 38.36, Cost: 882.28, Comm 0.00
    2000-09-29, SELL CREATE, 37.13
    2000-10-02, SELL EXECUTED, Price: 37.60, Cost: 882.28, Comm 0.00
    2000-10-02, OPERATION PROFIT, GROSS -17.48, NET -17.48
    2000-10-19, BUY CREATE, 34.30
    2000-10-20, BUY EXECUTED, Price: 34.06, Cost: 851.50, Comm 0.00
    2000-10-30, SELL CREATE, 29.82
    2000-10-31, SELL EXECUTED, Price: 30.76, Cost: 851.50, Comm 0.00
    2000-10-31, OPERATION PROFIT, GROSS -82.50, NET -82.50
    2000-11-17, BUY CREATE, 27.17
    2000-11-20, BUY EXECUTED, Price: 22.93, Cost: 664.97, Comm 0.00
    2000-11-20, SELL CREATE, 23.34
    2000-11-21, SELL EXECUTED, Price: 23.39, Cost: 664.97, Comm 0.00
    2000-11-21, OPERATION PROFIT, GROSS 13.34, NET 13.34
    2000-11-30, BUY CREATE, 24.99
    2000-12-01, BUY EXECUTED, Price: 24.87, Cost: 795.84, Comm 0.00
    2000-12-14, SELL CREATE, 25.93
    2000-12-15, SELL EXECUTED, Price: 27.76, Cost: 795.84, Comm 0.00
    2000-12-15, OPERATION PROFIT, GROSS 92.48, NET 92.48
    2000-12-15, BUY CREATE, 26.93
    2000-12-18, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-18, BUY CREATE, 30.18
    2000-12-19, BUY EXECUTED, Price: 30.00, Cost: 900.00, Comm 0.00
    2000-12-20, SELL CREATE, 26.88
    2000-12-21, SELL EXECUTED, Price: 26.23, Cost: 900.00, Comm 0.00
    2000-12-21, OPERATION PROFIT, GROSS -113.10, NET -113.10
    2000-12-21, BUY CREATE, 27.82
    2000-12-22, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-22, BUY CREATE, 30.06
    2000-12-26, BUY EXECUTED, Price: 29.70, Cost: 772.20, Comm 0.00
    2000-12-29, SELL CREATE, 27.41
    Final Portfolio Value: 739.73
    


  • You calculate number of shares to buy based on the close price.
    Orders are executed on the next day open price. If this price is higher, then it is not enough money to buy this amount.

    In order to buy on close you need to add the following line:

    cerebro.broker.set_coc(True)
    

    In order to buy on open you may want to split the bar using BarReplayer_Open.

    Check out this discussion here -
    https://community.backtrader.com/topic/217/order_target_percent-calculation-problems


  • administrators

    @Reo-Inoue said in How to buy maximum stakes?:

                    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))
    

    Yes. You are printing EXECUTED even if the order was Canceled or received a Margin call. Hence the values containing 0.0 for price, size and other.



  • Thank you for your reply.
    I want to do that I decide to buy or sell based on close, and I order the maximum size based on next day open price.
    I refer to ab_trader link, and I understand BarReplayer_Open is based on only open price.
    So I refine the following code based on next open prices. And I have a question. How to get next open price in def _getsizing? Could you teach me?

    class LongOnly(bt.Sizer):
    params = (('stake', 1),)
    def _getsizing(self, comminfo, cash, data, isbuy):
    	if isbuy:
    		divide = math.floor(cash/data.close[0])
    		self.p.stake = divide
    		return self.p.stake
    	# Sell situation
    	position = self.broker.getposition(data)
    	if not position.size:
    		return 0  # do not sell if nothing is open
    	return self.p.stake
    


  • BarReplayer_Open splits one real bar OHLC on two virtual bars OOOO and OHLC. So next() is called twice within one real data bar, once with prices OOOO and once with prices OHLC. If you issue your buy signal on first call of next(), then sizer will use OOOO bar for position size calculations, and the order will be executed on the Open price.

    This approach is described in the sample daysteps.py

    Another solution (without BarReplayer_Open):

    divide = math.floor(cash/data.open[1])
    

    But this need to be put into try...except statement, since it will give you an error at the end of the feed.



  • @ab_trader
    I refer to https://community.backtrader.com/topic/217/order_target_percent-calculation-problems

    reply, and I tried to use BarReplayer_Open. But i get the error following

    Traceback (most recent call last):
      File "test_backtrader_nikkei_WVF2_question.py", line 159, in <module>
        cerebro.run()
      File "C:\Users\reoinoue\AppData\Local\Programs\Python\Python35\lib\site-packages\backtrader\cerebro.py", line 810, in run
        runstrat = self.runstrategies(iterstrat)
      File "C:\Users\reoinoue\AppData\Local\Programs\Python\Python35\lib\site-packages\backtrader\cerebro.py", line 934, in runstrategies
        self._runnext(runstrats)
      File "C:\Users\reoinoue\AppData\Local\Programs\Python\Python35\lib\site-packages\backtrader\cerebro.py", line 1242, in _runnext
        self._brokernotify()
      File "C:\Users\reoinoue\AppData\Local\Programs\Python\Python35\lib\site-packages\backtrader\cerebro.py", line 996, in _brokernotify
        self._broker.next()
      File "C:\Users\reoinoue\AppData\Local\Programs\Python\Python35\lib\site-packages\backtrader\brokers\bbroker.py", line 863, in next
        self._try_exec(order)
      File "C:\Users\reoinoue\AppData\Local\Programs\Python\Python35\lib\site-packages\backtrader\brokers\bbroker.py", line 809, in _try_exec
        popen = data.tick_open or data.open[0]
      File "C:\Users\reoinoue\AppData\Local\Programs\Python\Python35\lib\site-packages\backtrader\lineseries.py", line 429, in __getattr__
        return getattr(self.lines, name)
    AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'tick_open'
    

    Also, i use the setting as divide = math.floor(cash/data.open[1])
    , but it do not work property, I get the following output.

    Starting Portfolio Value: 100000.00
    2000-01-25, BUY CREATE, 26.61
    2000-01-26, BUY EXECUTED, Price: 26.76, Cost: 99975.36, Comm 0.00
    2000-01-27, SELL CREATE, 24.43
    2000-01-28, SELL EXECUTED, Price: 24.28, Cost: 99975.36, Comm 0.00
    2000-01-28, OPERATION PROFIT, GROSS -9265.28, NET -9265.28
    2000-02-02, BUY CREATE, 25.61
    2000-02-03, BUY EXECUTED, Price: 26.11, Cost: 90732.25, Comm 0.00
    2000-02-18, SELL CREATE, 27.61
    2000-02-22, SELL EXECUTED, Price: 27.88, Cost: 90732.25, Comm 0.00
    2000-02-22, OPERATION PROFIT, GROSS 6150.75, NET 6150.75
    2000-02-22, BUY CREATE, 27.97
    2000-02-23, BUY EXECUTED, Price: 28.38, Cost: 96860.94, Comm 0.00
    2000-03-30, SELL CREATE, 36.98
    2000-03-31, SELL EXECUTED, Price: 37.81, Cost: 96860.94, Comm 0.00
    2000-03-31, OPERATION PROFIT, GROSS 32184.59, NET 32184.59
    2000-04-06, BUY CREATE, 38.75
    2000-04-07, BUY EXECUTED, Price: 39.46, Cost: 129034.20, Comm 0.00
    2000-04-11, SELL CREATE, 36.48
    2000-04-12, SELL EXECUTED, Price: 36.75, Cost: 129034.20, Comm 0.00
    2000-04-12, OPERATION PROFIT, GROSS -8861.70, NET -8861.70
    2000-04-18, BUY CREATE, 37.22
    2000-04-19, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-04-27, BUY CREATE, 36.45
    2000-04-28, BUY EXECUTED, Price: 37.01, Cost: 120171.47, Comm 0.00
    2000-05-04, SELL CREATE, 35.01
    2000-05-05, SELL EXECUTED, Price: 34.89, Cost: 120171.47, Comm 0.00
    2000-05-05, OPERATION PROFIT, GROSS -6883.64, NET -6883.64
    2000-05-05, BUY CREATE, 36.22
    2000-05-08, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-05-15, BUY CREATE, 36.31
    2000-05-16, BUY EXECUTED, Price: 36.60, Cost: 113313.60, Comm 0.00
    2000-05-18, SELL CREATE, 34.45
    2000-05-19, SELL EXECUTED, Price: 33.94, Cost: 113313.60, Comm 0.00
    2000-05-19, OPERATION PROFIT, GROSS -8235.36, NET -8235.36
    2000-05-30, BUY CREATE, 34.98
    2000-05-31, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-05-31, BUY CREATE, 33.89
    2000-06-01, BUY EXECUTED, Price: 34.86, Cost: 105068.04, Comm 0.00
    2000-06-22, SELL CREATE, 38.43
    2000-06-23, SELL EXECUTED, Price: 38.10, Cost: 105068.04, Comm 0.00
    2000-06-23, OPERATION PROFIT, GROSS 9765.36, NET 9765.36
    2000-06-26, BUY CREATE, 38.99
    2000-06-27, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-06-28, BUY CREATE, 39.11
    2000-06-29, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-06-30, BUY CREATE, 39.64
    2000-07-03, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-20, BUY CREATE, 36.84
    2000-07-21, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-25, BUY CREATE, 35.83
    2000-07-26, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-26, BUY CREATE, 36.19
    2000-07-27, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-31, BUY CREATE, 35.45
    2000-08-01, BUY EXECUTED, Price: 35.46, Cost: 114819.48, Comm 0.00
    2000-08-01, SELL CREATE, 34.48
    2000-08-02, SELL EXECUTED, Price: 34.42, Cost: 114819.48, Comm 0.00
    2000-08-02, OPERATION PROFIT, GROSS -3367.52, NET -3367.52
    2000-08-03, BUY CREATE, 36.51
    2000-08-04, BUY EXECUTED, Price: 36.93, Cost: 111454.74, Comm 0.00
    2000-09-08, SELL CREATE, 40.81
    2000-09-11, SELL EXECUTED, Price: 40.58, Cost: 111454.74, Comm 0.00
    2000-09-11, OPERATION PROFIT, GROSS 11015.70, NET 11015.70
    2000-09-28, BUY CREATE, 38.42
    2000-09-29, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-10-19, BUY CREATE, 34.30
    2000-10-20, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-10-20, BUY CREATE, 33.24
    2000-10-23, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-10-23, BUY CREATE, 32.12
    2000-10-24, BUY EXECUTED, Price: 33.01, Cost: 122500.11, Comm 0.00
    2000-10-30, SELL CREATE, 29.82
    2000-10-31, SELL EXECUTED, Price: 30.76, Cost: 122500.11, Comm 0.00
    2000-10-31, OPERATION PROFIT, GROSS -8349.75, NET -8349.75
    2000-11-17, BUY CREATE, 27.17
    2000-11-20, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-11-30, BUY CREATE, 24.99
    2000-12-01, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-01, BUY CREATE, 24.93
    2000-12-04, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-04, BUY CREATE, 26.58
    2000-12-05, BUY EXECUTED, Price: 27.76, Cost: 114149.12, Comm 0.00
    2000-12-14, SELL CREATE, 25.93
    2000-12-15, SELL EXECUTED, Price: 27.76, Cost: 114149.12, Comm 0.00
    2000-12-15, OPERATION PROFIT, GROSS 0.00, NET 0.00
    2000-12-15, BUY CREATE, 26.93
    2000-12-18, BUY EXECUTED, Price: 28.29, Cost: 114150.15, Comm 0.00
    2000-12-20, SELL CREATE, 26.88
    2000-12-21, SELL EXECUTED, Price: 26.23, Cost: 114150.15, Comm 0.00
    2000-12-21, OPERATION PROFIT, GROSS -8312.10, NET -8312.10
    2000-12-21, BUY CREATE, 27.82
    2000-12-22, BUY EXECUTED, Price: 28.65, Cost: 105833.10, Comm 0.00
    2000-12-29, SELL CREATE, 27.41
    Final Portfolio Value: 101260.49
    

    How to write my code? I am so sorry to understand what you say exactly.


  • administrators

    That must be a very old version of backtrader

    @Reo-Inoue said in How to buy maximum stakes?:

    AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'tick_open'

    That error is produced because things like the applied filter are ad-hoc developments. tick_open is no longer blindly sought and that exception should not happen.



  • I check the version, and it was old. So I reinstall backtrader==1.9.43.116 and I run my program in following. It is still strange output. Are there any problems?

    Starting Portfolio Value: 100000.00
    2000-01-25, BUY CREATE, 26.61
    2000-01-26, BUY EXECUTED, Price: 26.76, Cost: 99975.36, Comm 0.00
    2000-01-27, SELL CREATE, 24.43
    2000-01-28, SELL EXECUTED, Price: 24.28, Cost: 99975.36, Comm 0.00
    2000-01-28, OPERATION PROFIT, GROSS -9265.28, NET -9265.28
    2000-02-02, BUY CREATE, 25.61
    2000-02-03, BUY EXECUTED, Price: 26.11, Cost: 90732.25, Comm 0.00
    2000-02-18, SELL CREATE, 27.61
    2000-02-22, SELL EXECUTED, Price: 27.88, Cost: 90732.25, Comm 0.00
    2000-02-22, OPERATION PROFIT, GROSS 6150.75, NET 6150.75
    2000-02-22, BUY CREATE, 27.97
    2000-02-23, BUY EXECUTED, Price: 28.38, Cost: 96860.94, Comm 0.00
    2000-03-30, SELL CREATE, 36.98
    2000-03-31, SELL EXECUTED, Price: 37.81, Cost: 96860.94, Comm 0.00
    2000-03-31, OPERATION PROFIT, GROSS 32184.59, NET 32184.59
    2000-04-06, BUY CREATE, 38.75
    2000-04-07, BUY EXECUTED, Price: 39.46, Cost: 129034.20, Comm 0.00
    2000-04-11, SELL CREATE, 36.48
    2000-04-12, SELL EXECUTED, Price: 36.75, Cost: 129034.20, Comm 0.00
    2000-04-12, OPERATION PROFIT, GROSS -8861.70, NET -8861.70
    2000-04-18, BUY CREATE, 37.22
    2000-04-19, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-04-27, BUY CREATE, 36.45
    2000-04-28, BUY EXECUTED, Price: 37.01, Cost: 120171.47, Comm 0.00
    2000-05-04, SELL CREATE, 35.01
    2000-05-05, SELL EXECUTED, Price: 34.89, Cost: 120171.47, Comm 0.00
    2000-05-05, OPERATION PROFIT, GROSS -6883.64, NET -6883.64
    2000-05-05, BUY CREATE, 36.22
    2000-05-08, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-05-15, BUY CREATE, 36.31
    2000-05-16, BUY EXECUTED, Price: 36.60, Cost: 113313.60, Comm 0.00
    2000-05-18, SELL CREATE, 34.45
    2000-05-19, SELL EXECUTED, Price: 33.94, Cost: 113313.60, Comm 0.00
    2000-05-19, OPERATION PROFIT, GROSS -8235.36, NET -8235.36
    2000-05-30, BUY CREATE, 34.98
    2000-05-31, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-05-31, BUY CREATE, 33.89
    2000-06-01, BUY EXECUTED, Price: 34.86, Cost: 105068.04, Comm 0.00
    2000-06-22, SELL CREATE, 38.43
    2000-06-23, SELL EXECUTED, Price: 38.10, Cost: 105068.04, Comm 0.00
    2000-06-23, OPERATION PROFIT, GROSS 9765.36, NET 9765.36
    2000-06-26, BUY CREATE, 38.99
    2000-06-27, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-06-28, BUY CREATE, 39.11
    2000-06-29, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-06-30, BUY CREATE, 39.64
    2000-07-03, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-20, BUY CREATE, 36.84
    2000-07-21, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-25, BUY CREATE, 35.83
    2000-07-26, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-26, BUY CREATE, 36.19
    2000-07-27, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-07-31, BUY CREATE, 35.45
    2000-08-01, BUY EXECUTED, Price: 35.46, Cost: 114819.48, Comm 0.00
    2000-08-01, SELL CREATE, 34.48
    2000-08-02, SELL EXECUTED, Price: 34.42, Cost: 114819.48, Comm 0.00
    2000-08-02, OPERATION PROFIT, GROSS -3367.52, NET -3367.52
    2000-08-03, BUY CREATE, 36.51
    2000-08-04, BUY EXECUTED, Price: 36.93, Cost: 111454.74, Comm 0.00
    2000-09-08, SELL CREATE, 40.81
    2000-09-11, SELL EXECUTED, Price: 40.58, Cost: 111454.74, Comm 0.00
    2000-09-11, OPERATION PROFIT, GROSS 11015.70, NET 11015.70
    2000-09-28, BUY CREATE, 38.42
    2000-09-29, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-10-19, BUY CREATE, 34.30
    2000-10-20, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-10-20, BUY CREATE, 33.24
    2000-10-23, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-10-23, BUY CREATE, 32.12
    2000-10-24, BUY EXECUTED, Price: 33.01, Cost: 122500.11, Comm 0.00
    2000-10-30, SELL CREATE, 29.82
    2000-10-31, SELL EXECUTED, Price: 30.76, Cost: 122500.11, Comm 0.00
    2000-10-31, OPERATION PROFIT, GROSS -8349.75, NET -8349.75
    2000-11-17, BUY CREATE, 27.17
    2000-11-20, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-11-30, BUY CREATE, 24.99
    2000-12-01, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-01, BUY CREATE, 24.93
    2000-12-04, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-04, BUY CREATE, 26.58
    2000-12-05, BUY EXECUTED, Price: 27.76, Cost: 114149.12, Comm 0.00
    2000-12-14, SELL CREATE, 25.93
    2000-12-15, SELL EXECUTED, Price: 27.76, Cost: 114149.12, Comm 0.00
    2000-12-15, OPERATION PROFIT, GROSS 0.00, NET 0.00
    2000-12-15, BUY CREATE, 26.93
    2000-12-18, BUY EXECUTED, Price: 28.29, Cost: 114150.15, Comm 0.00
    2000-12-20, SELL CREATE, 26.88
    2000-12-21, SELL EXECUTED, Price: 26.23, Cost: 114150.15, Comm 0.00
    2000-12-21, OPERATION PROFIT, GROSS -8312.10, NET -8312.10
    2000-12-21, BUY CREATE, 27.82
    2000-12-22, BUY EXECUTED, Price: 28.65, Cost: 105833.10, Comm 0.00
    2000-12-29, SELL CREATE, 27.41
    Final Portfolio Value: 101260.49
    

  • administrators

    You would have to let interested readers know what's wrong with the output. A sample indicating how you produce what you think is wrong would also be helpful.



  • @backtrader
    The wrong points are ,BUY CREATED in succession. I put the range in following. I think BUY and SELL is created each other.

    2000-11-20, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-11-30, BUY CREATE, 24.99
    2000-12-01, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-01, BUY CREATE, 24.93
    2000-12-04, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2000-12-04, BUY CREATE, 26.58
    2000-12-05, BUY EXECUTED, Price: 27.76, Cost: 114149.12, Comm 0.00
    2000-12-14, SELL CREATE, 25.93
    


  • I think your trades are not getting filled. I assume you created those orders with data.open[1]. Print out the number of shares in the created order ticket will help you find out what's going on.

    Not sure how we can make guarantee fill w/ market order at open w/ Backtrader.



  • I use BarReplayer_Open filter to define position size based on Open price. Works well, positions are filled correctly. Check out previous posts in this thread.


  • administrators

    @Reo-Inoue said in How to buy maximum stakes?:

    2000-11-20, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00

    Even if EXECUTED is printed by your code, there is no actual execution and that's why all components have a value of 0.00

    But it's impossible to see what's actually happening without a sample.


  • administrators



  • @ab_trader @backtrader
    Thank you for your advises. I try to use BarReplayer_Open , but I can not understand how to use it.
    So I use cerebro.broker.set_coc(True), and I can get hopeful output. I put code and output in following.
    ・Code

    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
    
    import backtrader.analyzers as btanalyzers
    
    import math
    import pandas as pd
    import talib
    import numpy as np
    
    
    PARAMS = (
    	('maperiod', 15), #moving average period
    	('period', 15), #
    	('willperiod', 14), #moving average period
    	('sizer', None),
    )
    
    class TestStrategy(bt.Strategy):
    	params = PARAMS
    	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.order = self.order_target_percent(target=0.1)
    		self.buyprice = None
    		self.buycomm = None
    		self.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.maperiod)
    
    	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
    				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
    		# 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()
    
    class LongOnly(bt.Sizer):
    	params = (('stake', 1),)
    	def _getsizing(self, comminfo, cash, data, isbuy):
    		if isbuy:
    			divide = math.floor(cash/data.close[0])
    #			divide = math.floor(cash/data.open[1])
    			self.p.stake = divide
    #			print(self.p.stake)
    #			print(math.floor(cash/data.close[0]))
    
    			return self.p.stake
    		# Sell situation
    		position = self.broker.getposition(data)
    		if not position.size:
    			return 0 # do not sell if nothing is open
    		return self.p.stake
    
    if __name__ == '__main__':
    	cerebro = bt.Cerebro()
    	# Add a strategy
    	cerebro.addstrategy(TestStrategy)
    	# Add Sizer
    	cerebro.addsizer(LongOnly)
    
    #	cerebro.broker.set_coc(True)
    
    	# because it could have been called from anywhere
    	modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
    	datapath = os.path.join('datas/orcl-1995-2014.txt')
    
    	# 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(2000, 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)
    
    #	In order to buy on open you may want to
    #	bt.filters.BarReplayer_Open(data)
    	cerebro.broker.set_coc(True)
    	
    	# Set the commission
    	cerebro.broker.setcommission(commission=0.0)
    	
    	# 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()
    

    ・Output

    Starting Portfolio Value: 100000.00
    2000-01-25, BUY CREATE, 26.61
    2000-01-26, BUY EXECUTED, Price: 26.61, Cost: 99973.77, Comm 0.00
    2000-01-27, SELL CREATE, 24.43
    2000-01-28, SELL EXECUTED, Price: 24.43, Cost: 99973.77, Comm 0.00
    2000-01-28, OPERATION PROFIT, GROSS -8190.26, NET -8190.26
    2000-02-02, BUY CREATE, 25.61
    2000-02-03, BUY EXECUTED, Price: 25.61, Cost: 91786.24, Comm 0.00
    2000-02-18, SELL CREATE, 27.61
    2000-02-22, SELL EXECUTED, Price: 27.61, Cost: 91786.24, Comm 0.00
    2000-02-22, OPERATION PROFIT, GROSS 7168.00, NET 7168.00
    2000-02-22, BUY CREATE, 27.97
    2000-02-23, BUY EXECUTED, Price: 27.97, Cost: 98957.86, Comm 0.00
    2000-03-30, SELL CREATE, 36.98
    2000-03-31, SELL EXECUTED, Price: 36.98, Cost: 98957.86, Comm 0.00
    2000-03-31, OPERATION PROFIT, GROSS 31877.38, NET 31877.38
    2000-04-06, BUY CREATE, 38.75
    2000-04-07, BUY EXECUTED, Price: 38.75, Cost: 130820.00, Comm 0.00
    2000-04-11, SELL CREATE, 36.48
    2000-04-12, SELL EXECUTED, Price: 36.48, Cost: 130820.00, Comm 0.00
    2000-04-12, OPERATION PROFIT, GROSS -7663.52, NET -7663.52
    2000-04-18, BUY CREATE, 37.22
    2000-04-19, BUY EXECUTED, Price: 37.22, Cost: 123160.98, Comm 0.00
    2000-04-19, SELL CREATE, 35.16
    2000-04-20, SELL EXECUTED, Price: 35.16, Cost: 123160.98, Comm 0.00
    2000-04-20, OPERATION PROFIT, GROSS -6816.54, NET -6816.54
    2000-04-27, BUY CREATE, 36.45
    2000-04-28, BUY EXECUTED, Price: 36.45, Cost: 116348.40, Comm 0.00
    2000-05-04, SELL CREATE, 35.01
    2000-05-05, SELL EXECUTED, Price: 35.01, Cost: 116348.40, Comm 0.00
    2000-05-05, OPERATION PROFIT, GROSS -4596.48, NET -4596.48
    2000-05-05, BUY CREATE, 36.22
    2000-05-08, BUY EXECUTED, Price: 36.22, Cost: 111774.92, Comm 0.00
    2000-05-08, SELL CREATE, 34.10
    2000-05-09, SELL EXECUTED, Price: 34.10, Cost: 111774.92, Comm 0.00
    2000-05-09, OPERATION PROFIT, GROSS -6542.32, NET -6542.32
    2000-05-15, BUY CREATE, 36.31
    2000-05-16, BUY EXECUTED, Price: 36.31, Cost: 105226.38, Comm 0.00
    2000-05-18, SELL CREATE, 34.45
    2000-05-19, SELL EXECUTED, Price: 34.45, Cost: 105226.38, Comm 0.00
    2000-05-19, OPERATION PROFIT, GROSS -5390.28, NET -5390.28
    2000-05-30, BUY CREATE, 34.98
    2000-05-31, BUY EXECUTED, Price: 34.98, Cost: 99832.92, Comm 0.00
    2000-06-22, SELL CREATE, 38.43
    2000-06-23, SELL EXECUTED, Price: 38.43, Cost: 99832.92, Comm 0.00
    2000-06-23, OPERATION PROFIT, GROSS 9846.30, NET 9846.30
    2000-06-26, BUY CREATE, 38.99
    2000-06-27, BUY EXECUTED, Price: 38.99, Cost: 109678.87, Comm 0.00
    2000-06-27, SELL CREATE, 38.78
    2000-06-28, SELL EXECUTED, Price: 38.78, Cost: 109678.87, Comm 0.00
    2000-06-28, OPERATION PROFIT, GROSS -590.73, NET -590.73
    2000-06-28, BUY CREATE, 39.11
    2000-06-29, BUY EXECUTED, Price: 39.11, Cost: 109077.79, Comm 0.00
    2000-06-29, SELL CREATE, 38.13
    2000-06-30, SELL EXECUTED, Price: 38.13, Cost: 109077.79, Comm 0.00
    2000-06-30, OPERATION PROFIT, GROSS -2733.22, NET -2733.22
    2000-06-30, BUY CREATE, 39.64
    2000-07-03, BUY EXECUTED, Price: 39.64, Cost: 106354.12, Comm 0.00
    2000-07-03, SELL CREATE, 37.81
    2000-07-05, SELL EXECUTED, Price: 37.81, Cost: 106354.12, Comm 0.00
    2000-07-05, OPERATION PROFIT, GROSS -4909.89, NET -4909.89
    2000-07-20, BUY CREATE, 36.84
    2000-07-21, BUY EXECUTED, Price: 36.84, Cost: 101457.36, Comm 0.00
    2000-07-21, SELL CREATE, 35.57
    2000-07-24, SELL EXECUTED, Price: 35.57, Cost: 101457.36, Comm 0.00
    2000-07-24, OPERATION PROFIT, GROSS -3497.58, NET -3497.58
    2000-07-25, BUY CREATE, 35.83
    2000-07-26, BUY EXECUTED, Price: 35.83, Cost: 97959.22, Comm 0.00
    2000-07-27, SELL CREATE, 35.39
    2000-07-28, SELL EXECUTED, Price: 35.39, Cost: 97959.22, Comm 0.00
    2000-07-28, OPERATION PROFIT, GROSS -1202.96, NET -1202.96
    2000-07-31, BUY CREATE, 35.45
    2000-08-01, BUY EXECUTED, Price: 35.45, Cost: 96743.05, Comm 0.00
    2000-08-01, SELL CREATE, 34.48
    2000-08-02, SELL EXECUTED, Price: 34.48, Cost: 96743.05, Comm 0.00
    2000-08-02, OPERATION PROFIT, GROSS -2647.13, NET -2647.13
    2000-08-03, BUY CREATE, 36.51
    2000-08-04, BUY EXECUTED, Price: 36.51, Cost: 94086.27, Comm 0.00
    2000-09-08, SELL CREATE, 40.81
    2000-09-11, SELL EXECUTED, Price: 40.81, Cost: 94086.27, Comm 0.00
    2000-09-11, OPERATION PROFIT, GROSS 11081.10, NET 11081.10
    2000-09-28, BUY CREATE, 38.42
    2000-09-29, BUY EXECUTED, Price: 38.42, Cost: 105155.54, Comm 0.00
    2000-09-29, SELL CREATE, 37.13
    2000-10-02, SELL EXECUTED, Price: 37.13, Cost: 105155.54, Comm 0.00
    2000-10-02, OPERATION PROFIT, GROSS -3530.73, NET -3530.73
    2000-10-19, BUY CREATE, 34.30
    2000-10-20, BUY EXECUTED, Price: 34.30, Cost: 101630.90, Comm 0.00
    2000-10-30, SELL CREATE, 29.82
    2000-10-31, SELL EXECUTED, Price: 29.82, Cost: 101630.90, Comm 0.00
    2000-10-31, OPERATION PROFIT, GROSS -13274.24, NET -13274.24
    2000-11-17, BUY CREATE, 27.17
    2000-11-20, BUY EXECUTED, Price: 27.17, Cost: 88384.01, Comm 0.00
    2000-11-20, SELL CREATE, 23.34
    2000-11-21, SELL EXECUTED, Price: 23.34, Cost: 88384.01, Comm 0.00
    2000-11-21, OPERATION PROFIT, GROSS -12458.99, NET -12458.99
    2000-11-30, BUY CREATE, 24.99
    2000-12-01, BUY EXECUTED, Price: 24.99, Cost: 75919.62, Comm 0.00
    2000-12-14, SELL CREATE, 25.93
    2000-12-15, SELL EXECUTED, Price: 25.93, Cost: 75919.62, Comm 0.00
    2000-12-15, OPERATION PROFIT, GROSS 2855.72, NET 2855.72
    2000-12-15, BUY CREATE, 26.93
    2000-12-18, BUY EXECUTED, Price: 26.93, Cost: 78770.25, Comm 0.00
    2000-12-20, SELL CREATE, 26.88
    2000-12-21, SELL EXECUTED, Price: 26.88, Cost: 78770.25, Comm 0.00
    2000-12-21, OPERATION PROFIT, GROSS -146.25, NET -146.25
    2000-12-21, BUY CREATE, 27.82
    2000-12-22, BUY EXECUTED, Price: 27.82, Cost: 78619.32, Comm 0.00
    2000-12-29, SELL CREATE, 27.41
    Final Portfolio Value: 77478.72
    

Log in to reply
 

Looks like your connection to Backtrader Community was lost, please wait while we try to reconnect.