Overall Statistics |
Total Trades 29 Average Win 1.77% Average Loss -0.39% Compounding Annual Return 53670.962% Drawdown 4.000% Expectancy 3.878 Net Profit 14.775% Sharpe Ratio 281.199 Probabilistic Sharpe Ratio 99.960% Loss Rate 11% Win Rate 89% Profit-Loss Ratio 4.49 Alpha 0 Beta 0 Annual Standard Deviation 0.502 Annual Variance 0.252 Information Ratio 281.199 Tracking Error 0.502 Treynor Ratio 0 Total Fees $118.10 Estimated Strategy Capacity $2800000.00 Lowest Capacity Asset FXI T2O7DUFBZLUT |
# working sort of ema universe 2022-06-24 from AlgorithmImports import * import numpy as np # -------------------- SL = -0.02; TP = 0.02; # -------------------- class UglyBrownDolphin(QCAlgorithm): def Initialize(self): self.SetStartDate(2022, 6, 17) self.SetEndDate(2022, 6, 24) self.SetCash(100000) self.UniverseSettings.Resolution = Resolution.Minute self.AddUniverse(self.CoarseSelectionFunction) self.SetCash(100000) self.SetTimeZone("America/New_York") self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) self.averages = {} self.symbolData = {} ##################################################################### # 100 stocks 10$ and up, highest dollar volume def CoarseSelectionFunction(self, universe): selected = [] universe = sorted(universe, key = lambda c: c.DollarVolume, reverse=True) universe = [c for c in universe if c.Price > 10][:100] self.Plot("Universe", "top_dv_symbols", len(universe)) for sec in universe: selectionSymbol = sec.Symbol if selectionSymbol not in self.averages: history = self.History(selectionSymbol, 30, Resolution.Daily) self.averages[selectionSymbol] = SelectionData(history) self.averages[selectionSymbol].update(self.Time, sec.AdjustedPrice) if self.averages[selectionSymbol].fast > self.averages[selectionSymbol].slow: if self.averages[selectionSymbol].is_ready(): selected.append(selectionSymbol) self.Plot("Universe", "fast > slow", len(selected)) return selected ##################################################################### # Create SymbolData object for each stock added to universe def OnSecuritiesChanged(self, changes): for x in changes.RemovedSecurities: self.Liquidate(x.Symbol) if x.Symbol in self.symbolData: del self.symbolData[x.Symbol] for ticker in changes.AddedSecurities: symbol = ticker.Symbol if symbol not in self.symbolData: indicatorHistory = self.History(symbol, 91, Resolution.Minute) self.symbolData[symbol] = SymbolData(self, symbol, indicatorHistory) ##################################################################### def OnData(self, slice): if not (self.Time.hour == 10 and self.Time.minute == 31): return selected = [] for symbol, data in self.symbolData.items(): if not (self.Securities[symbol].Exchange.DateTimeIsOpen(self.Time)): continue price = self.Securities[symbol].Price if not data.indicator.IsReady: continue if data.indicator.Current.Value > 1 : selected.append(symbol) for sec in self.Portfolio.Keys: if not (self.Securities[symbol].Exchange.DateTimeIsOpen(self.Time)): continue pnl = self.Securities[sec].Holdings.UnrealizedProfitPercent if sec not in selected: self.Liquidate(sec) elif pnl < SL: self.Liquidate(sec, "Stop Loss") elif pnl > TP: self.Liquidate(sec, "Take Profit") for sec in selected: if not (self.Securities[symbol].Exchange.DateTimeIsOpen(self.Time)): continue self.SetHoldings(sec, 1/len(selected)) self.Plot("Universe", "indicator > 1", len(selected)) ##################################################################### # instantiate and initialize symbols, feed with history request class SymbolData: def __init__(self, algorithm, symbol, indicatorHistory): self.indicator = MomentumPercent(90) if indicatorHistory.empty: return for bar in indicatorHistory.itertuples(): self.indicator.Update(bar.Index[1], bar.close) def is__ready(self): return self.indicator.IsReady def update_(self, time, price): self.indicator.Update(time, price) self.RegisterIndicator = algorithm.RegisterIndicator(symbol, self.indicator, Resolution.Minute) ##################################################################### # Only add stocks to universe that are trending up the past 10 days class SelectionData: def __init__(self, history): self.slow = ExponentialMovingAverage(30) self.fast = ExponentialMovingAverage(10) for bar in history.itertuples(): self.slow.Update(bar.Index[1], bar.close) self.fast.Update(bar.Index[1], bar.close) def is_ready(self): return self.slow.IsReady and self.fast.IsReady def update(self, time, price): self.fast.Update(time, price) self.slow.Update(time, price)