| 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 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 |
class RollingWindowsMultipleSymbols(QCAlgorithm):
def Initialize(self):
# Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
self.SetStartDate(2019, 6, 1) # Set Start Date
self.SetEndDate(2019, 7, 20) # Set End Date
self.SetCash(100000) # Set Strategy Cash
# Holds all of our data keyed by each symbol
self.Data = {}
# This is the number of consolidated bars we'll hold in symbol data
self.RollingWindowSize = 5
# This is the period of our sma indicators
SimpleMovingAveragePeriod = 5
# This is the period of bars we'll be creating
BarPeriod = TimeSpan.FromDays(5)
# Contains all of equity symbols
Symbols = ["SPY", "AAPL", "IBM"]
# initialize our equity data
for symbol in Symbols:
equity = self.AddEquity(symbol, Resolution.Daily)
self.Data[symbol] = SymbolData(equity.Symbol, BarPeriod, self.RollingWindowSize)
# loop through all our symbols and request data subscriptions and initialize indicator
for symbol, symbolData in self.Data.items():
# define the indicator
symbolData.SMA = SimpleMovingAverage(self.CreateIndicatorName(symbol, "SMA" + str(SimpleMovingAveragePeriod), Resolution.Daily), SimpleMovingAveragePeriod)
# define a consolidator to consolidate data for this symbol on the requested period
consolidator = TradeBarConsolidator(BarPeriod) if symbolData.Symbol.SecurityType == SecurityType.Equity else QuoteBarConsolidator(BarPeriod)
# write up our consolidator to update the indicator
consolidator.DataConsolidated += self.OnDataConsolidated
# we need to add this consolidator so it gets auto updates
self.SubscriptionManager.AddConsolidator(symbolData.Symbol, consolidator)
def OnDataConsolidated(self, sender, bar):
self.Data[bar.Symbol.Value].SMA.Update(bar.Time, bar.Close)
self.Data[bar.Symbol.Value].Bars.Add(bar)
def OnData(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
# access rolling windows of multiple symbols
for symbol in self.Data.keys():
symbolData = self.Data[symbol]
if symbolData.IsReady():
symbolData.smaWindow.Add(symbolData.SMA.Current.Value)
if symbolData.smaWindow.Count == self.RollingWindowSize:
window_list = [i for i in symbolData.smaWindow]
self.Debug("sma Window of {0} is {1}".format(str(symbol), str(window_list)))
class SymbolData(object):
def __init__(self, symbol, barPeriod, windowSize):
self.Symbol = symbol
self.BarPeriod = barPeriod
self.Bars = RollingWindow[IBaseDataBar](windowSize)
self.SMA = None
self.smaWindow = RollingWindow[float](windowSize)
# Returns true if all the data in this instance is ready (indicators, rolling windows, ect...)
def IsReady(self):
return self.Bars.IsReady and self.SMA.IsReady