@run-out I fixed it by also adding the buy and sell statements into the for loop in next. However the buys and sells still don´t get displayed in the plot and it doesn´t seem to buy and sell everytime the price is above/under the top/bot-band. So my main problem right now is the plot missing the buys and sells.
Thats my current code:
import backtrader as bt
import backtrader.feeds as btfeed
import datetime
# from datetime import datetime
class dataFeed(btfeed.GenericCSVData):
params = (
('dtformat', '%Y-%m-%d %H:%M:%S'),
('datetime', 0),
('open', 1),
('high', 2),
('low', 3),
('close', 4),
('volume', 5),
('openinterest', -1)
)
class firstStrategy(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):
# self.dataclose = self.datas[0].close
self.bb_inds = dict()
for d in self.datas:
bb = bt.ind.BollingerBands(d, period=21, devfactor=2.0,
movav=bt.ind.MovAv.Simple)
self.bb_inds[d] = dict()
self.bb_inds[d]["bb_top"] = bb.top
self.bb_inds[d]["bb_bot"] = bb.bot
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):
for d in self.datas:
dt, dn = self.datetime.date(), d._name
pos = self.getposition(d).size
# Simply log the closing price of the series from the reference
# self.log('Close, %.2f' % d.close[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:
if d.close[0] < self.bb_inds[d]["bb_bot"][0]:
# 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' % d.close[0])
# Keep track of the created order to avoid a 2nd order
#self.order = self.buy()
self.buy(data=d)
# Already in the market ... we might sell
if d.close[0] > self.bb_inds[d]["bb_top"][0]:
# SELL, SELL, SELL!!! (with all possible default parameters)
self.log('SELL CREATE, %.2f' % d.close[0])
# Keep track of the created order to avoid a 2nd order
#self.order = self.sell()
self.sell(data=d)
if __name__ == '__main__':
# Create a cerebro entity
cerebro = bt.Cerebro()
startcash = 10000
# Add a strategy
cerebro.addstrategy(firstStrategy)
# cerebro.addindicator(BollingerBands)
datalist = [("AM.ATVI.csv"), ("AM.MO.csv"), ("AM.GM.csv"), ("AM.CL.csv")]
for i in range(len(datalist)):
data = dataFeed(dataname=datalist[i], timeframe=bt.TimeFrame.Minutes, compression=1)
cerebro.adddata(data, name=datalist[i])
# Set our desired cash start
cerebro.broker.setcash(startcash)
# Set the commission
# cerebro.broker.setcommission(commission=0.0005)
# Add a sizer
# cerebro.addsizer(bt.sizers.PercentSizer, percents=50)
cerebro.run()
# Print out the starting conditions
print('Starting Portfolio Value: %.2f' % startcash)
# Get final portfolio Value
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
# Print out the final result
print('Final Portfolio Value: ${}'.format(portvalue))
print('P/L: ${}'.format(pnl))
cerebro.plot()
My plot: