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 -3.332 Tracking Error 0.105 Treynor Ratio 0 Total Fees $0.00 |
from datetime import timedelta, time from SymbolData import SymbolData import math class ErrorSubmission_Consolidator(QCAlgorithm): """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Iniitalization """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def Initialize(self): #-- Date Range self.SetStartDate(2021, 1, 5) # Set Start Date self.SetEndDate(2021, 1, 15) # Set End Date #-- Starting Equity self.SetCash(1000000) # Set Strategy Cash # check if will be replaced #---------- Universe Selection ------------- self.UniverseSettings.Resolution = Resolution.Minute self.UniverseSettings.ExtendedMarketHours = True # test live if work self.maxSymbolsFromUniverseFilter = 3 self.handpicked_symbolDict = {} #-- Filtered Universe self.AddUniverse(self.CoarseSelectionFilter, self.FineSelectionFilter) #---------- Alpha Generation ------------- #-- Criteria Settings self.criteriaDict = { } #---------- Portfolio Construction ------------- self.maxSymbolsToTrade = 10 # maxSymbols to trade self.symbolDict = {} # dictionary which stores symbols (contains more than symbols shortlisted for trading, also contains symbolData used during universe filtering) # updated during universe updates + handpick selection self.symbolWithPositionDict = {} # dictionary which stores symbols with position self.potentialTradeDict = {} # temp dictionary to store potential symbols to trade #---------- Schedule to run calculation ------------- self.schedulerInterval = 30 self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.Every(TimeSpan.FromMinutes(self.schedulerInterval)), self.runAlgo) self.consolidatorInterval = 30 # interval for consolidating tradebars e.g. to check for premarket """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" # Coarse Selection Filter """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def CoarseSelectionFilter(self, coarse): myuniverse = [x for x in coarse if x.HasFundamentalData and \ x.Price > 0 and x.Price <= 5.0] for x in myuniverse: if x.Symbol not in self.symbolDict: self.symbolDict[x.Symbol] = SymbolData(self,x.Symbol) self.symbolDict[x.Symbol].updateIndicators(x.EndTime, x.AdjustedPrice, x.DollarVolume) myuniverse = [x for x in myuniverse if self.symbolDict[x.Symbol].dailyVolume_ratio > 1.5] return [x.Symbol for x in myuniverse] """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" # Fine Selection Filter """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def FineSelectionFilter(self, fine): myuniverse = [x for x in fine] #-- Filter: low market cap myuniverse = [x for x in fine if x.CompanyProfile.MarketCap > 10000000 and \ x.CompanyProfile.MarketCap < 50000000] myuniverse = [x for x in myuniverse if x.SecurityReference.IsPrimaryShare == 1 and \ x.SecurityReference.SecurityType == 'ST00000001' and \ x.CompanyReference.IsLimitedPartnership == 0 and \ x.SecurityReference.IsDepositaryReceipt == 0 ] return [x.Symbol for x in myuniverse[:self.maxSymbolsFromUniverseFilter]] """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" runAlgo - Main execution function for the system - function is triggered every x minute to check for signal and execute trades """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def runAlgo(self): pass """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" OnSecuritiesChanged - this event fires whenever we have changes to our universe """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def OnSecuritiesChanged(self, changes): # self.Log("OnSecuritiesChanged: " + str(self.Time)) for security in changes.RemovedSecurities: symbolData = self.symbolDict.pop(security.Symbol, None) if symbolData is not None: self.Debug(f"OnSecuritiesChanged: RemovedSecurities: {security.Symbol}") symbolData.removeConsolidators() for security in changes.AddedSecurities: self.Debug(f"OnSecuritiesChanged: AddedSecurities {security.Symbol}") self.addSymbolToMonitor(security.Symbol) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" addSymbolToMonitor """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def addSymbolToMonitor(self, symbol): #self.Debug(f"addSymbol {symbol} {symbol.Value}") if symbol not in self.symbolDict: self.Debug(f"add Symbol {symbol} not in self.symbolDict") self.symbolDict[symbol] = SymbolData(self,symbol) self.AddEquity(symbol.Value, Resolution.Minute, Market.USA, True, 0, True) if self.symbolDict[symbol].toCheckForTrade == False: self.symbolDict[symbol].startConsolidator(self.consolidatorInterval) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" OnData """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def OnData(self, data): pass
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Symbol Data """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" class SymbolData(object): def __init__(self, algorithm, symbol): self.symbol = symbol self.symbolValue = symbol.Value self.algorithm = algorithm self.toCheckForTrade = False #------- Consolidator ------- self.myConsolidator = None #-- Average daily volume self.dailyVolume = 0 self.dailyVolumeAverage = ExponentialMovingAverage(3) self.dailyVolume_ratio = 0 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" # Function to update all Indicators with new price&volume data """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def updateIndicators(self, time, price, volume): self.dailyVolume = volume if self.dailyVolumeAverage.Update(time, volume): self.dailyVolume_ratio = self.dailyVolume / self.dailyVolumeAverage.Current.Value """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" set to 1) start checking for trade and 2) to run consolidator """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def startConsolidator(self,intervalInMin): self.algorithm.Debug(f"startConsolidator {self.symbol}") self.toCheckForTrade = True self.myConsolidator = TradeBarConsolidator(timedelta(minutes=intervalInMin)) self.myConsolidator.DataConsolidated += self.consolidatorFunction self.algorithm.SubscriptionManager.AddConsolidator(self.symbol, self.myConsolidator) """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" conolidatorFunction 0500-0930 <premarket> || 930-1600 <open> || 1600-2000 <postmarket> """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def consolidatorFunction(self,sender,bar): if bar.Time.hour == 9 and bar.Time.minute == 0: #just to print less self.algorithm.Debug(f"{bar.Time} consolidatorFunction {bar.Symbol}") """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" removeConsolidators """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" def removeConsolidators(self): self.algorithm.Debug(f"remove Consolidator {self.symbol}") self.algorithm.SubscriptionManager.RemoveConsolidator(self.symbol, self.myConsolidator)