Overall Statistics |
Total Trades 8 Average Win 0% Average Loss -0.53% Compounding Annual Return -50.640% Drawdown 1.500% Expectancy -1 Net Profit -1.345% Sharpe Ratio -5.827 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 1.041 Beta -99.671 Annual Standard Deviation 0.097 Annual Variance 0.009 Information Ratio -5.947 Tracking Error 0.098 Treynor Ratio 0.006 Total Fees $125.57 |
from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Data.UniverseSelection import * from QuantConnect.Data import * from QuantConnect.Indicators import * class upTrendUniverseExample(QCAlgorithm): def Initialize(self): self.SetStartDate(2019,1,4) self.SetEndDate(2019,1,10) self.SetCash(100000) self.obj = {} # Choose number of securities in universe self.numberOfSecurities = 10 # Set lookback period for EMA and ATR self.period = 8 # Add a universe using CoarseSelectionFunction self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverse(self.CoarseSelectionFunction) # Retrieve a list of stocks that have the highest dollar volume def CoarseSelectionFunction(self, coarse): CoarseWithFundamental = [x for x in coarse if x.HasFundamentalData] sortedByDollarVolume = sorted(CoarseWithFundamental, key=lambda x: x.DollarVolume, reverse=False) top = sortedByDollarVolume[:self.numberOfSecurities] return [i.Symbol for i in top] def OnData(self, slice): for x in self.ActiveSecurities.Values: # Update values on SymbolData object avg = self.obj[x.Symbol] avg.updateATR(slice[x.Symbol]) avg.updateEMA(self.Time, x.Price) # Return if already invested in stock if self.Portfolio[x.Symbol].Invested: return # Invest with equal weights in each stock that is trending upwards (price > EMA) if avg.IsAboveEMA and avg.IsAtrReady: quantity = self.CalculateOrderQuantity(x.Symbol,1/self.numberOfSecurities) self.Buy(x.Symbol,quantity) # Set a limit order for Take-Profit, using the Average True Range (ATR) indicator self.LimitOrder(x.Symbol, -quantity, x.Price + avg.atr.Current.Value*2) # Set a Stop Market Order for Stop-Loss, using the Average True Range (ATR) indicator self.StopMarketOrder(x.Symbol, -quantity, x.Price - avg.atr.Current.Value*1) # Reset changes self.changes = None def OnSecuritiesChanged(self, changes): self.changes = changes # List of added symbols self.addedSymbols = [x.Symbol for x in changes.AddedSecurities] # Get history for added symbols history = self.History(self.addedSymbols, self.period, Resolution.Daily) for symbol in self.addedSymbols: if symbol not in self.obj.keys(): # Store the symbolData object in obj self.obj[symbol] = symbolData(symbol, self.period) # Retrieve TradeBars using History() bars = self.History(str(symbol),self.period,Resolution.Daily) # WarmUp the ATR Indicator self.obj[symbol].WarmUpIndicatorBar(bars) # WarmUp the EMA Indicator if str(symbol) in history.index: self.obj[symbol].WarmUpIndicator(history.loc[str(symbol)]) # Use OnOrderEvent() to cancel remaining order if limit order or stop loss order is executed def OnOrderEvent(self, orderEvent): order = self.Transactions.GetOrderById(orderEvent.OrderId) if order.Status == OrderStatus.Filled: if order.Type == OrderType.Limit or OrderType.StopLimit: self.Transactions.CancelOpenOrders(order.Symbol) if order.Status == OrderStatus.Canceled: self.Log(str(orderEvent)) class symbolData(object): def __init__(self, symbol, period): self.symbol = symbol self.atr = AverageTrueRange(period) self.ema = ExponentialMovingAverage(period) self.IsAboveEMA = False self.IsAtrReady = False # Warm up the EMA indicator using pandas DataFrame def WarmUpIndicator(self, history): for tuple in history.itertuples(): item = IndicatorDataPoint(self.symbol, tuple.Index, float(tuple.close)) self.ema.Update(item) # Warm up the ATR indicator using TradeBars def WarmUpIndicatorBar(self, bars): for bar in bars: self.atr.Update(bar) # Update the EMA indicator def updateEMA(self, time, price): if self.ema.Update(time, price): self.IsAboveEMA = price > self.ema.Current.Value # Update the ATR indicator def updateATR(self, bar): if self.atr.Update(bar): self.IsAtrReady = self.atr.Current.Value > 0