Overall Statistics |
Total Trades 40 Average Win 4.82% Average Loss -2.91% Compounding Annual Return 6.599% Drawdown 12.200% Expectancy 0.593 Net Profit 37.668% Sharpe Ratio 0.683 Loss Rate 40% Win Rate 60% Profit-Loss Ratio 1.65 Alpha 0.156 Beta -4.35 Annual Standard Deviation 0.101 Annual Variance 0.01 Information Ratio 0.485 Tracking Error 0.101 Treynor Ratio -0.016 Total Fees $191.99 |
from datetime import datetime ### <summary> ### Simple indicator demonstration algorithm of MACD ### </summary> ### <meta name="tag" content="indicators" /> ### <meta name="tag" content="indicator classes" /> ### <meta name="tag" content="plotting indicators" /> class MACDTrendAlgorithm(QCAlgorithm): def Initialize(self): '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.''' self.SetStartDate(2010, 1, 1) #Set Start Date self.SetEndDate(2015, 1, 1) #Set End Date self.SetCash(100000) #Set Strategy Cash # Find more symbols here: http://quantconnect.com/data self.AddEquity("SPY", Resolution.Daily) # define our daily macd(12,26) with a 9 day signal self.__macd = self.MACD("SPY", 12, 26, 9, MovingAverageType.Exponential, Resolution.Daily) self.__previous = datetime.min self.PlotIndicator("MACD", True, self.__macd, self.__macd.Signal) self.PlotIndicator("SPY", self.__macd.Fast, self.__macd.Slow) overlayPlot = Chart("Overlay Plot") overlayPlot.AddSeries(Series("SPY", SeriesType.Line, 0)) overlayPlot.AddSeries(Series("Buy", SeriesType.Scatter, 0)) overlayPlot.AddSeries(Series("Sell", SeriesType.Scatter, 0)) overlayPlot.AddSeries(Series("MACD", SeriesType.Line, 1)) overlayPlot.AddSeries(Series("MACD_Signal", SeriesType.Line, 1)) self.AddChart(overlayPlot) def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.''' # wait for our macd to fully initialize if not self.__macd.IsReady: return # only once per day if self.__previous.date() == self.Time.date(): return # define a small tolerance on our checks to avoid bouncing tolerance = 0.0025 holdings = self.Portfolio["SPY"].Quantity signalDeltaPercent = (self.__macd.Current.Value - self.__macd.Signal.Current.Value)/self.__macd.Fast.Current.Value buy_signal_triggered, sell_signal_triggered = False, False # if our macd is greater than our signal, then let's go long if holdings <= 0 and signalDeltaPercent > tolerance: # 0.01% # longterm says buy as well self.SetHoldings("SPY", 1.0) buy_signal_triggered = True # of our macd is less than our signal, then let's go short elif holdings >= 0 and signalDeltaPercent < -tolerance: self.Liquidate("SPY") sell_signal_triggered = True self.__previous = self.Time if buy_signal_triggered: self.Plot("Overlay Plot", "Buy", data["SPY"].Value) elif sell_signal_triggered: self.Plot("Overlay Plot", "Sell", data["SPY"].Value) self.Plot("Overlay Plot", "SPY", data["SPY"].Value) self.Plot("Overlay Plot", "MACD", self.__macd.Current.Value) self.Plot("Overlay Plot", "MACD_Signal", self.__macd.Signal.Current.Value)