Overall Statistics
Total Trades
2
Average Win
7.29%
Average Loss
0%
Compounding Annual Return
295.861%
Drawdown
6.800%
Expectancy
0
Net Profit
7.290%
Sharpe Ratio
6.486
Probabilistic Sharpe Ratio
92.860%
Loss Rate
0%
Win Rate
100%
Profit-Loss Ratio
0
Alpha
2.065
Beta
-0.429
Annual Standard Deviation
0.273
Annual Variance
0.074
Information Ratio
3.491
Tracking Error
0.309
Treynor Ratio
-4.125
Total Fees
$0.00
Estimated Strategy Capacity
$500000.00
Lowest Capacity Asset
HUBS VUL3FDOXHN51
class MuscularFluorescentOrangeGoat(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2021, 10, 1)
        self.SetEndDate(2021, 10, 19)
        self.SetCash(100000)
        
        self.hubs = self.AddEquity("HUBS", Resolution.Minute).Symbol
        
        
        self.sma = self.SMA(self.hubs, 15, Resolution.Minute)
        self.HighPrice = 0
        
        self.stopPricePct = .98
        
        self.entryTicket = None
        self.stopMarketTicket = None
        
        # schedule "ExitPositions" to run every day 10 minutes before market close
        self.Schedule.On(self.DateRules.EveryDay(self.hubs),
                        self.TimeRules.BeforeMarketClose(self.hubs, 10),
                        self.ExitPositions)
        

    def OnData(self, data):
        
        price = self.Securities[self.hubs].Price
        sma = self.sma.Current.Value
        self.Securities[self.hubs].FeeModel = ConstantFeeModel(0)
        
        if not self.sma.IsReady:
            if price > self.HighPrice:
                self.HighPrice = price
            return
        
        
        
        if price > 1.01 * sma and price > self.HighPrice:
            if not self.Portfolio[self.hubs].IsLong:
                quantity = self.CalculateOrderQuantity(self.hubs, .95)
                self.entryTicket = self.LimitOrder(self.hubs, quantity, price * 1.005, "Entry Order")
        
        if price > self.HighPrice:
            self.HighPrice = price
        
                
        #move up trailing stop price
        if self.stopMarketTicket is not None and self.Portfolio.Invested:
            updateFields = UpdateOrderFields()
            updateFields.StopPrice = price * self.stopPricePct
            self.stopMarketTicket.Update(updateFields)
        
        #self.Plot("Benchmark","SMA", self.sma.Current.Value)
        
    #LEAN calls OnOrderEvent if it exists and an order has occurred        
    def OnOrderEvent(self, orderEvent):
        if orderEvent.Status != OrderStatus.Filled:
            return
        
        #send stop loss order if entry order was filled
        if self.entryTicket is not None and self.entryTicket.OrderId == orderEvent.OrderId:
            self.stopMarketTicket = self.StopMarketOrder(self.hubs, -self.entryTicket.Quantity, self.stopPricePct * self.entryTicket.AverageFillPrice)
            
    def ExitPositions(self):
        self.Liquidate(self.hubs)