Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
from AlgorithmImports import * from QuantConnect.Orders import * class MyQC500UniverseSelectionModel(QC500UniverseSelectionModel): def SelectCoarse(self, algorithm, coarse): # Filter out securities that have a closing price less than $10 filteredCoarse = [x for x in coarse if x.Price > 10] return filteredCoarse class CalibratedOptimizedCompensator(QCAlgorithm): def Initialize(self): self.SetStartDate(2022, 1, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash # Set QC500 Universe Selection Model self.SetUniverseSelection(MyQC500UniverseSelectionModel()) self.AddSecurity(SecurityType.Equity, 'SJI R735QTJ8XC9X', Resolution.Daily) self.AddSecurity(SecurityType.Equity, 'SPY', Resolution.Daily) # Dictionary to hold SecurityData self.data = {} self.atr = {} self.ts = {} self.profit_factor = 3 self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", -10), self.on_market_opendata) def on_market_opendata(self): sortedByReturns = [k for k in self.data.keys() if self.data[k].returns is not None] sortedByReturns = sorted(sortedByReturns, key=lambda k : self.data[k].returns.Current.Value, reverse=True) # invested_symbols = [symbol for symbol in self.symbols if self.Portfolio[self.symbols[symbol].symbol].Invested ] current_holding = len(self.Portfolio) # Select top 10 symbols rankings = sortedByReturns[:10] for symbol in rankings: if symbol in self.data: self.data[symbol].update_previous_sma80() if current_holding < 10: self.Log("the value of previous_sma80 is ",self.data[symbol].previous_sma80) previous_sma80 = self.data[symbol].check_previous_sma80() if previous_sma80 is not None and (self.data[symbol].sma80.Current.Value > previous_sma80): if not self.Portfolio[symbol].Invested: self.SetHoldings(symbol, 1/len(self.Portfolio)) for kvp in self.Portfolio: symbol = kvp.Key holding = kvp.Value previous_sma80 = self.data[symbol].check_previous_sma80() if previous_sma80 is not None and (self.data[symbol].sma80.Current.Value < previous_sma80): self.Liquidate(symbol) def OnSecuritiesChanged(self, changes): for security in changes.AddedSecurities: symbol = security.Symbol if symbol not in self.data: self.data[symbol] = SecurityData(self, symbol, security) class SecurityData: def __init__(self, algorithm, symbol, security): self.algorithm = algorithm self.symbol = symbol self.security = security self.profitTarget = 0.0 self.entry_price = 0 self.temp = 1 self.returns = algorithm.KER(symbol, 60) self.sma80 = algorithm.SMA(symbol,80,Resolution.Daily) self.previous_sma80 = RollingWindow[decimal](2) def update_previous_sma80(self): self.previous_sma80.Add(self.sma80.Current.Value) def check_previous_sma80(self): return self.previous_sma80[1] if not history.empty: history = history.close.unstack(0) if not history.empty: df = history[symbol] for time, close in df.iteritems(): self.returns.Update(time, close) self.sma80.Update(time,close) self.previous_sma80.Update(time,close) self.returns = None self.sma80 = None # self.sma44 = None