Overall Statistics
Total Trades
699
Average Win
0.74%
Average Loss
-0.33%
Compounding Annual Return
263.377%
Drawdown
21.000%
Expectancy
0.949
Net Profit
161.220%
Sharpe Ratio
4.202
Probabilistic Sharpe Ratio
94.793%
Loss Rate
40%
Win Rate
60%
Profit-Loss Ratio
2.23
Alpha
1.269
Beta
2.823
Annual Standard Deviation
0.388
Annual Variance
0.15
Information Ratio
4.936
Tracking Error
0.304
Treynor Ratio
0.577
Total Fees
$3199.37
Estimated Strategy Capacity
$1400000.00
Lowest Capacity Asset
UGL U85WJOCE24BP
Portfolio Turnover
27.01%
from AlgorithmImports import *
import math
import pandas as pd
from cmath import sqrt
from clr import AddReference
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Data.Custom import *
from QuantConnect.Python import PythonData
import csv
import io
import time
import json
class IntelligentSkyRodent(QCAlgorithm):
    def Initialize(self):
        self.cash = 100000
        self.buffer_pct = 0.01
        self.SetStartDate(2023, 1, 1)
        self.SetEndDate(2023, 10, 2)
        self.SetCash(self.cash)
        self.equities = ['MU','CZR','UVIX','ENPH','AMEH', 'ERIC', 'GNRC','BULZ','VCIT', 'UDN', 'SARK', 'AMD', 'FNGU', 'TSLL', 'AEHR', 'MSTR', 'TARK', 'XLY', 'QQQE', 'VOOG', 'VOOV', 'VTV', 'HIBL', 'XLK', 'XLP', 'SVXY', 'QID', 'TBF', 'TSLA', 'LQD', 'VTIP', 'EDV', 'STIP', 'SPTL', 'IEI', 'USDU', 'SQQQ', 'VIXM', 'SPXU', 'QQQ', 'BSV', 'TQQQ', 'SPY', 'DBC', 'SHV', 'IAU', 'VEA', 'UTSL', 'UVXY', 'UPRO', 'EFA', 'EEM', 'TLT', 'SHY', 'GLD', 'SLV', 'USO', 'WEAT', 'CORN', 'SH', 'DRN', 'PDBC', 'COMT', 'KOLD', 'BOIL', 'ESPO', 'PEJ', 'UGL', 'URE', 'VXX', 'UUP', 'BND', 'BIL', 'DUST', 'JDST', 'JNUG', 'GUSH', 'DBA', 'DBB', 'COM', 'PALL', 'AGQ', 'BAL', 'WOOD', 'URA', 'SCO', 'UCO', 'DBO', 'TAGS', 'CANE', 'REMX', 'COPX', 'IEF', 'SPDN', 'CHAD', 'DRIP', 'SPUU', 'INDL', 'BRZU', 'ERX', 'ERY', 'CWEB', 'CHAU', 'KORU', 'MEXX', 'EDZ', 'EURL', 'YINN', 'YANG', 'TNA', 'TZA', 'SPXL', 'SPXS', 'MIDU', 'TYD', 'TYO', 'TMF', 'TMV', 'TECL', 'TECS', 'SOXL', 'SOXS', 'LABU', 'LABD', 'RETL', 'DPST', 'DRV', 'PILL', 'CURE', 'FAZ', 'FAS', 'EWA', 'EWGS', 'EWG', 'EWP', 'EWQ', 'EWU', 'EWJ', 'EWI', 'EWN', 'ECC', 'NURE', 'VNQI', 'VNQ', 'VDC', 'VIS', 'VGT', 'VAW', 'VPU', 'VOX', 'VFH', 'VHT', 'VDE', 'SMH', 'DIA', 'UDOW', 'PSQ', 'SOXX', 'VTI', 'COST', 'UNH', 'SPHB', 'BTAL', 'VIXY', 'WEBL', 'WEBS', 'UBT', 'PST', 'TLH', 'QLD', 'SQM', 'SSO', 'SD', 'DGRO', 'SCHD', 'SGOL', 'TIP', 'DUG', 'EWZ', 'TBX', 'VGIT', 'VGLT', 'CCOR', 'LBAY', 'NRGD', 'PHDG', 'SPHD', 'COWZ', 'CTA', 'DBMF', 'GDMA', 'VIGI', 'AGG', 'NOBL', 'FAAR', 'BITO', 'FTLS', 'MORT', 'FNDX', 'GLL', 'NTSX', 'RWL', 'VLUE', 'IJR', 'SPYG', 'VXUS', 'AAL', 'AEP', 'AFL', 'C', 'CMCSA', 'DUK', 'EXC', 'F', 'GM', 'GOOGL', 'INTC', 'JNJ', 'KO', 'MET', 'NWE', 'OXY', 'PFE', 'RTX', 'SNY', 'SO', 'T', 'TMUS', 'VZ', 'WFC', 'WMT', 'AMZN', 'MSFT', 'NVDA', 'TSM', 'BA', 'CB', 'COKE', 'FDX', 'GE', 'LMT', 'MRK', 'NVEC', 'ORCL', 'PEP', 'V', 'DBE', 'BRK-B', 'CRUS', 'INFY', 'KMLM', 'NSYS', 'SCHG', 'SGML', 'SLDP', 'ARKQ', 'XLU', 'XLV', 'ULTA', 'AAPL', 'AMZU', 'BAD', 'DDM', 'IYH', 'JPM', 'PM', 'XOM', 'EUO', 'YCS', 'MVV', 'USD', 'TMF', 'SPXL', 'EPI', 'IYK', 'CURE', 'DIG', 'XLU']

        self.MKT = self.AddEquity("QQQ",Resolution.Daily).Symbol
        self.mkt = []
        for equity in self.equities:
            self.AddEquity(equity,Resolution.Minute)
            self.Securities[equity].SetDataNormalizationMode(DataNormalizationMode.Adjusted)
        self.AddEquity('BIL',Resolution.Minute)
        self.Securities['BIL'].SetDataNormalizationMode(DataNormalizationMode.TotalReturn)
       
        self.PT1 = 0.5 #TQQQFTLT
        self.PT2 = 0.14 #SOXX
        self.PT3 = 0.26 #TQQQorNOT
        self.PT4 = 0.1 #BetaBaller
        self.PT5 = 0.00 #Bestndays
        #self.PT6 = 0.25 #Slowloss
        self.TA1110 = 1
        self.TA1111 = 0.45
        self.TA1120 = 0.45
        self.TA1121 = 0.15
        self.TA1130 = 0.02
        self.TA1140 = 0.08
        self.TA1210 = 1
        self.TA6 = 1
        self.HT1 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS1 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT2 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS2 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT3 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS3 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT4 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS4 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT5 = {str(i).zfill(2): 0 for i in range(1,40)}
        self.HTS5 = {str(i).zfill(2): [] for i in range(1,40)}
        #self.HT6 = {str(i).zfill(2): 0 for i in range(1,10)}
        #self.HTS6 = {str(i).zfill(2): [] for i in range(1,10)}
        self.Schedule.On(self.DateRules.EveryDay("SPY"),
                self.TimeRules.BeforeMarketClose("SPY",3),
                self.FunctionBeforeMarketClose)
    def RSI(self,equity,period):
        extension = min(period*5,250)
        r_w = RollingWindow[float](extension)
        history = self.History(equity,extension - 1,Resolution.Daily)
        for historical_bar in history:
            r_w.Add(historical_bar.Close)
        while r_w.Count < extension:
            current_price = self.Securities[equity].Price
            r_w.Add(current_price)
        if r_w.IsReady:
            average_gain = 0
            average_loss = 0
            gain = 0
            loss = 0
            for i in range(extension - 1,extension - period -1,-1):
                gain += max(r_w[i-1] - r_w[i],0)
                loss += abs(min(r_w[i-1] - r_w[i],0))
            average_gain = gain/period
            average_loss = loss/period
            for i in range(extension - period - 1,0,-1):
                average_gain = (average_gain*(period-1) + max(r_w[i-1] - r_w[i],0))/period
                average_loss = (average_loss*(period-1) + abs(min(r_w[i-1] - r_w[i],0)))/period
            if average_loss == 0:
                return 100
            else:
                rsi = 100 - (100/(1 + average_gain / average_loss))
                return rsi
        else:
            return None
    def CumReturn(self,equity,period):
        history = self.History(equity,period,Resolution.Daily)
        closing_prices = pd.Series([bar.Close for bar in history])
        current_price = self.Securities[equity].Price
        closing_prices = closing_prices.append(pd.Series([current_price]))
        first_price = closing_prices.iloc[0]
        if first_price == 0:
            return None
        else:
            return_val = (current_price / first_price) - 1
            return return_val
    def STD(self,equity,period):
        r_w = RollingWindow[float](period + 1)
        r_w_return = RollingWindow[float](period)
        history = self.History(equity,period,Resolution.Daily)
        for historical_bar in history:
            r_w.Add(historical_bar.Close)
        while r_w.Count < period + 1:
            current_price = self.Securities[equity].Price
            r_w.Add(current_price)
        for i in range (period,0,-1):
            daily_return = (r_w[i-1]/r_w[i] - 1)
            r_w_return.Add(daily_return)
        dfstd = pd.DataFrame({'r_w_return':r_w_return})
        if r_w.IsReady:
            std = dfstd['r_w_return'].std()
            if std == 0:
                return 0
            else:
                return std
        else:
            return 0
    def MaxDD(self,equity,period):
        history = self.History(equity,period - 1,Resolution.Daily)
        closing_prices = pd.Series([bar.Close for bar in history])
        current_price = self.Securities[equity].Price
        closing_prices = closing_prices.append(pd.Series([current_price]))
        rolling_max = closing_prices.cummax()
        drawdowns = (rolling_max - closing_prices) / rolling_max
        max_dd = drawdowns.min()
        return max_dd
    def SMA(self,equity,period):
        r_w = RollingWindow[float](period)
        history = self.History(equity,period - 1,Resolution.Daily)
        for historical_bar in history:
            r_w.Add(historical_bar.Close)
        while r_w.Count < period:
            current_price = self.Securities[equity].Price
            r_w.Add(current_price)        
        if r_w.IsReady:
            sma = sum(r_w) / period
            return sma
        else:
            return 0
    def IV(self,equity,period):
        r_w = RollingWindow[float](period + 1)
        r_w_return = RollingWindow[float](period)
        history = self.History(equity,period,Resolution.Daily)
        for historical_bar in history:
            r_w.Add(historical_bar.Close)
        while r_w.Count < period + 1:
            current_price = self.Securities[equity].Price
            r_w.Add(current_price)
        for i in range (period,0,-1):
            if r_w[i] == 0:
                return 0
            else:
                daily_return = (r_w[i-1]/r_w[i] - 1)
                r_w_return.Add(daily_return)
        dfinverse = pd.DataFrame({'r_w_return':r_w_return})       
        if r_w.IsReady:
            std = dfinverse['r_w_return'].std()
            if std == 0:
                return 0
            else:
                inv_vol = 1 / std
                return inv_vol
        else:
            return 0
    def SMADayRet(self,equity,period):
        r_w = RollingWindow[float](period + 1)
        r_w_return = RollingWindow[float](period)
        history = self.History(equity,period,Resolution.Daily)
        for historical_bar in history:
            r_w.Add(historical_bar.Close)
        while r_w.Count < period + 1:
            current_price = self.Securities[equity].Price
            r_w.Add(current_price)
        for i in range (period,0,-1):
            if r_w[i] == 0:
                return None
            daily_return = (r_w[i-1]/r_w[i] - 1)
            r_w_return.Add(daily_return)
        if r_w.IsReady:
            smareturn = sum(r_w_return) / period
            return smareturn
        else:
            return 0
    def EMA(self,equity,period):
        extension = period + 50
        r_w = RollingWindow[float](extension)
        history = self.History(equity,extension - 1,Resolution.Daily)
        for historical_bar in history:
            r_w.Add(historical_bar.Close)
        while r_w.Count < extension:
            current_price = self.Securities[equity].Price
            r_w.Add(current_price)
        if r_w.IsReady:
            total_price = 0
            for i in range(extension - 1,extension - period - 2,-1):
                total_price += r_w[i]
            average_price = total_price/period
            for i in range(extension - period - 2,-1,-1):
                average_price = r_w[i]*2/(period+1) + average_price*(1-2/(period+1))
            return average_price
        else:
            return None
    def Sort(self,sort_type,equities,period,reverse,number,multiplier):
        self.PT = getattr(self,f"PT{number}") * multiplier
        returns = {}
        for equity in equities:
            returns[equity] = getattr(self,sort_type)(equity,period)
        s_e = sorted([item for item in returns.items() if item[1] is not None],key = lambda x: x[1],reverse = reverse)
        t3e = s_e[:1]
        ht = getattr(self,f"HT{number}")
        hts = getattr(self,f"HTS{number}")
        for i in ht.keys():
            if ht[i] == 0:
                ht[i] = self.PT
                hts[i].append(t3e[0][0])
                break
        setattr(self,f"HT{number}",ht)
        setattr(self,f"HTS{number}",hts)
    def AH(self, equities, PTnumber, multiplier): #AppendHolding
        if not isinstance(equities, list):
            equities = [equities]
        
        HT = getattr(self, f"HT{PTnumber}")
        HTS = getattr(self, f"HTS{PTnumber}")
        PT = getattr(self, f"PT{PTnumber}") * multiplier
        
        for equity in equities:
            for i in HT.keys():
                if HT[i] == 0:
                    HT[i] = PT
                    HTS[i].append(equity)
                    break

    def OnData (self,data):
        pass
    def FunctionBeforeMarketClose(self):
        mkt_price = self.History(self.MKT,2,Resolution.Daily)['close'].unstack(level= 0).iloc[-1]
        self.mkt.append(mkt_price)
        mkt_perf = self.cash * self.mkt[-1] / self.mkt[0]
        self.Plot('Strategy Equity',self.MKT,mkt_perf)
        self.TQQQFTLT()
        self.SOXXRSIMachine()
        self.TQQQorNOT()
        self.DereckCustomBetaBaller()
        #self.Slowloss()
        self.ExecuteTrade()
        self.PrintStrategy()
    def Slowloss(self):
        response = self.Download('https://drive.google.com/uc?export=download&id=13ER4Rvm9vo0b-LvPvSwjgs0PwTROJuMa')
        tickers_list = []
        new_tickers_list = []
        if response:
            reader = csv.DictReader(io.StringIO(response))
            for row in reader:
                if (row['Symphony'] == 'BEST0d' or row['Symphony'] == 'BEST20d' or row['Symphony'] == 'BESTr30' or row['Symphony'] == 'BESTr0') and len(row['Ticker']) <= 5:
                    ticker = row['Ticker']
                    tickers_list.append(ticker)
                    allocation_percent = float(row['Ticker Allocation Percent'])
                    self.AH(ticker,5,allocation_percent/400)                    
                if row['Symphony'] == 'info':
                    self.Debug('******Data refreshed at: ' + row['Ticker'])
            tickers_list.extend(self.equities)
            new_tickers_list = [ticker for ticker in tickers_list if ticker not in self.equities]
            tickers_list = list(set(tickers_list))
            for ticker in tickers_list:
                if not self.Securities.ContainsKey(ticker):
                    self.AddEquity(ticker,Resolution.Minute)
                    self.Securities[ticker].SetDataNormalizationMode(DataNormalizationMode.Adjusted)
            # Debug the final list of tickers
            #self.Debug(str(tickers_list))
            self.Debug("Newly added tickers: " + str(new_tickers_list))
        else:
            response = self.Download('https://mainsignal-6rkoj3i67a-uk.a.run.app/')
            time.sleep(40)
            if response:
                data = json.loads(response)
                for key in data['Symphony'].keys():
                    if (data['Symphony'][key] == 'quikl230303' or data['Symphony'][key] == 'slowloss1'):
                        ticker = data['Ticker'][key]
                        tickers_list.append(ticker)
                        allocation_percent = float(data['Ticker Allocation Percent'][key])
                        self.AH(ticker,6,allocation_percent/200)
                    if (data['Symphony'][key] == 'BEST0d' or data['Symphony'][key] == 'BEST20d'):
                        ticker = data['Ticker'][key]
                        tickers_list.append(ticker)
                        allocation_percent = float(data['Ticker Allocation Percent'][key])
                        self.AH(ticker,5,allocation_percent/200)
                    if data['Symphony'][key] == 'info':
                        self.Debug('Data refreshed at: ' + data['Ticker'][key])

    def TQQQFTLT(self):
        if self.Securities['SPY'].Price > self.SMA('SPY',200):
            if self.RSI('TQQQ',10) > 78:
                self.AH(['SPXU','UVXY','SQQQ'], 1, 0.33)
            else:
                if self.RSI('SPXL',10) > 79:
                    self.AH(['SPXU','UVXY','SQQQ'], 1, 0.33)
                else:
                    if self.CumReturn('TQQQ',4) > 0.2:
                        if self.RSI('TQQQ',10) < 31:
                            self.AH('TQQQ',1,1)
                        else:
                            if self.RSI('UVXY',10) > self.RSI('SQQQ',10):
                                self.AH(['SPXU','UVXY','SQQQ'], 1, 0.33)
                            else:
                                self.AH('SQQQ',1,1)
                    else:
                        self.AH('TQQQ',1,1)
        else:
            if self.RSI('TQQQ',10) < 31:
                self.AH('TECL',1,1)
            else:
                if self.RSI('SMH',10) < 30:
                    self.AH('SOXL',1,1)
                else:
                    if self.RSI('DIA',10) < 27:
                        self.AH('UDOW',1,1)
                    else:
                        if self.RSI('SPY',14) < 28:
                            self.AH('UPRO',1,1)
                        else:
                            self.Group1()
                            self.Group2()
    def Group1(self):
        if self.CumReturn('QQQ',200) < -0.2:
            if self.Securities['QQQ'].Price < self.SMA('QQQ',20):
                if self.CumReturn('QQQ',60) < -0.12:
                    self.Group5()
                    self.Group6()
                else:
                    if self.RSI('TLT',10) > self.RSI('SQQQ',10):
                        self.AH('TQQQ',1,0.5)
                    else:
                        self.AH('SQQQ',1,0.5)
            else:
                if self.RSI('SQQQ',10) < 31:
                    self.AH('PSQ',1,0.5)
                else:
                    if self.CumReturn('QQQ',9) > 0.055:
                        self.AH('PSQ',1,0.5)
                    else:
                        if self.RSI('QQQ',10) > self.RSI('SMH',10):
                            self.AH('QQQ',1,0.5)
                        else:
                            self.AH('SMH',1,0.5)
        else:
            if self.Securities['QQQ'].Price < self.SMA('QQQ',20):
                if self.RSI('TLT',10) > self.RSI('SQQQ',10):
                    self.AH('TQQQ',1,0.5)
                else:
                    self.AH('SQQQ',1,0.5)
            else:
                if self.RSI('SQQQ',10) < 31:
                    self.AH('SQQQ',1,0.5)
                else:
                    if self.CumReturn('QQQ',9) > 0.055:
                        self.AH('SQQQ',1,0.5)
                    else:
                        if self.RSI('TQQQ',10) > self.RSI('SOXL',10):
                            self.AH('TQQQ',1,0.5)
                        else:
                            self.AH('SOXL',1,0.5)
    def Group2(self):
        if self.Securities['QQQ'].Price < self.SMA('QQQ',20):
            if self.CumReturn('QQQ',60) < -0.12:
                self.Group3()
                self.Group4()
            else:
                if self.RSI('TLT',10) > self.RSI('SQQQ',10):
                    self.AH('TQQQ',1,0.5)
                else:
                    self.AH('SQQQ',1,0.5)
        else:
            if self.RSI('SQQQ',10) < 31:
                self.AH('SQQQ',1,0.5)
            else:
                if self.CumReturn('QQQ',70) < -0.15:
                    if self.RSI('TQQQ',10) > self.RSI('SOXL',10):
                        self.AH('TQQQ',1,0.5)
                    else:
                        self.AH('SOXL',1,0.5)
                else:
                    self.Sort("CumReturn",["SPY","QQQ","DIA","XLP"],14,True,1,0.5)                                   
    def Group3(self):
        if self.Securities['SPY'].Price > self.SMA('SPY',20):
            self.AH('SPY',1,0.25)
        else:
            if self.RSI('TLT',10) > self.RSI('SQQQ',10):
                self.AH('QQQ',1,0.25)
            else:
                self.AH('PSQ',1,0.25)
    def Group4(self):
        if self.RSI('TLT',10) > self.RSI('SQQQ',10):
            self.AH('QQQ',1,0.25)
        else:
            self.AH('PSQ',1,0.25)
    def Group5(self):
        if self.Securities['SPY'].Price > self.SMA('SPY',20):
            self.AH('SPY',1,0.25)
        else:
            if self.RSI('TLT',10) > self.RSI('SQQQ',10):
                self.AH('QQQ',1,0.25)
            else:
                self.AH('PSQ',1,0.25)
    def Group6(self):
        if self.RSI('TLT',10) > self.RSI('SQQQ',10):
            self.AH('QQQ',1,0.25)
        else:
            self.AH('PSQ',1,0.25)

    def SOXXRSIMachine(self):
        if self.RSI('SOXX',10) > 75:
            self.AH('SOXS',2,self.TA1110)
        else:
            if self.RSI('SOXX',2) < 41:
                if self.RSI('SOXL',10) < 57:
                    self.AH('SOXL',2,self.TA1110)
                else:
                    self.AH('SOXS',2,self.TA1110)
            else:
                self.GainTrainDGAF()
    def GainTrainDGAF(self):
        self.SubGainTrain1()
        self.SubGainTrain2()
        self.OperationMeatShield()
    def SubGainTrain1(self):
        if self.EMA('UUP',42) > self.EMA('UUP',100):
            self.Sort("RSI",["UUP","USDU"],14,False,2,self.TA1111)
        else:
            self.Sort("STD",["BIL","SOXL","DBC"],14,True,2,self.TA1111)

    def SubGainTrain2(self):
        if 50 < self.RSI('IEF',10):
            if self.RSI('SPY',7) > 76:
                self.OverboughtSP2()
            else:
                self.Sort("MaxDD",["SOXL","SMH"],6,True,2,self.TA1120)
        else:
            if self.RSI('SPY',7) < 27:
                self.ExtremelyoversoldSP()
            else:
                self.AH(['UGL','SH','PSQ'],2,self.TA1121)
    def OverboughtSP2(self):
        self.AH('UGL',2,self.TA1120)
    def ExtremelyoversoldSP(self):
        if self.RSI('SHY',10) < self.RSI('VTI',10):
            self.AH('SOXS',2,self.TA1120)
        else:
            self.AH('SOXL',2,self.TA1120)
    def OperationMeatShield(self):
        self.SubGainTrain3()
        self.SubGainTrain4()
    def SubGainTrain3(self):
        if self.RSI('COST',14) < 69:
            if self.MaxDD('SPY',5) > 0.12:
                self.AH('BIL',2,self.TA1130)
            else:
                self.AH('COST',2,self.TA1130)
        else:
            self.AH('BIL',2,self.TA1130)
    def SubGainTrain4(self):
        if self.RSI('UNH',14) < 79:
            if self.MaxDD('SPY',5) > 0.12:
                self.AH('BIL',2,self.TA1140)
            else:
                self.AH('UNH',2,self.TA1140)
        else:
            self.AH('BIL',2,self.TA1140)
    def TQQQorNOT(self):
        if self.RSI('TQQQ',10) > 78:
            self.AH(['SPXU','UVXY','SQQQ'], 3, self.TA1210/3)
        else:
            if self.CumReturn('TQQQ',6) < -0.12:
                if self.CumReturn('TQQQ',1) > 0.055:
                    self.AH(['SPXU','UVXY','SQQQ'], 3, self.TA1210/3)
                else:
                    if self.RSI('TQQQ',10) < 32:
                        self.AH('TQQQ',3,self.TA1210)
                    else:
                        if self.MaxDD('TMF',10)<0.07:
                            self.AH('TQQQ',3,self.TA1210)
                        else:
                            self.AH('BIL',3,self.TA1210)
            else:
                if self.MaxDD('QQQ',10)>0.06:
                    self.AH('BIL',3,self.TA1210)
                else:
                    if self.MaxDD('TMF',10)>0.07:                         
                        self.AH('BIL',3,self.TA1210)
                    else:
                        if self.Securities['QQQ'].Price > self.SMA('QQQ',25):
                            self.AH('TQQQ',3,self.TA1210)
                        else:
                            if self.RSI('SPY',60) > 50:
                                if self.RSI('BND',45) > self.RSI('SPY',45):
                                    self.AH('TQQQ',3,self.TA1210)
                                else:
                                    self.AH('BIL',3,self.TA1210)                                     
                            else:
                                if self.RSI('IEF',200) < self.RSI('TLT',200):
                                    if self.RSI('BND',45) > self.RSI('SPY',45):
                                        self.AH('TQQQ',3,self.TA1210)
                                    else:
                                        self.AH('BIL',3,self.TA1210)       
                                else:
                                    self.AH('BIL',3,self.TA1210)   
    def DereckCustomBetaBaller(self):
        if self.SMADayRet('TLT',350) < self.SMADayRet('TLT',550):
            if self.Securities['SPY'].Price < self.SMA('SPY',200):
                self.V320BetaBaller()
            else:
                self.BullStockMarket()
        else:
            self.NewApollo()
    def V320BetaBaller(self):
        if self.RSI('BIL',8) < 35:
            if self.RSI('TQQQ',10) > 80:
                self.OverboughtSP()
            else:
                self.AH('SOXL',4,1)
        else:
            if self.RSI('SPY',6) < 27:
                self.ExtremelyoversoldSP() 
            else:
                self.BearStockMarket()
    def OverboughtSP(self):
        self.Sort("RSI",["VIXM","VIXY"],13,False,4,1)

    def ExtremelyoversoldSP(self):
        if self.RSI('BSV',7) < self.RSI('SPHB',7):
            self.Sort("RSI",["SOXS","SOXS"],7,False,4,1)
        else:
           self.Sort("RSI",["SOXL","TECL"],7,False,4,1)
    def BearStockMarket(self):
        if self.RSI('BSV',7) > self.RSI('SHY',7):
            self.BearStockMarketSTRIPPED331()
        else:
            self.AH('SOXL',4,1)
    def BearStockMarketSTRIPPED331(self):
        if self.RSI('QQQ',10) < 30:
            self.Sort("SMADayRet",["TQQQ","SPXL","SOXL","UPRO"],5,True,4,1)
        else:
            if self.RSI('SPY',10) < 30:
                self.AH('UPRO',4,1)
            else:
                if self.Securities['QLD'].Price > self.SMA('QLD',20):                              
                    self.BearStockMarketSTRIPPED231()
                else:
                    self.BearStockMarketSTRIPPED022()    
    def BearStockMarketSTRIPPED231(self):
        if 50 > self.RSI('IEF',7):                    
            self.BearStockMarketSTRIPPED141()
        else:
            if self.RSI('SPY',6) > 75:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            else:
                self.AH('SOXL',4,1)
    def BearStockMarketSTRIPPED141(self):
        if self.Securities['TLT'].Price < self.SMA('TLT',21):
            self.BAARiskOffRisingRatesTMV()
        else:
            self.BABRiskOffFallingRatesTMF()
    def BAARiskOffRisingRatesTMV(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TQQQ","SOXL","UPRO"],5,True,4,1)
            else:
                if self.CumReturn('SPY',2) < -0.02:
                    self.Sort("CumReturn",["SPXS","TECS","SOXS","SQQQ","ERX"],5,False,4,1)
                else:
                    if self.CumReturn('SPXU',6) > self.CumReturn('UPRO',3):
                        self.Sort("CumReturn",["SOXS","SQQQ","EPI"],5,True,4,1)
                    else:
                        self.Sort("SMADayRet",["TECL","SOXL","TMV"],5,False,4,1)
        else:
            if self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360):                        
                if self.RSI('TQQQ',11) > 77:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    if self.CumReturn('TQQQ',6) < -0.1:
                        if self.CumReturn('TQQQ',1) > 0.055:   
                            self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                        else:
                            self.Sort("SMADayRet",["SOXL","IYK","TMV"],5,False,4,1)
                    else:
                        if 50 < self.RSI('IEF',7):  
                            self.Sort("SMADayRet",["TQQQ","IYK","SOXL","UPRO","TECL"],5,True,4,1)
                        else:
                            self.Sort("SMADayRet",["SOXL","IYK","UPRO"],22,False,4,1)
            else:
                self.Defence()
    def Defence(self):
        if self.STD('DBC',20) > self.STD('SPY',20):
            if self.STD('DBC',10) > 0.03:
                if self.STD('TMV',5) < self.STD('DBC',5):
                    self.AH('TMV',4,1)   
                else:
                    self.AH('DBC',4,1)
            else:
                if 50 < self.RSI('IEF',7):  
                    self.Sort("SMADayRet",["TMV","SOXS","SPXU"],5,True,4,1)

                else:
                    self.Sort("CumReturn",["EFA","EEM","SPXS","SOXS","UCO","TMV"],5,False,4,1)
        else:
            if 50 < self.RSI('IEF',7):                 
                self.Sort("SMADayRet",["EPI","SOXL","UPRO","IYK"],5,False,4,1)

            else:
                self.Sort("CumReturn",["EWZ","TECS","SOXS","EUO","YCS","TMV"],5,False,4,1)
    
    def BABRiskOffFallingRatesTMF(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.CumReturn('SPY',2) < -0.02:
                self.Sort("SMADayRet",["SPXS","TECS","SOXS","SQQQ"],5,True,4,1)
            else:
                if self.CumReturn('SPXU',6) > self.CumReturn('UPRO',3):
                    self.Sort("CumReturn",["BIL","AGG","TMF"],5,False,4,1)
                else:
                    self.Sort("SMADayRet",["TECL","SOXL","TQQQ","EWZ","TMF"],5,False,4,1)
        else:
            if self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360): 
                if self.EMA('SPY',210) > self.EMA('SPY',360):
                    if self.RSI('TQQQ',11) > 77:
                        self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                    else:
                        if self.CumReturn('TQQQ',6) < -0.1:
                            if self.CumReturn('TQQQ',1) > 0.055:   
                                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                            else:
                                self.Sort("SMADayRet",["TECL","TQQQ","SPXL","EPI","SOXL","UPRO","QLD","EWZ","MVV","XLU","IYK","USD","TMF"],7,False,4,1)
                        if 50 < self.RSI('IEF',7):  
                            self.Sort("SMADayRet",["TECL","SPXL","EPI","SOXL","UPRO","MVV"],7,False,4,1)
                        else:
                            self.Sort("CumReturn",["SOXS","TMF"],5,True,4,1)
                else:
                    self.Sort("RSI",["SPXS","SQQQ","TECS","SOXS"],5,False,4,1)
            else:
                self.Defence2()

    def Defence2(self):
        if self.STD('DBC',20) > self.STD('SPY',20):
            self.Sort("RSI",["SPXS","EPI","TECS","SOXS","SQQQ"],5,False,4,1)
        else:
            self.Sort("SMADayRet",["TECL","TQQQ","SOXL","TMF"],5,True,4,1)

    def BearStockMarketSTRIPPED022(self):
        if self.RSI('TQQQ',9) < 32:
            if self.CumReturn('TQQQ',2) > self.CumReturn('TQQQ',5):
                self.FiveandDime11()
            else:
                self.Sort("RSI",["TMF","UCO","USD","SOXL","SQQQ"],5,False,4,1)
        else:
             self.BearStockMarketSTRIPPED201()

    def FiveandDime11(self):
        self.Substrategy1()
        self.Substrategy2()

    def Substrategy1(self):
        self.Sort("RSI",["TECL","SOXL","SHY"],10,False,1,0.5)

    def Substrategy2(self):
        self.Sort("RSI",["SHY","SOXL"],5,False,1,0.5)

    def BearStockMarketSTRIPPED201(self):
        if self.Securities['TLT'].Price > self.SMA('TLT',200):
            self.ABMediumtermTLT()
        else:
            self.BlongtermTLT()

    def ABMediumtermTLT(self):
        if self.SMADayRet('TLT',20) < 0:
            self.ABBARiskOffRisingRatesTMV()
        else:
            self.ABBBRiskOffFallingRatesTMF()

    def ABBARiskOffRisingRatesTMV(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TECL","TQQQ","SOXL","UPRO"],5,False,4,1)
            else:
                if self.CumReturn('SPXU',6) > self.CumReturn('UPRO',3):
                    self.Sort("CumReturn",["SOXS","EUO","YCS"],5,True,4,1)
                else:
                    self.Sort("SMADayRet",["TECL","SOXL","TQQQ","CURE"],5,False,4,1)
        else:               
            if self.RSI('TQQQ',11) > 77:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            else:
                self.Sort("SMADayRet",["SOXL","TECL","TMV","TQQQ","UPRO"],5,False,4,1)

    def ABBBRiskOffFallingRatesTMF(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TECL","SOXL","TQQQ"],5,False,4,1)
            else:
                if self.CumReturn('SPY',2) < -0.02:
                    self.Sort("CumReturn",["TECS","SOXS","SQQQ"],5,True,4,1)
                else:
                    if self.CumReturn('SPXU',6) > self.CumReturn('UPRO',3):
                        self.Sort("CumReturn",["ERX","EUO","YCS"],5,True,4,1)                       
                    else:
                        self.Sort("SMADayRet",["EWZ","SOXL","MVV","USD"],5,False,4,1)
        else:
            if self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360):                        
                if self.RSI('TQQQ',11) > 77:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    if self.CumReturn('TQQQ',6) < -0.1:
                        if self.CumReturn('TQQQ',1) > 0.055:   
                            self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                        else:
                            if 50 < self.RSI('IEF',7):  
                                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                            else:
                                self.Sort("CumReturn",["EWZ","UUP","TMF","UCO"],5,True,4,1)
                    else:
                        if 50 < self.RSI('IEF',7):  
                            self.Sort("SMADayRet",["TQQQ","SPXL","QLD","USD","TECL"],5,False,4,1)
                        else:
                            self.Sort("CumReturn",["EWZ","EWZ","TMF"],5,True,4,1)
            else:
                self.Defence3()

    def Defence3(self):
        if self.STD('DBC',20) > self.STD('SPY',20):
            self.Sort("RSI",["SHY","EWZ","GLD","SPXS","TECS","SOXS","UCO","YCS"],5,False,4,1)
        else:
            if 50 < self.RSI('IEF',7):  
                self.Sort("SMADayRet",["SOXL","USD","TMF"],5,False,4,1)
            else:
                self.Sort("CumReturn",["EWZ","SPXS","SOXS","UCO","YCS"],5,True,4,1)

    def BlongtermTLT(self):
        if self.SMADayRet('TLT',20) < 0:
            self.BAARiskOffRisingRatesTMV2()
        else:
            self.BABRiskOffFallingRatesTMF()

    def BAARiskOffRisingRatesTMV2(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TQQQ","SOXL","UPRO"],5,True,4,1)
            else:
                if self.CumReturn('SPY',2) < -0.02:
                    self.Sort("CumReturn",["SPXS","TECS","SOXS","SQQQ","ERX"],5,False,4,1)
                else:
                    if self.CumReturn('SPXU',6) > self.CumReturn('UPRO',3):
                        self.Sort("CumReturn",["SOXS","SQQQ","EPI"],5,True,4,1)
                    else:
                        self.Sort("SMADayRet",["TECL","SOXL","TMV"],5,False,4,1)
        else:
            if self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360):                        
                if self.RSI('TQQQ',11) > 77:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    if self.CumReturn('TQQQ',6) < -0.1:
                        if self.CumReturn('TQQQ',1) > 0.055:   
                            self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                        else:
                            self.Sort("SMADayRet",["SOXL","IYK","TMV"],5,False,4,1)
                    else:
                        if 50 < self.RSI('IEF',7):  
                            self.Sort("SMADayRet",["TQQQ","SOXL","IYK","TMV","UPRO","TECL"],5,True,4,1)
                        else:
                            self.Sort("SMADayRet",["SOXL","IYK","UPRO"],22,False,4,1)
            else:
                self.Defence()

    def BullStockMarket(self):
        if self.RSI('SPY',40) > 75:
            if 50 < self.RSI('IEF',7):
                self.AH('QQQ',4,1)
            else:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
        else:
            self.BullStockMarket222()

    def BullStockMarket222(self):
        if 50 > self.RSI('IEF',7):
            self.BullStockMarketSTRIPPED1()
        else:
            if self.RSI('SPY',6) > 75:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            else:
                self.AH('SOXL',4,1)

    def BullStockMarketSTRIPPED1(self):
        if self.RSI('TQQQ',14) > 75:
            self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
        else:
            if self.RSI('SPXL',10) > 80:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            else:
                self.BullStockMarketSTRIPPED201()

    def BullStockMarketSTRIPPED201(self):
        if self.Securities['TLT'].Price > self.SMA('TLT',200):                        
            self.ALongTLTtrendingup()
        else:
            self.BLongTLTtrendingdown()

    def ALongTLTtrendingup(self):
        if self.RSI('TLT',14) < 50:
            self.AAMediumTLTnotOverbought()
        else:
            self.ABMediumTLTmayOverbought2()

    def AAMediumTLTnotOverbought(self):
        if self.Securities['TLT'].Price > self.SMA('TLT',5):  
            self.AAAShortTLTtrendingup()
        else:
            self.AABShortTLTtrendingdown()

    def AAAShortTLTtrendingup(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TQQQ","SOXL","UPRO","TECL","SPXL"],5,True,4,1)
            else:
                if self.CumReturn('SPXU',6) > self.CumReturn('UPRO',3):
                    self.Sort("CumReturn",["TECS","SOXS","SQQQ","TMF","SHY"],5,True,4,1)
                else:
                    self.Sort("SMADayRet",["TECL","SOXL","UPRO","EWZ","TMF","TQQQ"],5,False,4,1)
        else:
            if self.CumReturn('TQQQ',6) < -0.1:
                self.Sort("SMADayRet",["TECL","TQQQ","TMF"],7,False,4,1)
            else:
                self.Sort("SMADayRet",["SOXL","TMF"],7,False,4,1)

    def AABShortTLTtrendingdown(self):
        if self.RSI('TLT',14) < 20:
            self.AH('SHY',4,1)
        else:
            if self.SMADayRet('TLT',20) < 0:
                self.AABBARiskOffRisingRatesTMV()
            else:
                self.AABBBRiskOffFallingRatesTMF()

    def AAMediumTLTnotOverbought(self):
        if self.Securities['TLT'].Price > self.SMA('TLT',5):  
            self.AAAShortTLTtrendingup()
        else:
            self.AABShortTLTtrendingdown() 

    def AABBARiskOffRisingRatesTMV(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                self.Sort("CumReturn",["SOXS","ERX","SHY"],5,True,4,1)
            else:
                self.Sort("SMADayRet",["TQQQ","SOXL","CURE","EWZ","SHY"],5,False,4,1)
        else:
            if self.SMA('SPY',210) > self.SMA('DBC',360):
                if self.RSI('TQQQ',11) > 77:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    if self.CumReturn('TQQQ',6) < -0.1:
                        if self.CumReturn('TQQQ',1) > 0.055:
                            self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                        else:
                            self.Sort("SMADayRet",["TECL","TQQQ","SOXL","UPRO","TMV","SHY"],5,False,4,1)
                    else:
                        self.Sort("SMADayRet",["TECL","TQQQ","SOXL","UPRO","TMV","SHY"],5,True,4,1)
            else:                       
                self.DefenseModified4()

    def DefenseModified4(self):
        if self.STD('DBC',20) > self.STD('SPY',20):
            self.Sort("RSI",["EEM","TECS","SOXS","TMV"],5,False,4,1)
        else:
            self.Sort("RSI",["EEM","TECS","SOXS","TMV"],10,False,4,1)

    def AABBBRiskOffFallingRatesTMF(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                self.Sort("SMADayRet",["TQQQ","SOXL","UPRO","TECL","TMF"],5,True,4,1)
            else:
                self.Sort("SMADayRet",["TECL","TQQQ","SOXL","TMF"],5,False,4,1)
        elif self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360):
            if self.RSI('TQQQ',11) > 77:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            elif self.CumReturn('TQQQ',6) < -0.1:
                if self.CumReturn('TQQQ',1) > 0.055:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    self.Sort("SMADayRet",["TECL","TQQQ","SPXL","EPI","SOXL","UPRO","QLD","EWZ","MVV","PUI","IYK","USD","TMF"],7,False,4,1)
            else:
                if 50 < self.RSI('IEF',7):
                    self.Sort("SMADayRet",["TECL","TQQQ","SOXL","PUI"],5,False,4,1)
                else:
                    self.Sort("CumReturn",["SOXS","SQQQ","UCO","DIG"],5,False,4,1)
        else:
            self.Sort("SMADayRet",["EPI","UPRO","SOXL","TQQQ"],5,True,4,1)

    def ABMediumTLTmayOverbought2(self):
        if self.RSI('TLT',14) > 80:
            self.ABAMediumtermTLTisoverbought()
        else:
            if self.Securities['TLT'].Price < self.SMA('TLT',21):
                self.ABBARiskOffRisingRatesTMV()
            else:
                self.ABBBRiskOffFallingRatesTMF()

    def ABAMediumtermTLTisoverbought(self):
        if self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360):
            if self.CumReturn('TQQQ',6) < -0.1:
                if self.CumReturn('TQQQ',1) > 0.055:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    self.Sort("SMADayRet",["TECL","TQQQ","SOXL","UPRO"],5,False,4,1)
            else:
                self.Sort("RSI",["SQQQ","TECS","SOXS","TMV"],5,True,4,1)
        else:
            self.Sort("SMADayRet",["EPI","UPRO","SOXL","TQQQ","TMV"],5,True,4,1)

    def BLongTLTtrendingdown(self):
        if self.Securities['TLT'].Price < self.SMA('TLT',21):
            self.BAARiskOffRisingRatesTMV2()
        else:
            self.BABRiskOffFallingRatesTMF2()        

    def BABRiskOffFallingRatesTMF2(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.CumReturn('SPY',2) <= -0.02:
                self.Sort("CumReturn",["SPXS","TECS","SOXS","SQQQ"],5,True,4,1)
            elif self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                self.Sort("CumReturn",["BIL","AGG","TMF"],5,False,4,1)
            else:
                self.Sort("SMADayRet",["TECL","TQQQ","SOXL","EWZ","TMF"],5,False,4,1)
        elif self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360):
            if self.EMA('SPY',210) > self.EMA('SPY',360):
                if self.RSI('TQQQ',11) > 77:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                elif self.CumReturn('TQQQ',6) < -0.1:
                    if self.CumReturn('TQQQ',1) > 0.055:
                        self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                    else:
                        self.Sort("SMADayRet",["TECL","TQQQ","SPXL","EPI","SOXL","UPRO","QLD","EWZ","MVV","XLU","IYK","USD","TMF"],7,False,4,1)
                elif 50 < self.RSI('IEF',7):
                    self.Sort("SMADayRet",["TECL","SPXL","EPI","SOXL","UPRO","MVV","UGE"],7,False,4,1)
                else:
                    self.Sort("CumReturn",["SOXS","TMF"],5,True,4,1)
            else:
                self.Sort("RSI",["SPXS","SQQQ","TECS","SOXS"],5,False,4,1)
        else:
            self.Defence2()
    def NewApollo(self):
        if self.Securities['SPY'].Price > self.SMA('SPY',200):
            if self.RSI('QQQ',14) > 80:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            else:
                if self.RSI('SPY',10) > 80:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    self.V201ABetterLETFBasketDJKeyholeNoUGEPUI()
        else:
            if self.RSI('TQQQ',9) < 32:
                if self.CumReturn('TQQQ',2) >= self.CumReturn('TQQQ',5):
                    self.FiveandDime11()
                else:
                    if self.RSI('SPY',10) < 30:
                        self.FiveandBelow12()
                    else:
                        if self.Securities['TQQQ'].Price > self.SMA('TQQQ',20):
                            if self.RSI('SQQQ',10) < 31:
                                self.AH('SQQQ',4,1)
                            else:
                                self.AH('TQQQ',4,1)
                        else:
                            self.Sort("RSI",["TMF","UCO","USD","SOXL","SQQQ"],5,False,4,1)
            else:
                self.V201ABetterLETFBasketDJKeyholeNoUGEPUI()
    def V201ABetterLETFBasketDJKeyholeNoUGEPUI(self):
        if self.Securities['TLT'].Price > self.SMA('TLT',200):
            self.AIfLongTermTLTIsTrendingUp2()
        else:
            self.BLongTLTtrendingdown2()
    def AIfLongTermTLTIsTrendingUp2(self):
        if self.RSI('TLT',14) < 50:
            self.AAIfMediumTermTLTIsNotOverbought2()
        else:
            self.ABMediumTermTLTMayBeOverbought3()
    def AAIfMediumTermTLTIsNotOverbought2(self):
        if self.Securities['TLT'].Price > self.SMA('TLT',5):
            self.AAAShortTermTLTIsTrendingUpBuy3xLeveragedBullTreasuryBonds2()
        else:
            self.AABIfShortTermTLTIsTrendingDown2()
    def AAAShortTermTLTIsTrendingUpBuy3xLeveragedBullTreasuryBonds2(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TECL","TQQQ","SOXL","UPRO"],5,True,4,1)
            else:
                if self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                    self.Sort("CumReturn",["TECS","SOXS","SQQQ","TMF","SHY"],5,True,4,1)
                else:
                    self.Sort("SMADayRet",["TECL","TQQQ","SOXL","UPRO","EWZ","TMF"],5,False,4,1)
        else:
            if self.CumReturn('TQQQ',6) < -0.1:
                self.Sort("SMADayRet",["TECL","TQQQ","TMF"],7,False,4,1)
            else:
                self.Sort("SMADayRet",["SOXL","TMF"],7,False,4,1)
    def AABIfShortTermTLTIsTrendingDown2(self):

        if self.RSI('TLT',14) < 20:
            self.AH('TMF',4,1)
        else:
            if self.SMADayRet('TLT',20) < 0:
                self.AABBARiskOffRisingRatesTMV()
            else:
                self.AABBBRiskOffFallingRatesTMF2()
    def AABBBRiskOffFallingRatesTMF2(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                self.Sort("SMADayRet",["TQQQ","SOXL","UPRO","TECL","TMF"],5,True,4,1)
            else:
                self.Sort("SMADayRet",["TECL","TQQQ","SOXL","TMF"],5,False,4,1)
        elif self.SMA('SPY',210) > self.SMA('DBC',360):
            if self.RSI('TQQQ',11) > 77:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            elif self.CumReturn('TQQQ',6) < -0.1:
                if self.CumReturn('TQQQ',1) > 0.055:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    self.Sort("SMADayRet",["TECL","TQQQ","EPI","SOXL","UPRO","QLD","EWZ","MVV","XLU","USD","TMF"],7,False,4,1)
            elif 50 < self.RSI('IEF',7):
                self.Sort("SMADayRet",["TECL","TQQQ","SOXL","XLU"],5,False,4,1)
            else:
                self.Sort("CumReturn",["SOXS","SQQQ","UCO","DIG"],5,False,4,1)
        else:
            self.Sort("SMADayRet",["EPI","UPRO","SOXL","TQQQ"],5,True,4,1)
    def ABMediumTermTLTMayBeOverbought3(self): 
        if self.RSI('TLT',14) > 80:
            self.ABAMediumtermTLTisoverbought()
        else:
            self.ABBLeveragedSafety()
    def ABBLeveragedSafety(self):
        if self.SMADayRet('TLT',20) < 0:
            self.ABBARiskOffRisingRatesTMV()
        else:
            self.ABBARiskOffFallingRatesTMF2()
    def ABBARiskOffFallingRatesTMF2(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TECL","TQQQ","SOXL"],5,False,4,1)
            elif self.CumReturn('SPY',2) <= -0.02:
                self.Sort("CumReturn",["TECS","SOXS","SQQQ"],5,True,4,1)
            elif self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                self.Sort("CumReturn",["ERX","EUO","YCS"],5,True,4,1)
            else:
                self.Sort("SMADayRet",["SOXL","EWZ","MVV","USD"],5,False,4,1)
        elif self.SMADayRet('SPY',210) > self.SMADayRet('DBC',360):
            if self.RSI('TQQQ',11) > 77:
                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
            elif self.CumReturn('TQQQ',6) < -0.1:
                if self.CumReturn('TQQQ',1) > 0.055:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                elif 50 < self.RSI('IEF',7):
                    self.AH('SOXL',4,1)
                else:
                    self.Sort("CumReturn",["EWZ","UUP","TMF","UCO"],5,True,4,1)
            elif 50 < self.RSI('IEF',7):
                self.Sort("SMADayRet",["TECL","TQQQ","UPRO","QLD","USD"],5,False,4,1)
            else:
                self.Sort("CumReturn",["EWZ","UUP","TMF"],5,True,4,1)
        else:
            self.DefenseModified5()
    def DefenseModified5(self):
        if self.STD('DBC',20) > self.STD('SPY',20):
            self.Sort("RSI",["SHY","EWZ","GLD","SPXU","TECS","SOXS","UCO","YCS"],5,False,4,1)
        elif 50 < self.RSI('IEF',7):
            self.Sort("SMADayRet",["SOXL","USD","TMF"],5,False,4,1)
        else:
            self.Sort("CumReturn",["EWZ","SPXU","SOXS","UCO","YCS"],5,True,4,1)
    def BLongTLTtrendingdown2(self):
        if self.Securities['TLT'].Price < self.SMA('TLT',21):
            self.BAARiskOffRisingRatesTMV3()
        else:
            self.BABRiskOffFallingRatesTMF3()
    def BAARiskOffRisingRatesTMV3(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.RSI('TQQQ',10) < 30:
                self.Sort("SMADayRet",["TQQQ","SOXL","UPRO"],5,True,4,1)
            else:
                if self.CumReturn('SPY',2) <= -0.02:
                    self.Sort("CumReturn",["SPXU","TECS","SOXS","SQQQ","ERX"],5,False,4,1)
                else:
                    if self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                        self.Sort("CumReturn",["SOXS","SQQQ","EPI"],5,True,4,1)
                    else:
                        self.Sort("SMADayRet",["TECL","SOXL","TMV"],5,False,4,1)
        else:
            if self.SMA('SPY',210) > self.SMA('DBC',360):
                if self.RSI('TQQQ',11) > 77:
                    self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                else:
                    if self.CumReturn('TQQQ',6) < -0.1:
                        if self.CumReturn('TQQQ',1) > 0.055:
                            self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                        else:
                            self.Sort("SMADayRet",["SOXL","IYK","TMV"],5,False,4,1)
                    else:
                        if 50 < self.RSI('IEF',7):
                            self.Sort("SMADayRet",["TQQQ","SOXL","UPRO","TMV","TECL"],5,True,4,1)
                        else:
                            self.Sort("SMADayRet",["SOXL","UPRO","IYK"],22,False,4,1)
            else:
                self.DefenseModified6()
    def DefenseModified6(self):
        if self.STD('DBC',20) > self.STD('SPY',20):
            if self.STD('DBC',10) >= 0.03:
                if self.STD('TMV',5) <= self.STD('DBC',5):
                    self.AH('TMV',4,1)
                else:
                    self.AH('DBC',4,1)
            else:
                if 50 < self.RSI('IEF',7):
                    self.Sort("SMADayRet",["TMV","SOXS","SPXU"],5,True,4,1)
                else:
                    self.Sort("CumReturn",["EFA","EEM","SPXU","SOXS","UCO","TMV"],5,False,4,1)
        else:
            if 50 < self.RSI('IEF',7):
                self.Sort("SMADayRet",["EPI","SOXL","UPRO"],5,False,4,1)
            else:
                self.Sort("CumReturn",["EWZ","TECS","SOXS","EUO","YCS","TMV"],5,True,4,1)
    def BABRiskOffFallingRatesTMF3(self):
        if self.EMA('SPY',210) <= self.SMA('SPY',360):
            if self.CumReturn('SPY',2) < -0.02:
                self.Sort("CumReturn",["SPXU","TECS","SOXS","SQQQ"],5,True,4,1)
            else:
                if self.CumReturn('SPXU',6) >= self.CumReturn('UPRO',3):
                    self.Sort("CumReturn",["BIL","AGG","TMF"],5,False,4,1)
                else:
                    self.Sort("CumReturn",["TECL","TQQQ","SOXL","EWZ","TMF"],5,False,4,1)
        else:
            if self.SMA('SPY',210) > self.SMA('DBC',360):
                if self.EMA('SPY',210) > self.EMA('SPY',360):
                    if self.RSI('TQQQ',11) > 77:
                        self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                    else:
                        if self.CumReturn('TQQQ',6) < -0.1:
                            if self.CumReturn('TQQQ',1) > 0.055:
                                self.AH(['SPXU','UVXY','SQQQ'], 4, 0.33)
                            else:
                                self.Sort("SMADayRet",["TECL","TQQQ","EPI","SOXL","UPRO","QLD","EWZ","MVV","XLU","USD","TMF"],7,True,4,1)
                        else:
                            if 50 < self.RSI('IEF',7):
                                self.Sort("SMADayRet",["TECL","EPI","SOXL","UPRO","MVV"],7,False,4,1)
                            else:
                                self.Sort("CumReturn",["SOXS","TMF"],5,True,4,1)
                else:
                    self.Sort("RSI",["SPXU","SQQQ","TECS","SOXS"],5,False,4,1)
            else:
                self.DefenseModified7()
    def DefenseModified7(self):
        if self.STD('DBC',20) > self.STD('SPY',20):
            self.Sort("RSI",["SPXU","EPI","TECS","SOXS","SQQQ"],5,False,4,1)
        else:
            self.Sort("SMADayRet",["TECL","TQQQ","SOXL","TMF"],5,True,4,1)
    def FiveandBelow12(self):
        self.Sort("SMADayRet",["TECL","TQQQ","SOXL","UPRO","QLD"],5,False,4,1)       
    def ExecuteTrade(self):
        group1 = {
            'HTS': [self.HTS1[i][0] if len(self.HTS1[i]) == 1 else self.HTS1[i] for i in self.HTS1],
            'HT': [self.HT1[i] for i in self.HT1]
        }
        df1 = pd.DataFrame(group1)
        group2 = {
            'HTS': [self.HTS2[i][0] if len(self.HTS2[i]) == 1 else self.HTS2[i] for i in self.HTS2],
            'HT': [self.HT2[i] for i in self.HT2]
        }
        df2 = pd.DataFrame(group2)
        group3 = {
            'HTS': [self.HTS3[i][0] if len(self.HTS3[i]) == 1 else self.HTS3[i] for i in self.HTS3],
            'HT': [self.HT3[i] for i in self.HT3]
        }
        df3 = pd.DataFrame(group3)
        group4 = {
            'HTS': [self.HTS4[i][0] if len(self.HTS4[i]) == 1 else self.HTS4[i] for i in self.HTS4],
            'HT': [self.HT4[i] for i in self.HT4]
        }
        df4 = pd.DataFrame(group4)
        group5 = {
            'HTS': [self.HTS5[i][0] if len(self.HTS5[i]) == 1 else self.HTS5[i] for i in self.HTS5],
            'HT': [self.HT5[i] for i in self.HT5]
        }
        df5 = pd.DataFrame(group5)
        df = pd.concat([df1,df2,df3,df4,df5])
        df['HTS'] = df['HTS'].astype(str)
        result = df.groupby(['HTS']).sum().reset_index()
        # Dictionary with pairs and their divisors
        pairs_dict = {'SOXS':{'symbol':'SOXL', 'divisor':1}, 'TQQQ':{'symbol':'SQQQ', 'divisor':1}, 'SPXL':{'symbol':'SPXS', 'divisor':1}, 'WEBL':{'symbol':'WEBS', 'divisor':1}, 'TECL':{'symbol':'TECS', 'divisor':1}, 'UPRO':{'symbol':'SPXU', 'divisor':1}, 'QQQ':{'symbol':'PSQ', 'divisor':1}, 'SPY':{'symbol':'SH', 'divisor':1}, 'SARK':{'symbol':'TARK', 'divisor':2}, 'UVXY':{'symbol':'VIXY', 'divisor':1.5}, 'TMV':{'symbol':'TMF', 'divisor':1}}
        pairs_dict.update({v['symbol']: {'symbol': k, 'divisor': 1/v['divisor']} for k, v in pairs_dict.items()}) # To ensure both directions are covered

        for equity in self.equities:
            if all(not pd.isnull(result.iloc[i,0]) and not equity == result.iloc[i,0] for i in range(len(result))):
                if self.Portfolio[equity].HoldStock:
                    self.Liquidate(equity) #Lidquidate any symbol that is not in result and exists in portfolio

        output = "*****"
        for i in range(len(result)):
            if result.iloc[i,0]:
                percentage = round(result.iloc[i,1] * 100,2)
                output += "{}: {}% - ".format(result.iloc[i,0],percentage)
        output = output.rstrip(" - ")
        self.Log(output)

        # Create a dictionary with symbol and its respective value from result dataframe
        symbol_dict = dict(zip(result.iloc[:,0], result.iloc[:,1]))

        # Iterate over pairs for selling
        for symbol1, data in pairs_dict.items():
            symbol2 = data['symbol']
            divisor = data['divisor']
            if symbol1 in symbol_dict and symbol2 in symbol_dict:
                offset_value = abs(symbol_dict[symbol1] - symbol_dict[symbol2] / divisor)

                # Lidquidate the smaller value symbol if exists in portfolio
                if symbol_dict[symbol1] > symbol_dict[symbol2] / divisor and self.Portfolio[symbol2].HoldStock:
                    self.Liquidate(symbol2)
                elif self.Portfolio[symbol1].HoldStock:
                    self.Liquidate(symbol1)

                # Remove these two symbols from symbol_dict as we have already processed them
                symbol_dict.pop(symbol1)
                symbol_dict.pop(symbol2)

        # Iterate over remaining symbols in symbol_dict for selling
        for symbol, value in symbol_dict.items():
            if not value == 0 and not symbol == 'BIL':
                percentage_equity = self.Portfolio[symbol].HoldingsValue / self.Portfolio.TotalPortfolioValue
                if value < percentage_equity and abs(value / percentage_equity - 1) > self.buffer_pct: #SetHolding at lower value to sell
                    self.SetHoldings(symbol, value)

        # Iterate again over pairs for buying
        symbol_dict = dict(zip(result.iloc[:,0], result.iloc[:,1])) # Recreate the symbol_dict since we had popped elements in the previous loop
        for symbol1, data in pairs_dict.items():
            symbol2 = data['symbol']
            divisor = data['divisor']
            if symbol1 in symbol_dict and symbol2 in symbol_dict:
                offset_value = abs(symbol_dict[symbol1] - symbol_dict[symbol2] / divisor)

                # Buy the symbol with greater value
                if symbol_dict[symbol1] > symbol_dict[symbol2] / divisor:
                    self.SetHoldings(symbol1, offset_value)
                else:
                    self.SetHoldings(symbol2, offset_value)

                # Remove these two symbols from symbol_dict as we have already processed them
                symbol_dict.pop(symbol1)
                symbol_dict.pop(symbol2)

        # Iterate over remaining symbols in symbol_dict for buying
        for symbol, value in symbol_dict.items():
            if not value == 0 and not symbol == 'BIL':
                percentage_equity = self.Portfolio[symbol].HoldingsValue / self.Portfolio.TotalPortfolioValue
                if value > percentage_equity and abs(percentage_equity / value - 1) > self.buffer_pct: #SetHolding at higher value to buy
                    self.SetHoldings(symbol, value)


    def PrintStrategy(self):
        strategy_dataframes = {
            'TQQQFTLT': {
                'HTS': [self.HTS1[i][0] if len(self.HTS1[i]) == 1 else self.HTS1[i] for i in self.HTS1],
                'HT': [self.HT1[i] for i in self.HT1]
            },
            'SOXXRSIMachine': {
                'HTS': [self.HTS2[i][0] if len(self.HTS2[i]) == 1 else self.HTS2[i] for i in self.HTS2],
                'HT': [self.HT2[i] for i in self.HT2]
            },
            'TQQQorNOT': {
                'HTS': [self.HTS3[i][0] if len(self.HTS3[i]) == 1 else self.HTS3[i] for i in self.HTS3],
                'HT': [self.HT3[i] for i in self.HT3]
            },
            'Beta Baller': {
                'HTS': [self.HTS4[i][0] if len(self.HTS4[i]) == 1 else self.HTS4[i] for i in self.HTS4],
                'HT': [self.HT4[i] for i in self.HT4]
            },
            'Best 0-20 days': {
                'HTS': [self.HTS5[i][0] if len(self.HTS5[i]) == 1 else self.HTS5[i] for i in self.HTS5],
                'HT': [self.HT5[i] for i in self.HT5]
            }
        }
        output_strategies = []
        for strategy_name,data in strategy_dataframes.items():
            df = pd.DataFrame(data)
            df['HTS'] = df['HTS'].astype(str)
            result = df.groupby(['HTS']).sum().reset_index()
            valid_results = result[(result['HTS'] != '[]') & (result['HT'] != 0)]
            strategy_output = f"{strategy_name}: " + ', '.join([f"{row['HTS']}({row['HT']*100:.2f}%)" for _,row in valid_results.iterrows()])
            output_strategies.append(strategy_output)
        output = '; '.join(output_strategies)
        self.Log(output)
        self.HT1 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS1 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT2 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS2 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT3 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS3 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT4 = {str(i).zfill(2): 0 for i in range(1,10)}
        self.HTS4 = {str(i).zfill(2): [] for i in range(1,10)}
        self.HT5 = {str(i).zfill(2): 0 for i in range(1,40)}
        self.HTS5 = {str(i).zfill(2): [] for i in range(1,40)}
        #self.HT6 = {str(i).zfill(2): 0 for i in range(1,10)}
        #self.HTS6 = {str(i).zfill(2): [] for i in range(1,10)}