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)