Overall Statistics
Total Trades
16
Average Win
0.00%
Average Loss
0.00%
Compounding Annual Return
-0.006%
Drawdown
0.000%
Expectancy
-0.303
Net Profit
0.000%
Sharpe Ratio
-5.908
Probabilistic Sharpe Ratio
11.931%
Loss Rate
88%
Win Rate
12%
Profit-Loss Ratio
4.57
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-7.269
Tracking Error
0.017
Treynor Ratio
0.102
Total Fees
$16.00
Estimated Strategy Capacity
$8800000.00
class SPY_SMA(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2021, 4, 25)  # 设置回测起始日期
        self.SetEndDate(2021, 4, 27) # 设置回测结束日期
        self.SetCash(100000000)  # 设置现金100000000
        
        self.spy = self.AddEquity("SPY" , Resolution.Minute , Market.USA , True, 1, True).Symbol #添加SPY数据
        
        fiveCountConsolidator = TradeBarConsolidator(TimeSpan.FromMinutes(5))  # 创造一个5分钟tradebar数据整合器            
        fiveCountConsolidator.DataConsolidated += self.FiveBarHandler #给5分钟tradebar数据整合器添加事件
        self.SubscriptionManager.AddConsolidator(self.spy, fiveCountConsolidator) #注册整合器来自动更新5分钟tradebar数据
        self.sma_5min_window = RollingWindow[float](2) #创建存储2个sma5数据的移动窗口
        self.sma_30min_window = RollingWindow[float](2) #创建存储2个sma30数据的移动窗口
        self.close_window = RollingWindow[float](2) #创建存储2个5分钟k线收盘价数据的移动窗口
        
        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)  # 注册SPY的每日数据来自动更新sma5指标
        self.RegisterIndicator(self.spy, self.sma_5min_30, fiveCountConsolidator)  #注册SPY的每日数据来自动更新sma30指标
        
        self.quantity = 0 #设置初始股票持有量为0
        self.stop_trade = False #设置停止交易标志
        self.current_day = 0  #记录日期
        self.day_loss = 0 #设置初始每日亏损金额为0
        self.day_values = 0 #每天起始资产金额
        self.SetWarmUp(30) #  为所有订阅的数据预热30笔数据

    def OnData(self, data):
        pass
        
    def FiveBarHandler(self, sender, bar):
        if bar.Time.day != self.current_day:
            self.day_values = self.Portfolio.Cash + self.Portfolio.UnsettledCash
            self.current_day = bar.Time.day
            self.stop_trade = False
            
        if bar.Time.day == self.current_day and not self.stop_trade:
            self.close_window.Add(bar.Close) #获取5分钟k线收盘价数值,将其添加到移动窗口中
            self.sma_5min_window.Add(self.sma_5min_5.Current.Value) #获取sma5的数值,将其添加到移动窗口中
            self.sma_30min_window.Add(self.sma_5min_30.Current.Value) #获取sma30的数值,将其添加到移动窗口中
            if self.sma_5min_window.IsReady 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]) and self.quantity <= 0:
                    self.MarketOrder(self.spy, -self.quantity + 100) #满足上述条件,提交市价订单,持多仓
                    self.quantity = 100 #更新股票持有量为100
                elif (self.sma_5min_window[0] < self.sma_30min_window[0]) \
                    and (self.close_window[0] < self.sma_5min_window[0]) and self.quantity > 0:
                    self.MarketOrder(self.spy, -self.quantity - 100) #满足上述条件,提交市价订单,持空仓
                    self.quantity = -100 #更新股票持有量为-100
        
            _current_values = self.Portfolio.Cash + self.Portfolio.UnsettledCash
            if _current_values < self.day_values:
                loss = self.day_values - _current_values #计算当日损失
                if (loss/self.day_values) >= 0.05 and not self.stop_trade: #当日亏损超过5%,清算资产
                    self.Liquidate()
                    self.stop_trade = True #设置当日策略暂停标志