Overall Statistics
Total Trades
5
Average Win
0.07%
Average Loss
0.00%
Compounding Annual Return
0.758%
Drawdown
0.100%
Expectancy
82.734
Net Profit
0.085%
Sharpe Ratio
1.555
Probabilistic Sharpe Ratio
57.752%
Loss Rate
50%
Win Rate
50%
Profit-Loss Ratio
166.47
Alpha
0.004
Beta
0.005
Annual Standard Deviation
0.004
Annual Variance
0
Information Ratio
-2.731
Tracking Error
0.143
Treynor Ratio
1.225
Total Fees
$5.00
Estimated Strategy Capacity
$110000000000.00
Lowest Capacity Asset
F R735QTJ8XC9X
class BootCampTask(QCAlgorithm):
    
    def Initialize(self):
        self.SetStartDate(2021, 1, 1)
        self.SetEndDate(2021, 2, 10)
        self.SetCash(100000)
        
        self.symbol_data_by_symbol = {}
        tickers = ['SPY', 'TSLA', 'F']
        for ticker in tickers:
            security = self.AddEquity(ticker, Resolution.Daily)
            security.SetDataNormalizationMode(DataNormalizationMode.Raw)
            self.symbol_data_by_symbol[security.Symbol] = {'stopMarketTicket': None, 
                                                           'stopMarketOrderFillTime': datetime.min, 
                                                           'highestPrice': -1}
            
        
    def OnData(self, data):
        
        for symbol, symbol_data in self.symbol_data_by_symbol.items():
            # 1. Plot the current price
            self.Plot(str(symbol), "Asset Price", data[symbol].Close)
    
            if (self.Time - symbol_data['stopMarketOrderFillTime']).days < 15:
                return
    
            if not self.Portfolio[symbol].Invested:
                self.MarketOrder(symbol, 1)
                symbol_data['stopMarketTicket'] = self.StopMarketOrder(symbol, -1, 0.9 * self.Securities[symbol].Close)
            
            else:
                
                #2. Plot the moving stop price
                self.Plot(str(symbol), "Stop Price", symbol_data['stopMarketTicket'].Get(OrderField.StopPrice))
                
                if self.Securities[symbol].Close > symbol_data['highestPrice']:
                    
                    symbol_data['highestPrice'] = self.Securities[symbol].Close
                    updateFields = UpdateOrderFields()
                    updateFields.StopPrice = symbol_data['highestPrice'] * 0.9
                    symbol_data['stopMarketTicket'].Update(updateFields) 
            
    def OnOrderEvent(self, orderEvent):
        
        if orderEvent.Status != OrderStatus.Filled:
            return
        
        for symbol, symbol_data in self.symbol_data_by_symbol.items():
            if symbol_data['stopMarketTicket'] is not None and symbol_data['stopMarketTicket'].OrderId == orderEvent.OrderId: 
                symbol_data['stopMarketOrderFillTime'] = self.Time