New guy here.  I am writing a first pass algorythm to learn the platform and test some basic ideas.  Is this the right way to initialize my indicator groups?

I have a class called JustSomeIndicators which is a group of indicators.  I have a factory method called CreateIndicatorGroup() which creates instances of the JustSomeIndicators class.  I iterate over this factory method in a loop and hang on to the resulting objects in a dictionary called IndicatorsForEachSymbol.

The trouble is I keep getting exceptions in the OnData callback when I try to index the IndicatorsForEachSymbol dictionary using the symbol obtained from the Slice obect.

Am I going about this the right way?

PS: I have 300 or so lines of code but have shared what I hope is a relevant subset.


private Dictionary<Symbol, JustSomeIndicators> IndicatorsForEachSymbol = new Dictionary<Symbol, JustSomeIndicators>(); public override void Initialize() { SetWarmUp(TimeSpan.FromDays(Math.Max(SAMPLE_SIZE, 50))); SetStartDate(2019, 1, 1); SetEndDate(2020, 1, 1); SetCash(100000); ConfigureUniverse(); SetExecution(new ImmediateExecutionModel()); SetPortfolioConstruction(new NullPortfolioConstructionModel()); } private void ConfigureUniverse() { AddUniverse(CoarseSelectionFunction, FineSelectionFunction); UniverseSettings.Resolution = Resolution.Daily; UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw; } public IEnumerable<Symbol> CoarseSelectionFunction(IEnumerable<CoarseFundamental> coarse) { return coarse .Where(x => x.HasFundamentalData && x.DollarVolume > 10000000 && x.Price > 2) .OrderByDescending(x => x.DollarVolume) .Select(x => x.Symbol) .ToList(); } public IEnumerable<Symbol> FineSelectionFunction(IEnumerable<FineFundamental> fine) { return fine .Where(x => x.MarketCap > 200000000) .OrderByDescending(x => x.MarketCap) .Select(x => x.Symbol) .ToList(); } public override void OnSecuritiesChanged(SecurityChanges changes) { foreach (var security in changes.AddedSecurities) { IndicatorsForEachSymbol.Add(security.Symbol, CreateIndicatorGroup(security.Symbol)); } base.OnSecuritiesChanged(changes); } public override void OnData(Slice data) { foreach (Symbol symbol in data.Bars.Keys) { JustSomeIndicators indicators = IndicatorsForEachSymbol[symbol]; indicators.AddTradeBarToFifo(data.Bars[symbol]); bool isHeld = false; if (Portfolio.Securities.ContainsKey(symbol)) isHeld = Portfolio.Securities[symbol].HoldStock; if (isHeld) ConsiderSelling(symbol, data.Bars[symbol], indicators); else ConsiderBuying(symbol, data.Bars[symbol], indicators); } }