Overall Statistics
class HipsterTanDuck(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 3, 20)  # Set Start Date
        self.SetEndDate(2022, 3, 19)
        self.SetCash(100000)  # Set Strategy Cash

        self.rsiUpperThreshold = 70
        self.rsiLowerThreshold = 30
        
        universe = ['FDX', 'UPS']
        self.pairs = [Pair(self, ticker) for ticker in universe]
        self.SetWarmUp(18)
    
    def ProcessLiquidations(self, data):
        for pair in self.pairs:
            if not pair.rsi.IsReady:
                return
            
            symbol_1 = pair[0].symbol
            symbol_2 = pair[1].symbol
            
            rsi_1 = pair[0].rsi.Current.Value
            rsi_2 = pair[1].rsi.Current.Value
            
            if self.Portfolio[symbol[0]].IsLong:
                if rsi_1 > 50:
                    self.Liquidate(symbol[0])
                    self.Liquidate(symbol[1])
            elif self.Portfolio[symbol[0]].IsShort:
                if rsi_1 < 50:
                    self.Liquidate(symbol[0])
                    self.Liquidate(symbol[1])
            elif self.Portfolio[symbol[1]].IsLong:
                if rsi_2 > 50:
                    self.Liquidate(symbol[0])
                    self.Liquidate(symbol[1])
            elif self.Portfolio[symbol[1]].IsShort:
                if rsi_2 < 50:
                    self.Liquidate(symbol[0])
                    self.Liquidate(symbol[1])
            continue
        
    
    def ProcessBuys(self, data):
        global rsi_pep, rsi_ko, flag
        for pair in self.pairs:
            if not pair.rsi.IsReady:
                return
            
            symbol_1 = pair[0].symbol
            symbol_2 = pair[1].symbol
            
            rsi_1 = pair[0].rsi.Current.Value
            rsi_2 = pair[1].rsi.Current.Value
            
            if rsi_1 > 70 and rsi_2 < 30:
                self.SetHoldings(symbol[0], -0.3)
                self.SetHoldings(symbol[1], 0.3)
            elif rsi_2 > 70 and rsi_1 < 30:
                self.SetHoldings(symbol[1], -0.3)
                self.SetHoldings(symbol[0], 0.3)
                
    def OnData(self, data: Slice):

        self.ProcessLiquidations(data)
        self.ProcessBuys(data)
            
class Pair:
    def __init__(self, algorithm, ticker):
        self.symbol = algorithm.AddEquity(ticker, Resolution.Daily).Symbol
        self.rsi = algorithm.RSI(self.symbol, 9, MovingAverageType.Simple, Resolution.Daily)