Overall Statistics
Total Trades
2
Average Win
0%
Average Loss
-5.66%
Compounding Annual Return
-95.216%
Drawdown
5.800%
Expectancy
-1
Net Profit
-5.663%
Sharpe Ratio
-3.26
Probabilistic Sharpe Ratio
10.263%
Loss Rate
100%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.182
Beta
1.032
Annual Standard Deviation
0.258
Annual Variance
0.067
Information Ratio
-4.283
Tracking Error
0.047
Treynor Ratio
-0.815
Total Fees
$2.58
Estimated Strategy Capacity
$930000000.00
Lowest Capacity Asset
QQQ RIWIV7K5Z9LX
class PensiveLightBrownBull(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2022, 3, 1)  # Set Start Date
        self.SetCash(100000)  # Set Strategy Cash
        self.qqq = self.AddEquity("QQQ", Resolution.Daily).Symbol
        
        self.entryTicket = None
        self.stopMarketTicket = None
        self.entryTime = datetime.min
        self.stopMarketOrderFillTime = datetime.min
        self.highestPrice = 0
        


    def OnData(self, data):
        # wait 30 days after last exit
        if (self.Time - self.stopMarketOrderFillTime).days < 30:
            return
        
        price = self.Securities[self.qqq].Close
        
        # send entry limit order
        if not self.Portfolio.Invested and not self.Transactions.GetOpenOrders(self.qqq):
            quantity = self.CalculateOrderQuantity(self.qqq, 0.9)
            self.entryTicket = self.StopLimitOrder(self.qqq, quantity, price, price,"Entry Order")
            self.entryTime = self.Time
        
        # move limit price if not filled after 1 day
        if (self.Time - self.entryTime).days > 1 and self.entryTicket.Status != OrderStatus.Filled:
            self.entryTime = self.Time
            updateFields = UpdateOrderFields()
            updateFields.StopPrice = price
            updateFields.LimitPrice = price
            self.entryTicket.Update(updateFields)

        # move up trailing stop price
        if self.stopMarketTicket is not None and self.Portfolio.Invested:
            if price > self.highestPrice:
                self.highestPrice = price
                updateFields = UpdateOrderFields()
                updateFields.StopPrice = price * 0.95
                self.stopMarketTicket.Update(updateFields)
    
    def OnOrderEvent(self, orderEvent):
        if orderEvent.Status != OrderStatus.Filled:
            return
        
        # send stop loss order if entry limit order is filled
        if self.entryTicket is not None and self.entryTicket.OrderId == orderEvent.OrderId:
            self.stopMarketTicket = self.StopMarketOrder(self.qqq, -self.entryTicket.Quantity, self.entryTicket.AverageFillPrice * 0.95)
        
        # save fill time of stop loss order (and reset highestPrice)
        if self.stopMarketTicket is not None and self.stopMarketTicket.OrderId == orderEvent.OrderId:
            self.stopMarketOrderFillTime = self.Time
            self.highestPrice = 0