| 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