class SPY_SMA(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 4, 10) # Set Start Date
self.SetEndDate(2021, 4, 17) # Set End Date
self.SetCash(100000) # Set Strategy Cash
#self.SetSecurityInitializer(lambda x: x.SetFillModel(ExtendedMarketHoursFillModel(self)))
symbol = "SPY"
spy = self.AddEquity(symbol, extendedMarketHours = True)
#spy = self.AddEquity(symbol , Resolution.Minute )
self.spy = spy.Symbol
fiveCountConsolidator = TradeBarConsolidator(TimeSpan.FromMinutes(5)) # 构建函数合成30min数据
fiveCountConsolidator.DataConsolidated += self.FiveBarHandler
self.SubscriptionManager.AddConsolidator(self.spy, fiveCountConsolidator)
self.sma_5min_window = RollingWindow[float](2)
self.sma_30min_window = RollingWindow[float](2)
self.close_window = RollingWindow[float](2)
self.sma_5min_5 = SimpleMovingAverage(5) # 计算基于5min 的MA5
self.sma_5min_30 = SimpleMovingAverage(30) # 计算基于30min 的MA30
self.RegisterIndicator(self.spy, self.sma_5min_5, fiveCountConsolidator) # 注册 sma5
self.RegisterIndicator(self.spy, self.sma_5min_30, fiveCountConsolidator)
self.initFinished = False
self.quantity = 0
self.SetWarmUp(5, Resolution.Minute)
def OnData(self, data):
self.Quit(f"First bar at {data.Time}")
def FiveBarHandler(self, sender, bar):
self.close_window.Add(bar.Close)
if self.sma_5min_5.IsReady:
self.sma_5min_window.Add(self.sma_5min_5.Current.Value)
if self.sma_5min_30.IsReady:
self.sma_30min_window.Add(self.sma_5min_30.Current.Value)
if self.initFinished and self.sma_30min_window.IsReady:
if (self.sma_5min_window[0] > self.sma_30min_window[0]) and (self.close_window[0] > self.sma_5min_window[0]):
self.OrderSecurity("Positive")
elif (self.sma_5min_window[0] < self.sma_30min_window[0]) and (self.close_window[0] < self.sma_5min_window[0]):
self.OrderSecurity("Negative")
def OrderSecurity(self, Tag):
if self.quantity >= 0 and Tag is "Negative":
self.MarketOrder(self.spy, -self.quantity - 1)
self.quantity = -1
if self.quantity < 0 and Tag is "Positive":
self.MarketOrder(self.spy, -self.quantity + 1 )
self.quantity = 1
def OnWarmupFinished(self):
self.initFinished = True