Hi,
Thanks very much for your answer. It works now. I should have been a little bit tired Friday. I made corrections on the indicator.
You were right, There was a mistake on the name of the indicator.
import pandas as pd
import backtrader as bt
from backtrader.feeds import PandasData
import backtrader.indicators as btind
# load dataframe
dataframe = pd.read_excel("STOXX50 bis.xlsx",names = ["Datetime","Open","High","Low","Close","Volume","signal"])
dataframe['Datetime'] = pd.to_datetime(dataframe['Datetime'],format='%d/%m-/y')
class PandasData_Signal(PandasData):
# Add a 'action' line to the inherited ones from the base class
lines = ('signal',)
# add the parameter to the parameters inherited from the base class
params = (('signal', 6),)
data = PandasData_Signal(dataname=dataframe,
datetime=0,
open=1,
high=2,
low=3,
close=4,
volume=-1,
openinterest=-1,
signal=6,
#openinterest=-1
)
class MLSignal(bt.SignalStrategy):
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
self.signal = self.datas[0].signal
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, 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')
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):
self.log(' Close, %.2f' % self.dataclose[0])
#Check if we are in the market
if not self.position :
if self.signal[0] == 1:
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 self.signal[0] == 0:
self.log('SELL CREATE, %.2f' % self.dataclose[0])
self.order = self.sell()
cerebro = bt.Cerebro()
# Set our desired cash start
cerebro.broker.setcash(4000.0)
cerebro.adddata(data)
cerebro.addstrategy(MLSignal)
cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
print('Final value is %.2f times the initial investment'%(cerebro.broker.getvalue()))
cerebro.plot()
I wish you a very nice day,
Best,
Boris