Overall Statistics
Total Trades
4292
Average Win
0.42%
Average Loss
-0.28%
Compounding Annual Return
22.325%
Drawdown
10.900%
Expectancy
0.143
Net Profit
126.471%
Sharpe Ratio
1.274
Probabilistic Sharpe Ratio
66.984%
Loss Rate
55%
Win Rate
45%
Profit-Loss Ratio
1.53
Alpha
0.106
Beta
0.433
Annual Standard Deviation
0.124
Annual Variance
0.015
Information Ratio
0.266
Tracking Error
0.139
Treynor Ratio
0.365
Total Fees
$13599.06
Estimated Strategy Capacity
$13000000.00
Lowest Capacity Asset
QQQ RIWIV7K5Z9LX
class MultidimensionalVentralCoil(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2018, 1, 1)  # Set Start Date
        self.SetCash(100000)  # Set Strategy Cash
        self.QQQ = self.AddEquity("QQQ", Resolution.Minute).Symbol
        self.rsi = RelativeStrengthIndex(14)
        self.RegisterIndicator("QQQ", self.rsi, timedelta(minutes=30))
        self.rsiSMA = IndicatorExtensions.SMA(self.rsi, 14)
        
        thirtyMinuteConsolidator = TradeBarConsolidator(timedelta(minutes=30))
        self.SubscriptionManager.AddConsolidator(self.QQQ, thirtyMinuteConsolidator)
        thirtyMinuteConsolidator.DataConsolidated += self.OnThirtyMinuteBar
        
        self.barWindow = RollingWindow[TradeBar](2)
        self.rsiWindow = RollingWindow[IndicatorDataPoint](2)     
        self.rsi.Updated += self.rsiUpdated
        
        self.entryPrice = 0
        
        self.profit = self.GetParameter("profit")
        self.profit = float(self.profit) if self.profit else 0.07
        
        self.loss = self.GetParameter("loss")
        self.loss = float(self.loss) if self.loss else -0.05       
        
    def rsiUpdated(self, sender, updated):
        self.rsiWindow.Add(updated)        

    def OnThirtyMinuteBar(self, sender, bar):
        self.barWindow.Add(bar)
        
        if not self.barWindow.IsReady:
            return
        
        holdings = self.Portfolio["QQQ"].Quantity
        
        currentBar = self.barWindow[0]
        previousBar = self.barWindow[1]
        
        currentHigh = currentBar.High
        currentLow = currentBar.Low
        
        currentRsi = self.rsiWindow[0]
        previousRsi = self.rsiWindow[1]
        
        # currentRsisma = 
        # previousRsisma =        
        
        previousHigh = previousBar.High
        previousLow = previousBar.Low
        
        if holdings == 0:
            if self.rsi.Current.Value > self.rsiSMA.Current.Value:
                self.SetHoldings("QQQ", 1)
            # else:
            #     self.SetHoldings("QQQ", 0)
                
        if holdings < 0 and currentLow > previousLow or self.Portfolio["QQQ"].UnrealizedProfitPercent > self.profit or self.Portfolio["QQQ"].UnrealizedProfitPercent < self.loss:
            self.Liquidate("QQQ")
                
        if holdings > 0 and currentHigh < previousHigh or self.Portfolio["QQQ"].UnrealizedProfitPercent > self.profit or self.Portfolio["QQQ"].UnrealizedProfitPercent < self.loss:            
            self.Liquidate("QQQ")
        
        self.Plot("My Custom Chart", "RSI", self.rsi.Current.Value)
        self.Plot("My Custom Chart", "RSI SMA", self.rsiSMA.Current.Value)

# class IndicatorTests(QCAlgorithm):
#     def Initialize(self):
#       # In addition to other initialize logic:
#       self.SetStartDate(2022, 1, 10)
#       #self.SetEndDate(2019, 1, 1)
#       self.SetWarmUp(14)
       
#       self.AddEquity("XMB", Resolution.Hour)
#       #self.vix = self.AddIndex("VIX", Resolution.Minute).Symbol
       
#       self.rsi = self.RSI("XMB", 14, Resolution.Minute)    # Creating a RSI
#       self.rsiSMA = IndicatorExtensions.SMA(self.rsi, 14) # Creating the SMA on the RSI

#         # Creates a Rolling Window indicator to keep the 2 TradeBar
#       self.window = RollingWindow[TradeBar](2)    # For other security types, use QuoteBar
       

#     def OnData(self, data):
        
#         if self.IsWarmingUp: return
#         if data.ContainsKey("XMB"):
#             self.window.Add(data.Bars["XMB"])

#         currentHigh = self.window[0].High
#         previousHigh = self.window[1].High
        
#         self.Debug(self.window[0].High)

        # self.Plot("RSI SMA", "RSI", self.rsi.Current.Value)
        # self.Plot("RSI SMA", "SMA of RSI", self.rsiSMA.Current.Value)
        
        # if self.rsi.Current.Value > self.rsiSMA.Current.Value and self.rsi.Current.Value < 50 and not self.Securities[self.vix].Price > 40 and currentVol.Value > previousVol.Value*2:
        #     self.SetHoldings("XMB", 1)

        # elif self.rsi.Current.Value > 70 and self.rsi.Current.Value < self.rsiSMA.Current.Value or self.Securities[self.vix].Price > 40 :
        #     self.Liquidate()
        #     # self.Plot("RSI SMA", "SMA of RSI 2", self.rsiSMA2.Current.Value)

    # def OnEndOfDay(self):
        # if self.Portfolio["XMB"].UnrealizedProfitPercent < -0.02:
        #     self.Liquidate()
        #     #self.AllowTrades = False