from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Algorithm import * import numpy as np from datetime import timedelta class BasicTemplateAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2015,1,1) self.SetEndDate(2018,1,1) self.SetCash(100000) self.sma = dict() self.symbols = [Symbol.Create(x, SecurityType.Equity, Market.USA) for x in ["SPY", "GOOG", "AAPL", "FB", "AMZN"]] self.AddEquity("SPY", Resolution.Minute) self.UniverseSettings.Resolution = Resolution.Minute self.AddUniverse(self.CoarseSelectionFunction) self._changes = None self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 10), self.EveryDayAfterMarketOpen) self.SetWarmup(timedelta(3)) def OnData(self, data): if data.ContainsKey('SPY') and data['SPY'] is not None: price = data['SPY'].Close def OnSecuritiesChanged(self, changes): self._changes = changes history = self.History(self.symbols, 30, Resolution.Daily) for security in self._changes.AddedSecurities: symbol = security.Symbol if symbol not in self.sma: self.sma[symbol] = self.SMA(symbol, 20, Resolution.Daily) for index, row in history.loc[str(symbol)].iterrows(): self.sma[symbol].Update(index, row['close']) def CoarseSelectionFunction(self, coarse): sorted_coarse = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True) return self.symbols def EveryDayAfterMarketOpen(self): count = len(self.sma) if count == 0 or self._changes is None or self.IsWarmingUp: return for security in self._changes.RemovedSecurities: if security.Invested: self.Liquidate(security.Symbol) history = self.History(self.symbols, 10, Resolution.Daily) for security in self._changes.AddedSecurities: symbol = security.Symbol if not history.empty: for index, row in history.loc[str(symbol)].iterrows(): a, b = index, row['close'] sma = self.sma[symbol].Current.Value if sma > 0: self.Plot(symbol.Value, 'SMA', sma) if self.Securities[symbol].Price > 0: self.SetHoldings(symbol, 1.0/count)