Overall Statistics |
Total Trades 1133 Average Win 0.92% Average Loss -0.63% Compounding Annual Return 0.431% Drawdown 23.600% Expectancy 0.011 Net Profit 1.464% Sharpe Ratio 0.08 Probabilistic Sharpe Ratio 2.097% Loss Rate 59% Win Rate 41% Profit-Loss Ratio 1.45 Alpha -0.012 Beta 0.224 Annual Standard Deviation 0.102 Annual Variance 0.01 Information Ratio -0.443 Tracking Error 0.18 Treynor Ratio 0.037 Total Fees $2061.48 Estimated Strategy Capacity $19000000.00 Lowest Capacity Asset QQQ RIWIV7K5Z9LX Portfolio Turnover 86.82% |
# region imports from AlgorithmImports import * # endregion class MuscularTanMosquito(QCAlgorithm): # In raw price diff # sl = .25 sl_dlrs = 200 #DEFAULT -- overridden by the left hand pane. ticker = 'QQQ' def Initialize(self): self.SetStartDate(2020, 1, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.symbol = self.AddEquity(self.ticker, Resolution.Minute).Symbol # Required for options... # self.Securities[self.symbol].SetDataNormalizationMode(DataNormalizationMode.Raw) self.Schedule.On(self.DateRules.EveryDay(self.symbol), self.TimeRules.BeforeMarketClose(self.symbol, 10), self.EOD) self.open_d = None self.high_d = 0 self.high_d1 = None # PARAMETERS (actual) tst = self.GetParameter("SL") if tst: self.sl_dlrs = int(tst) def EOD(self): invested = [kvp.Key for kvp in self.Portfolio if kvp.Value.Invested] for symbol in invested: opnl = self.Portfolio[symbol].UnrealizedProfit self.Liquidate(symbol, f"EOD Exit -- PNL {opnl}") def OnData(self, data: Slice): data = data.Bars if not data.ContainsKey(self.symbol): return o,h,l,c = data[self.symbol].Open, data[self.symbol].High, data[self.symbol].Low, data[self.symbol].Close bar_tm = data[self.symbol].EndTime # self.Debug(f'Bar Time: {bar_tm}') if bar_tm.hour == 9 and bar_tm.minute == 31: self.open_d = o self.high_d1 = self.high_d self.high_d = h # Use historical lookup instead... hist = self.History(self.symbol, 5, Resolution.Daily).loc[self.symbol] self.high_d1 = hist.iloc[-1].high self.Debug(f'{self.Time} -- open > high[1] ? {self.open_d} > {self.high_d1}') self.high_d = max(h, self.high_d) if all([self.high_d, self.high_d1]): if self.EntryLogic: if not self.Portfolio.Invested: quantity = self.CalculateOrderQuantity(self.symbol, 0.95) self.MarketOrder(self.symbol, quantity, False, "Entry") @property def EntryLogic(self): return self.open_d > self.high_d1 ## TODO: use OnOrderEvent to set stop? def OnOrderEvent(self, orderEvent): #ONLY concerned with FILLED orders. Wait on partials, etc. if orderEvent.Status != OrderStatus.Filled: return order_symbol = orderEvent.Symbol oid = orderEvent.OrderId order = self.Transactions.GetOrderById(oid) shares = orderEvent.AbsoluteFillQuantity entry_price = orderEvent.FillPrice dir = orderEvent.Direction buy = dir == OrderDirection.Buy sell = dir == OrderDirection.Sell fill_price = orderEvent.FillPrice entry = order.Tag.startswith("Entry") exit = order.Tag.startswith("SSL") or order.Tag.startswith("LSL") if entry: if buy: sl_pts = abs(self.sl_dlrs / shares) self.StopMarketOrder(order_symbol, -1 * shares, entry_price - sl_pts, "LSL") # if sell: # self.StopMarketOrder(order_symbol, -1 * shares, entry_price + self.sl, "SSL") return if exit: self.Transactions.CancelOpenOrders()