Overall Statistics
Total Orders
68
Average Win
3.09%
Average Loss
-0.91%
Compounding Annual Return
-1.738%
Drawdown
28.300%
Expectancy
-0.392
Start Equity
1000000.00
End Equity
986793.10
Net Profit
-1.321%
Sharpe Ratio
-0.107
Sortino Ratio
-0.117
Probabilistic Sharpe Ratio
17.174%
Loss Rate
86%
Win Rate
14%
Profit-Loss Ratio
3.41
Alpha
-0.057
Beta
0.444
Annual Standard Deviation
0.274
Annual Variance
0.075
Information Ratio
-0.328
Tracking Error
0.28
Treynor Ratio
-0.066
Total Fees
$357.47
Estimated Strategy Capacity
$18000000.00
Lowest Capacity Asset
ETHUSD 2XR
Portfolio Turnover
4.42%
Drawdown Recovery
18
from AlgorithmImports import *

class TopCryptoStrategy(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2019, 1,1)  # Set Start Date
        self.SetEndDate(2024, 1, 1)
        self.SetCash(100000)  # Set Strategy Cash

        # Define the symbols
        self.crypto_symbols = ["BTCUSD", "ETHUSD"]
        self.stock_symbols = ["AAPL","META", "NVDA","TSM","INTU","BX" "TSLA", "PWR", "NUE","ZM", "NIO", "BRKR", "AXON", "ODFL", "PINS", "EFX","BLDR","ENPH"]
        self.fx_symbols = ["GBPUSD"]  # Add GBPUSD
        self.SetBenchmark("SPY")

        # Attempt to add each cryptocurrency, stock, and FX pair
        self.active_symbols = []
        for symbol in self.crypto_symbols:
            try:
                self.AddCrypto(symbol, Resolution.Daily)
                self.active_symbols.append(symbol)
            except Exception as e:
                self.Debug(f"Unable to add symbol: {symbol}. Exception: {e}")

        for symbol in self.stock_symbols:
            try:
                self.AddEquity(symbol, Resolution.Daily)
                self.active_symbols.append(symbol)
            except Exception as e:
                self.Debug(f"Unable to add symbol: {symbol}. Exception: {e}")

        for symbol in self.fx_symbols:  # Add FX symbols
            try:
                self.AddForex(symbol, Resolution.Daily)
                self.active_symbols.append(symbol)
            except Exception as e:
                self.Debug(f"Unable to add symbol: {symbol}. Exception: {e}")

        # Define the technical indicators
        self.supertrend1 = {}
        self.supertrend2 = {}
        self.rsi = {}
        self.ema100 = {}
        self.weekly_twap = {}
        self.entry_prices = {}

        for symbol in self.active_symbols:
            self.supertrend1[symbol] = self.STR(symbol, 10, 2.5, MovingAverageType.Wilders)
            self.supertrend2[symbol] = self.STR(symbol, 10, 3, MovingAverageType.Wilders)
            self.rsi[symbol] = self.RSI(symbol, 10, MovingAverageType.Wilders, Resolution.Daily)
            self.ema100[symbol] = self.EMA(symbol, 100, Resolution.Daily)
            self.weekly_twap[symbol] = self.WeeklyTwap(symbol, 5)
            self.entry_prices[symbol] = None

        self.SetWarmUp(100, Resolution.Daily)  # Warm up period for 100 days

    def WeeklyTwap(self, symbol, num_weeks):
        twap = self.SMA(symbol, num_weeks * 5, Resolution.Daily)  # Assuming 5 trading days per week
        return twap

    def OnData(self, data):
        if self.IsWarmingUp:
            return

        for symbol in self.active_symbols:
            if not data.Bars.ContainsKey(symbol):
                continue

            bar = data.Bars[symbol]

            # Get current values
            current_price = bar.Close
            supertrend1 = self.supertrend1[symbol].Current.Value
            supertrend2 = self.supertrend2[symbol].Current.Value
            rsi = self.rsi[symbol].Current.Value
            ema100 = self.ema100[symbol].Current.Value
            weekly_twap = self.weekly_twap[symbol].Current.Value

            # Define factor based on asset type
            factor = 1.2 if symbol in self.crypto_symbols else 1.04
            factor = 1 if symbol in self.fx_symbols else factor  # Set factor to 1 for FX pairs

            # Entry condition
            if self.entry_prices[symbol] is None:
                if (current_price > supertrend1 and 
                    current_price > supertrend2 and 
                    rsi > 50 and 
                    current_price > ema100 and 
                    current_price < factor * weekly_twap):  # Use appropriate factor
                    self.Debug(f"{symbol}: Supertrend1={supertrend1}, Supertrend2={supertrend2}, RSI={rsi}, EMA100={ema100}, Weekly TWAP={weekly_twap}")
                    self.SetHoldings(symbol, 0.2)
                    self.entry_prices[symbol] = current_price

            # Exit condition
            elif current_price < supertrend1 and current_price < supertrend2:
                self.Liquidate(symbol)
                self.entry_prices[symbol] = None