Overall Statistics
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