private static bool HandleOptionData(DateTime algorithmTime, BaseData baseData, OptionChains optionChains, Security security, Lazy <Slice> sliceFuture) { var symbol = baseData.Symbol; OptionChain chain; var canonical = Symbol.CreateOption(symbol.Underlying, symbol.ID.Market, default(OptionStyle), default(OptionRight), 0, SecurityIdentifier.DefaultDate); if (!optionChains.TryGetValue(canonical, out chain)) { chain = new OptionChain(canonical, algorithmTime); optionChains[canonical] = chain; } var universeData = baseData as OptionChainUniverseDataCollection; if (universeData != null) { if (universeData.Underlying != null) { chain.Underlying = universeData.Underlying; foreach (var addedContract in chain.Contracts) { addedContract.Value.UnderlyingLastPrice = chain.Underlying.Price; } } foreach (var contractSymbol in universeData.FilteredContracts) { chain.FilteredContracts.Add(contractSymbol); } return(false); } OptionContract contract; if (!chain.Contracts.TryGetValue(baseData.Symbol, out contract)) { var underlyingSymbol = baseData.Symbol.Underlying; contract = new OptionContract(baseData.Symbol, underlyingSymbol) { Time = baseData.EndTime, LastPrice = security.Close, BidPrice = security.BidPrice, BidSize = (long)security.BidSize, AskPrice = security.AskPrice, AskSize = (long)security.AskSize, OpenInterest = security.OpenInterest, UnderlyingLastPrice = chain.Underlying.Price }; chain.Contracts[baseData.Symbol] = contract; var option = security as Option; if (option != null) { contract.SetOptionPriceModel(() => option.PriceModel.Evaluate(option, sliceFuture.Value, contract)); } } // populate ticks and tradebars dictionaries with no aux data switch (baseData.DataType) { case MarketDataType.Tick: var tick = (Tick)baseData; chain.Ticks.Add(tick.Symbol, tick); UpdateContract(contract, tick); break; case MarketDataType.TradeBar: var tradeBar = (TradeBar)baseData; chain.TradeBars[symbol] = tradeBar; contract.LastPrice = tradeBar.Close; break; case MarketDataType.QuoteBar: var quote = (QuoteBar)baseData; chain.QuoteBars[symbol] = quote; UpdateContract(contract, quote); break; case MarketDataType.Base: chain.AddAuxData(baseData); break; } return(true); }
private bool HandleOptionData(DateTime algorithmTime, BaseData baseData, OptionChains optionChains, ISecurityPrice security, Lazy <Slice> sliceFuture, IReadOnlyDictionary <Symbol, BaseData> optionUnderlyingUpdates) { var symbol = baseData.Symbol; OptionChain chain; var canonical = symbol.Canonical; if (!optionChains.TryGetValue(canonical, out chain)) { chain = new OptionChain(canonical, algorithmTime); optionChains[canonical] = chain; } // set the underlying current data point in the option chain var option = security as IOptionPrice; if (option != null) { if (option.Underlying == null) { Log.Error($"TimeSlice.HandleOptionData(): {algorithmTime}: Option underlying is null"); return(false); } BaseData underlyingData; if (!optionUnderlyingUpdates.TryGetValue(option.Underlying.Symbol, out underlyingData)) { underlyingData = option.Underlying.GetLastData(); } if (underlyingData == null) { Log.Error($"TimeSlice.HandleOptionData(): {algorithmTime}: Option underlying GetLastData returned null"); return(false); } chain.Underlying = underlyingData; } var universeData = baseData as OptionChainUniverseDataCollection; if (universeData != null) { if (universeData.Underlying != null) { foreach (var addedContract in chain.Contracts) { addedContract.Value.UnderlyingLastPrice = chain.Underlying.Price; } } foreach (var contractSymbol in universeData.FilteredContracts) { chain.FilteredContracts.Add(contractSymbol); } return(false); } OptionContract contract; if (!chain.Contracts.TryGetValue(baseData.Symbol, out contract)) { var underlyingSymbol = baseData.Symbol.Underlying; contract = new OptionContract(baseData.Symbol, underlyingSymbol) { Time = baseData.EndTime, LastPrice = security.Close, Volume = (long)security.Volume, BidPrice = security.BidPrice, BidSize = (long)security.BidSize, AskPrice = security.AskPrice, AskSize = (long)security.AskSize, OpenInterest = security.OpenInterest, UnderlyingLastPrice = chain.Underlying.Price }; chain.Contracts[baseData.Symbol] = contract; if (option != null) { contract.SetOptionPriceModel(() => option.EvaluatePriceModel(sliceFuture.Value, contract)); } } // populate ticks and tradebars dictionaries with no aux data switch (baseData.DataType) { case MarketDataType.Tick: var tick = (Tick)baseData; chain.Ticks.Add(tick.Symbol, tick); UpdateContract(contract, tick); break; case MarketDataType.TradeBar: var tradeBar = (TradeBar)baseData; chain.TradeBars[symbol] = tradeBar; UpdateContract(contract, tradeBar); break; case MarketDataType.QuoteBar: var quote = (QuoteBar)baseData; chain.QuoteBars[symbol] = quote; UpdateContract(contract, quote); break; case MarketDataType.Base: chain.AddAuxData(baseData); break; } return(true); }