HI I need help with the update indicators portion. My code intends to update indicators 3 minutes before close for SMA & RSI, then execute sell and buy trades right before closing.

Two concerns:

  1. My live and backtest RSI and SMA values were really different. I narrowed this down to the fact that live uses ticks while backtest uses the closing of the minute, hence I created version 1 of UpdateIndicators which uses the history function to get the last minute closing price 2.5 minutes before market closes. However, there was still a discrepancy between the live trading indicator values and the backtest indicator values
  2. I need to reset indicators on corporate events like stock splits and dividends, however, I can't figure out how to warmup the indicators using the 3rd last minute of every trading day instead of just the daily closing price.

Any suggestions would be greatly appreciated

Thank you!

 



from AlgorithmImports import *

class RSIAndMovingAverageStrategy(QCAlgorithm):
    def Initialize(self):

        self.symbols = {
            "SPY": {"symbol": self.AddEquity("SPY", Resolution.Minute).Symbol, "sma": SimpleMovingAverage(200), "rsi": RelativeStrengthIndex(10, MovingAverageType.Wilders)},
            "UVXY": {"symbol": self.AddEquity("UVXY", Resolution.Minute, dataNormalizationMode=DataNormalizationMode.Raw).Symbol, "rsi": RelativeStrengthIndex(10, MovingAverageType.Wilders)},
            "SQQQ": {"symbol": self.AddEquity("SQQQ", Resolution.Minute).Symbol, "rsi": RelativeStrengthIndex(9, MovingAverageType.Wilders)},
        }

        self.Schedule.On(self.DateRules.EveryDay(self.symbols["SPY"]["symbol"]), self.TimeRules.BeforeMarketClose(self.symbols["SPY"]["symbol"], 3), self.UpdateIndicators)
        self.Schedule.On(self.DateRules.EveryDay(self.symbols["SPY"]["symbol"]), self.TimeRules.BeforeMarketClose(self.symbols["SPY"]["symbol"], 1), self.LiquidateIfNecessary)
        self.Schedule.On(self.DateRules.EveryDay(self.symbols["SPY"]["symbol"]), self.TimeRules.BeforeMarketClose(self.symbols["SPY"]["symbol"], 0.5), self.ExecuteBuyOrders)
        
        self.SetWarmUp(230, Resolution.Daily)

#version 1
    def UpdateIndicators(self):
        for symbol_key, symbol_data in self.symbols.items():
            symbol = symbol_data["symbol"]
            history = self.History(symbol, 1, Resolution.Minute)
            if not history.empty:
                price = history['close'].iloc[-1]
                time = history.index[-1][1]
                for key in ['sma', 'rsi','rsi_13', 'sma_20', 'sma_45', 'sma_190', 'sma_230']:
                    if key in symbol_data:
                        symbol_data[key].Update(time, price)

#version 2
    def UpdateIndicators(self):
        for symbol_data in self.symbols.values():
            if self.Securities.ContainsKey(symbol_data["symbol"]) and self.Securities[symbol_data["symbol"]].HasData:
                price = self.Securities[symbol_data["symbol"]].Price
                for key in ['sma', 'rsi', 'rsi_13', 'sma_20', 'sma_45', 'sma_190', 'sma_230']:
                    if key in symbol_data:
                        symbol_data[key].Update(self.Time, price)