Overall Statistics
Total Trades
4
Average Win
2.18%
Average Loss
-0.46%
Compounding Annual Return
8.841%
Drawdown
3.500%
Expectancy
1.875
Net Profit
1.709%
Sharpe Ratio
0.859
Probabilistic Sharpe Ratio
46.797%
Loss Rate
50%
Win Rate
50%
Profit-Loss Ratio
4.75
Alpha
0.085
Beta
-0.017
Annual Standard Deviation
0.093
Annual Variance
0.009
Information Ratio
-1.511
Tracking Error
0.152
Treynor Ratio
-4.818
Total Fees
$5.42
Estimated Strategy Capacity
$610000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
from QuantConnect.Statistics import *

class SmoothVioletAlligator(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 11, 21)  # Set Start Date
        self.SetEndDate(2021, 2, 1)
        self.SetCash(100000)  # Set Strategy Cash
        
        self.AddEquity("SPY", Resolution.Daily)
        self.spyEMA = self.EMA("SPY", 21, Resolution.Daily, Field.Close)
        self.EnableAutomaticIndicatorWarmUp = True
        
        self.lastAction = None
    
    def OnData(self, data):
        '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
            Arguments:
                data: Slice object keyed by symbol containing the stock data
        '''
        
        if not self.spyEMA.IsReady:
            return
        
        s = 'SPY'
        
        if not (data.ContainsKey(s) and data.Bars.ContainsKey(s)):
            return
    

        if self.lastAction is not None and self.lastAction.date() == self.Time.date(): return
        self.lastAction = self.Time

        if not self.Portfolio.Invested:
            if data[s].Close > self.spyEMA.Current.Value:
                self.SetHoldings(s, 1)
        
        elif self.Portfolio.Invested and data[s].Close < self.spyEMA.Current.Value:
            self.Liquidate(s)
        
    def OnEndOfAlgorithm(self):
        for trade in self.TradeBuilder.ClosedTrades:
           self.Log(f"-Trade- \n{self.trade_to_string(trade)}")
           
        statistics = TradeStatistics(self.TradeBuilder.ClosedTrades)
        self.Log(f"-Statistics- \n{self.statistics_to_string(statistics)}")
                
    def statistics_to_string(self, statistics):
        return 'AverageEndTradeDrawdown={0};AverageLosingTradeDuration={1};AverageLoss={2};AverageMAE={3};AverageMFE={4};AverageProfit={5};AverageProfitLoss={6};AverageTradeDuration={7};AverageWinningTradeDuration={8};EndDateTime={9};LargestLoss={10};LargestMAE={11};LargestMFE={12};LargestProfit={13};LossRate={14};MaxConsecutiveLosingTrades={15};MaxConsecutiveWinningTrades={16};MaximumClosedTradeDrawdown={17};MaximumDrawdownDuration={18};MaximumEndTradeDrawdown={19};MaximumIntraTradeDrawdown={20};NumberOfLosingTrades={21};NumberOfWinningTrades={22};ProfitFactor={23};ProfitLossDownsideDeviation={24};ProfitLossRatio={25};ProfitLossStandardDeviation={26};ProfitToMaxDrawdownRatio={27};SharpeRatio={28};SortinoRatio={29};StartDateTime={30};TotalFees={31};TotalLoss={32};TotalNumberOfTrades={33};TotalProfit={34};TotalProfitLoss={35};WinLossRatio={36};WinRate={37}'.format(
            statistics.AverageEndTradeDrawdown,
            statistics.AverageLosingTradeDuration,
            statistics.AverageLoss,
            statistics.AverageMAE,
            statistics.AverageMFE,
            statistics.AverageProfit,
            statistics.AverageProfitLoss,
            statistics.AverageTradeDuration,
            statistics.AverageWinningTradeDuration,
            statistics.EndDateTime,
            statistics.LargestLoss,
            statistics.LargestMAE,
            statistics.LargestMFE,
            statistics.LargestProfit,
            statistics.LossRate,
            statistics.MaxConsecutiveLosingTrades,
            statistics.MaxConsecutiveWinningTrades,
            statistics.MaximumClosedTradeDrawdown,
            statistics.MaximumDrawdownDuration,
            statistics.MaximumEndTradeDrawdown,
            statistics.MaximumIntraTradeDrawdown,
            statistics.NumberOfLosingTrades,
            statistics.NumberOfWinningTrades,
            statistics.ProfitFactor,
            statistics.ProfitLossDownsideDeviation,
            statistics.ProfitLossRatio,
            statistics.ProfitLossStandardDeviation,
            statistics.ProfitToMaxDrawdownRatio,
            statistics.SharpeRatio,
            statistics.SortinoRatio,
            statistics.StartDateTime,
            statistics.TotalFees,
            statistics.TotalLoss,
            statistics.TotalNumberOfTrades,
            statistics.TotalProfit,
            statistics.TotalProfitLoss,
            statistics.WinLossRatio,
            statistics.WinRate)
        
    def trade_to_string(self, trade):
        return 'Symbol: {0} EntryTime: {1} EntryPrice {2} Direction: {3} Quantity: {4} ExitTime: {5} ExitPrice: {6} ProfitLoss: {7} TotalFees: {8} MAE: {9} MFE: {10} EndTradeDrawdown: {11}'.format(
            trade.Symbol, 
            trade.EntryTime, 
            trade.EntryPrice, 
            trade.Direction, 
            trade.Quantity,
            trade.ExitTime,
            trade.ExitPrice,
            trade.ProfitLoss,
            trade.TotalFees,
            trade.MAE,
            trade.MFE,
            trade.EndTradeDrawdown)