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 1.104 Tracking Error 0.066 Treynor Ratio 0 Total Fees $0.00 |
from clr import AddReference AddReference("System.Core") AddReference("System.Collections") AddReference("QuantConnect.Common") AddReference("QuantConnect.Algorithm") from System import * from System.Collections.Generic import List from QuantConnect import * from QuantConnect.Algorithm import QCAlgorithm from QuantConnect.Data.UniverseSelection import * from datetime import datetime, timedelta import datetime class ConsolidatorHelp(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 12, 1) # Set Start Date #self.SetEndDate(datetime.datetime.now()) self.SetEndDate(2020, 12, 14) # Set End Date self.SetCash(600000) # Set Strategy Cash self.SetWarmup(20) self.SetBenchmark("SPY") self.UniverseSettings.Resolution = Resolution.Minute self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction) self.UniverseSettings.Leverage = 2 self._changes = None self.symbols = {} self.daySymbols = {} self.profits = {} self.unrealized = {} self.openEq = {} self.yesterdaysOHLC = {} self.currentHigh = {} self.currentOpen = {} self.uniFilter = [] def OnData(self, data): # Make sure indicators and rolling windows are ready if not all([symbol.IsReady for symbol in self.symbols.values()]): return if not all([symbol.IsReady for symbol in self.daySymbols.values()]): return ######### Get daily values from yesterday(OHLC) and today(OH) ##################### # Initialize dictionaries if len(self.currentHigh) == 0: for symbol, value in self.daySymbols.items(): self.currentHigh.setdefault(symbol.Value, 0) if len(self.currentOpen) == 0: for symbol, value in self.daySymbols.items(): self.currentOpen.setdefault(symbol.Value, 0) for symbol, value in self.daySymbols.items(): if data.ContainsKey(symbol) and \ data[symbol] != None: self.Debug("AM I GETTING DATA?????????????????????????????????????") self.Debug(str(symbol)) self.yesterdaysOHLC[symbol.Value] = \ (value.dBars[0].Open, value.dBars[0].High, value.dBars[0].Low, value.dBars[0].Close) # Get todays High if data[symbol].High > self.currentHigh[symbol.Value]: self.currentHigh[symbol.Value] = data[symbol].High # Get todays open if self.currentOpen[symbol.Value] > 0: break else: self.currentOpen[symbol.Value] = data[symbol].Open for symbol, value in self.symbols.items(): if (value.Bars[0].EndTime.hour < 15 or (value.Bars[0].EndTime.hour == 15 and value.Bars[0].EndTime.minute < 30)) and \ data.ContainsKey(symbol) and not self.Portfolio[symbol].Invested and \ value.Bars[0].EndTime == self.Time and \ data[symbol] != None: ########## GAP ############################## if symbol.Value in self.yesterdaysOHLC and not self.tradeToday(): # Get todays Open and High todaysOpen = self.currentOpen[symbol.Value] todaysHigh = self.currentHigh[symbol.Value] yesterdaysOpen = self.yesterdaysOHLC[symbol.Value][0] yesterdaysHigh = self.yesterdaysOHLC[symbol.Value][1] yesterdaysLow = self.yesterdaysOHLC[symbol.Value][2] yesterdaysClose = self.yesterdaysOHLC[symbol.Value][3] # Add and remove stocks whenever we have changes to our universe def OnSecuritiesChanged(self, changes): self._changes = changes for security in changes.AddedSecurities: symbol = security.Symbol # For 5 minute quotes if symbol not in self.symbols: self.symbols[symbol] = SymbolData(self, symbol) # For daily quotes if symbol not in self.daySymbols: self.daySymbols[symbol] = DaySymbolData(self, symbol) # Dont remove securities ''' for security in changes.RemovedSecurities: symbol = security.Symbol if symbol in self.symbols: symbolData = self.symbols.pop(symbol, None) self.SubscriptionManager.RemoveConsolidator(symbol, symbolData.consolidator) ''' ############# FILTERS################################### def CoarseSelectionFunction(self, coarse ): top = [x for x in coarse if x.HasFundamentalData and 500 > x.Price > 40 and x.Volume > 500000] self.Debug("len of coarse = " + str(len(top))) return [x.Symbol for x in top] def FineSelectionFunction(self, fine ): top = [x for x in fine if x.ValuationRatios.PERatio > 20 and x.ValuationRatios.TrailingDividendYield < .02 and not x.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.BasicMaterials and not x.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.Energy] top = sorted(top, key=lambda x: x.ValuationRatios.PERatio, reverse=True) self.Debug("len of fine = " + str(len(top))) return [x.Symbol for x in top][:5] class SymbolData: def __init__(self, algorithm, symbol): self.algorithm = algorithm self.symbol = symbol ########## INDICATORS ################################# self.sma = SimpleMovingAverage(9) self.trix = algorithm.TRIX(symbol, 9, Resolution.Minute) self.Bars = RollingWindow[TradeBar](2) ########### CONSOLIDATORS and WINDOWS ########################### self.consolidator = TradeBarConsolidator(timedelta(minutes=5)) self.consolidator.DataConsolidated += self.OnDataConsolidated self.trixWindow = RollingWindow[IndicatorDataPoint](2) # Define our rolling window to hold indicator points self.trix.Updated += self.OnTrixUpdated # Set our event handler algorithm.SubscriptionManager.AddConsolidator(symbol, self.consolidator) algorithm.RegisterIndicator(symbol, self.sma, self.consolidator) algorithm.RegisterIndicator(symbol, self.trix, self.consolidator) # Update TRIX Window def OnTrixUpdated(self, sender, updated): if self.trix.IsReady: self.trixWindow.Add(updated) # Add updated indicator data to rolling window # Lock and load @property def IsReady(self): return self.trix.IsReady and self.trixWindow.IsReady # Make sure I can get stock values in Window. def OnDataConsolidated(self, sender, bar): self.Bars.Add(bar) ''' self.algorithm.Debug(f"Data Consolidatoed for {self.symbol} \ at {bar.EndTime} with bar: {bar} and sma {self.sma} and trix {self.trix} and \ kelt {self.kelt.LowerBand}") ''' class DaySymbolData: def __init__(self, algorithm, symbol): self.algorithm = algorithm self.symbol = symbol ########## INDICATORS ################################# self.dBars = RollingWindow[TradeBar](2) ########### CONSOLIDATORS and WINDOWS ########################### #self.consolidator = TradeBarConsolidator(timedelta(days=1)) #self.consolidator.DataConsolidated += self.OnDataConsolidated #algorithm.SubscriptionManager.AddConsolidator(symbol, self.consolidator) algorithm.Consolidate(symbol, timedelta(days=1), self.OnDataConsolidated) # Lock and load @property def IsReady(self): return self.dBars.IsReady # Make sure I can get stock values in Window. def OnDataConsolidated(self, bar): self.dBars.Add(bar) self.algorithm.Debug(f"Data Consolidated for {self.symbol} \ at {bar.EndTime} with bar: {bar} ")