For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
MACD strategy not executed at all
-
I try to deploy this MACD strategy with ta-lib indicator, but in the backtest is not working , the order never executed it
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 talib as tab import numpy as np # Import the backtrader platform import backtrader as bt # Create a Stratey class MACDtrategy(bt.Strategy): """params = ( ('Fastperiod', 12), ('Slowperiod', 26), ('Signalperiod', 9), )""" 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 # Instantiate MACD indicators self.macd, self.macdsignal, self.macdhist = tab.MACD(np.array(self.dataclose), fastperiod=12, slowperiod=26, signalperiod=9) #self.rsi = tab.RSI(np.array(self.dataclose),timeperiod=10) 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): # 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.macdhist[0] > 0 and self.macdhist[-1] < 0 : # BUY, BUY, BUY!!! (with 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() """elif self.macdhist[0] < 0 and self.macdhist[-1] > 0: self.log(f'SELL CREATE {self.dataclose[0]:2f}') # Keep track of the created order to avoid a 2nd order self.order = self.sell()""" else: # Already in the market ... we might sell if self.macdhist[0] < 0 and self.macdhist[-1] > 0 : self.log('SELL CREATE, {0:8.2f}'.format(self.dataclose[0])) self.order = self.sell() if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() # Add a strategy cerebro.addstrategy(MACDStrategy) # 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, '../../datas/orcl-1995-2014.txt') # Create a Data Feed data = bt.feeds.YahooFinanceCSVData(dataname='AMZN.csv') # Do not pass values before this date #fromdate=datetime.datetime(2000, 1, 1), # Do not pass values after this date #todate=datetime.datetime(2010, 12, 31), #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=10) # Set the commission - 0.1% ... divide by 100 to remove the % cerebro.broker.setcommission(commission=0.001) # 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())
-
Hey Emi!
I'd say that it's because of the way you are calling the macd value.self.macd[0] > self.p.macd_umbral
This is the way I use it in my strategy, maybe could work for you.