Overall Statistics |
Total Trades 1755 Average Win 0.35% Average Loss -0.15% Compounding Annual Return -6.973% Drawdown 17.800% Expectancy -0.048 Net Profit -7.004% Sharpe Ratio -0.344 Probabilistic Sharpe Ratio 8.900% Loss Rate 72% Win Rate 28% Profit-Loss Ratio 2.38 Alpha 0 Beta 0 Annual Standard Deviation 0.166 Annual Variance 0.027 Information Ratio -0.344 Tracking Error 0.166 Treynor Ratio 0 Total Fees $1985.91 |
class SymbolData: #Trading Parameters tradewithquantity, longquantity, shortquantity = False, 100, -100 # Trade in terms of number of contracts tradewithequity, longequity, shortequity = True, 0.4, -0.4 # Trade in terms of percentage of strategy equity #Declare vars symbol = None TrendList = [] bsignal = None ssignal = None sellmarketorder = None buymarketorder = None liquidationplaced = None def __init__(self, algorithm, symbol): self.symbol = symbol self.Fast = algorithm.SMA(symbol, 10, Resolution.Hour) self.Slow = algorithm.SMA(symbol, 20, Resolution.Hour) self.window = RollingWindow[TradeBar](10) # Max bars needed for pivothigh and pivotlow methods class OptimizedVentralRegulators(QCAlgorithm): # Set parameters # Backtest Portfolio Parameters cash = 100000 startyyyy, startm, startd = 2020, 1, 5 endyyyy, endm, endd = 2021, 1, 5 symbolList = ["AAPL", "GOOG"] symbolDict = {} def Initialize(self): # self.SetBenchmark(self.secticker) self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) self.SetStartDate(self.startyyyy, self.startm, self.startd) # Set Start Date self.SetEndDate(self.endyyyy, self.endm, self.endd) # Set End Date self.SetCash(self.cash) # Set Strategy Cash self.lookback = 30 # Set number of days to look back self.Transactions.MarketOrderFillTimeout = timedelta(seconds=30) for symbol in self.symbolList: self.AddEquity(symbol, Resolution.Hour) # Set security self.symbolDict[symbol] = SymbolData(self, symbol) # Pass symboldata object to symbolDict self.Securities[symbol].SetDataNormalizationMode(DataNormalizationMode.Raw) def LongOrder(self, symboldata): if symboldata.tradewithquantity and not symboldata.tradewithequity: symboldata.buymarketorder = self.MarketOrder(symboldata.symbol, symboldata.longquantity, False, "Long") if symboldata.tradewithequity and not symboldata.tradewithquantity: self.SetHoldings(symboldata.symbol, symboldata.longequity, True, "Long Equity Order") def ShortOrder(self, symboldata): if symboldata.tradewithquantity and not symboldata.tradewithequity: symboldata.sellmarketorder = self.MarketOrder(symboldata.symbol, symboldata.shortquantity, False,"Short") if symboldata.tradewithequity and not symboldata.tradewithquantity: self.SetHoldings(symboldata.symbol, symboldata.shortequity, True, "Short Equity Order") def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' for symboldata in self.symbolDict.values(): # looping through symboldata objects symbol = symboldata.symbol sec = self.Securities[symbol] close = sec.Close high = sec.High low = sec.Low if data.Bars.ContainsKey(symbol): currentbar = data.Bars[symbol] symboldata.window.Add(currentbar) if not symboldata.window.IsReady: # Ends onData method if rolling windowsnot ready return # Get fast and slow fast = symboldata.Fast.Current.Value slow = symboldata.Slow.Current.Value Trend = 0 # Set Trend values if fast > slow: Trend = 1 elif fast < slow: Trend = -1 symboldata.TrendList.append(Trend) # Long and short crirteria if len(symboldata.TrendList) > 2: if Trend == 1 and symboldata.TrendList[-2] == -1: symboldata.bsignal = True self.Liquidate(symbol, "Liquidated Buy Signal") symboldata.liquidationplaced = True if Trend == -1 and symboldata.TrendList[-2] == 1: symboldata.ssignal = True self.Liquidate(symbol, "Liquidated Sell Signal") symboldata.liquidationplaced = True # Place trades when signals are true if symboldata.bsignal: self.LongOrder(symboldata) if symboldata.ssignal: self.ShortOrder(symboldata) self.Debug(f" {self.Time} s:{symbol} T:{Trend} bs:{symboldata.bsignal} ss:{symboldata.ssignal} LP: {symboldata.liquidationplaced}") # Recycle signals symboldata.bsignal = False symboldata.ssignal = False symboldata.liquidationplaced = False