Overall Statistics
Total Trades
389
Average Win
3.07%
Average Loss
-0.84%
Compounding Annual Return
17.037%
Drawdown
9.000%
Expectancy
0.506
Net Profit
119.753%
Sharpe Ratio
1.355
Probabilistic Sharpe Ratio
77.712%
Loss Rate
68%
Win Rate
32%
Profit-Loss Ratio
3.64
Alpha
0.088
Beta
0.291
Annual Standard Deviation
0.087
Annual Variance
0.008
Information Ratio
0.111
Tracking Error
0.138
Treynor Ratio
0.405
Total Fees
$977.66
Estimated Strategy Capacity
$28000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
# SPY Bollinger Band LE with Stop Loss and Take Profit
# -------------------------------------------------------------------
STOCK = "SPY"; BAR = 60; BB = 40; MULT = 0.5; SL = -0.005; TP = 0.03;
# -------------------------------------------------------------------

class MeasuredRedOrangeChicken(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2017, 6, 1)  
        self.SetEndDate(2022, 6, 1) 
        self.SetCash(100000)  
        res = Resolution.Minute
        self.stock = self.AddEquity(STOCK, res).Symbol
        consolidator = TradeBarConsolidator(timedelta(minutes = BAR))
        self.Consolidate(self.stock, timedelta(minutes = BAR), self.BarHandler)
        self.bb = BollingerBands(BB, MULT, MovingAverageType.Exponential)
        self.RegisterIndicator(self.stock, self.bb, consolidator)
        self.SetWarmUp(5*BAR*BB, res)
        

    def BarHandler(self, consolidated):
        if self.IsWarmingUp: return
        if not self.bb.IsReady: return 
        
        price = self.Securities[self.stock].Price
        pnl = self.Securities[self.stock].Holdings.UnrealizedProfitPercent

        if not self.Portfolio[self.stock].Invested:  
            if price > self.bb.UpperBand.Current.Value:
                self.SetHoldings(self.stock, 1, False, "Over UB")

        elif self.Portfolio[self.stock].Invested: 
            if pnl < SL:
                self.Liquidate(self.stock, "Stop Loss")
            elif pnl > TP:
                self.Liquidate(self.stock, "Take Profit")