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)