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 |
class MyEMAMomentumUniverse(QCAlgorithm): def Initialize(self): self.SetStartDate(2022, 1, 6) self.SetEndDate(2022, 1, 6) self.SetCash(100000) self.UniverseSettings.Resolution = Resolution.Hour self.AddUniverse(self.CoarseSelectionFunction) self.averages = { } def CoarseSelectionFunction(self, coarse): selectedStocks=[] #coarse = sorted(coarse, key=lambda c: c.Price, reverse=True) coarse = [c for c in coarse if c.Price > 1000] for stock in coarse: symbol = stock.Symbol if symbol not in self.averages: # 1. Call history to get an array of 200 days of history data history = self.History(symbol, 200, Resolution.Daily) #2. Adjust SelectionData to pass in the history result self.averages[symbol] = SelectionData(history) self.averages[symbol].update(self.Time, stock.AdjustedPrice) if ( self.averages[symbol].is_ready() and #stock.AdjustedPrice > self.averages[symbol].EMA20 and self.averages[symbol].EMA20 > self.averages[symbol].EMA50 and self.averages[symbol].EMA50 > self.averages[symbol].EMA200 ): selectedStocks.append(symbol) for x in selectedStocks: self.Log(x) return selectedStocks class SelectionData(): #3. Update the constructor to accept a history array def __init__(self, history): self.EMA200 = ExponentialMovingAverage(200) self.EMA50 = ExponentialMovingAverage(50) self.EMA20 = ExponentialMovingAverage(20) #4. Loop over the history data and update the indicators for bar in history.itertuples(): self.EMA200.Update(bar.Index[1], bar.close) self.EMA50.Update(bar.Index[1], bar.close) self.EMA20.Update(bar.Index[1], bar.close) def is_ready(self): return self.EMA200.IsReady and self.EMA50.IsReady and self.EMA20.IsReady def update(self, time, price): self.EMA200.Update(time, price) self.EMA50.Update(time, price) self.EMA20.Update(time, price) #def FineSelectionFunction(self, fine): #selected = sorted(fine, key=lambda c: c.ValuationRatios.PERatio, reverse=False) #Others can be used: #ValuationRatios.EVToEBITDA: lower is better #ValuationRatios.PricetoCashRatio: lower is better #ValuationRatios.TotalAssetPerShare: higher is better #ValuationRatios.ForwardEarningYield = higher is better (Estimated Earnings Per Share / Price) #selected = [ # c.Symbol for c in selected # if # ( #c.MarketCap < 10000000000 and #c.MarketCap > 1000000 and #c.OperationRatios.ROE.OneYear > 0 and #c.OperationRatios.ROA.OneYear > 0 #c.Price < c.ValuationRatios.BookValuePerShare and #c.ValuationRatios.ForwardROE > 0 and #c.ValuationRatios.ForwardROA > 0 #Others can be used: #Price < or > Max, Min Year, Qrt, Month, Week Price #Price < or > MA20, 50, 200, VWAP #AssetClassification.MorningstarSectorCode (101-104, 205-207, 308-311) # )] #return selected[:10]