As I know, the history request does not include the latest/current price bar until it closes in the end of market and I want to add it to the previous data whenever i called.
My strategy is to buy 7-days low SPY at 15mins before market close. Also , at that time, the price should be above sma200.
Below is my first code but i got the error. Could someone help, please. Thanks!
Error:
BacktestingRealTimeHandler.Run(): There was an error in a scheduled event SPY: EveryDay: SPY: 30 min before MarketClose. The error was AttributeError : 'NoneType' object has no attribute 'Close'
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *
from QuantConnect.Data.Market import TradeBar
from datetime import datetime, timedelta
import decimal
class DaysAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2003,1,1)
self.SetEndDate(2019,4,1)
self.SetCash(10000)
self.spy = self.AddEquity("SPY", Resolution.Daily)
#consolidator = TradeBarConsolidator(timedelta(1))
#consolidator.DataConsolidated += self.OnDailyData
#self.SubscriptionManager.AddConsolidator("SPY", consolidator)
self.daily = RollingWindow[TradeBar](2)
self.window = RollingWindow[TradeBar](2)
self.spy.SetDataNormalizationMode(DataNormalizationMode.Raw)
self.leverage = 1
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.BeforeMarketClose("SPY", 30), Action(self.Rebalance))
self.sma = self.SMA(self.spy.Symbol, 200, Resolution.Daily)
self.sma.Updated += self.SmaUpdated
self.smaWin = RollingWindow[IndicatorDataPoint](5)
def SmaUpdated(self, sender, updated):
self.smaWin.Add(updated)
def OnData(self, data):
self.window.Add(data["SPY"])
if not (self.window.IsReady and self.smaWin.IsReady): return
def Rebalance(self):
close = self.History(self.spy.Symbol, 6, Resolution.Daily)['close']
holdings = self.Portfolio[self.spy.Symbol].Quantity
currBar = self.window[0].Close
currSma = self.smaWin[0].Value
if not self.Portfolio.Invested and currBar > currSma and currBar < min(close):
self.SetHoldings(self.spy.Symbol, 1)
elif currBar < currSma or currBar > max(close):
self.SetHoldings(self.spy.Symbol, 0)