Overall Statistics
Total Orders
567
Average Win
0.35%
Average Loss
-0.47%
Compounding Annual Return
28.547%
Drawdown
12.500%
Expectancy
0.200
Start Equity
10000
End Equity
12834.06
Net Profit
28.341%
Sharpe Ratio
1.119
Sortino Ratio
1.252
Probabilistic Sharpe Ratio
67.225%
Loss Rate
31%
Win Rate
69%
Profit-Loss Ratio
0.74
Alpha
0.049
Beta
0.757
Annual Standard Deviation
0.132
Annual Variance
0.018
Information Ratio
0.164
Tracking Error
0.107
Treynor Ratio
0.196
Total Fees
$567.00
Estimated Strategy Capacity
$4700000.00
Lowest Capacity Asset
ORCL R735QTJ8XC9X
Portfolio Turnover
14.75%
from AlgorithmImports import *

class RsiStrategyAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2023, 1, 1)
        self.SetEndDate(2023, 12, 31)
        self.SetCash(10000)

        self.tickers = ["TSLA", "GOOGL", "NVDA", "MSFT", "META", "HIMS", "UPST", "ORCL", "COIN", "AMD"]
        self.symbols = []
        self.rsi = {}

        for ticker in self.tickers:
            symbol = self.AddEquity(ticker, Resolution.Minute).Symbol
            self.symbols.append(symbol)

            # Create a 15-minute consolidator for each symbol
            consolidator = TradeBarConsolidator(timedelta(minutes=15))
            self.SubscriptionManager.AddConsolidator(symbol, consolidator)

            # Attach RSI to each consolidator
            rsi = RelativeStrengthIndex(14, MovingAverageType.Wilders)
            self.rsi[symbol] = rsi
            self.RegisterIndicator(symbol, rsi, consolidator)

            consolidator.DataConsolidated += self.OnDataConsolidated

    def OnDataConsolidated(self, sender, bar):
        symbol = bar.Symbol
        rsi = self.rsi[symbol]

        if not rsi.IsReady:
            return

        rsi_value = rsi.Current.Value
        holdings = self.Portfolio[symbol].Quantity

        if rsi_value <= 30 and holdings == 0:
            self.SetHoldings(symbol, 0.1)
            self.Debug(f"{self.Time} BUY {symbol.Value} | RSI: {rsi_value:.2f}")

        elif rsi_value >= 70 and holdings > 0:
            self.Liquidate(symbol)
            self.Debug(f"{self.Time} SELL {symbol.Value} | RSI: {rsi_value:.2f}")

    def OnData(self, data):
        pass