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