private static void UpdateContract(OptionContract contract, Tick tick) { if (tick.TickType == TickType.Trade) { contract.LastPrice = tick.Price; } else if (tick.TickType == TickType.Quote) { if (tick.AskPrice != 0m) { contract.AskPrice = tick.AskPrice; contract.AskSize = tick.AskSize; } if (tick.BidPrice != 0m) { contract.BidPrice = tick.BidPrice; contract.BidSize = tick.BidSize; } } }
private static bool HandleOptionData(DateTime algorithmTime, BaseData baseData, OptionChains optionChains, Security security, Lazy<Slice> sliceFuture) { var symbol = baseData.Symbol; OptionChain chain; var canonical = Symbol.Create(symbol.ID.Symbol, SecurityType.Option, symbol.ID.Market); 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 contractSymbol in universeData.FilteredContracts) { chain.FilteredContracts.Add(contractSymbol); } return false; } OptionContract contract; if (!chain.Contracts.TryGetValue(baseData.Symbol, out contract)) { var underlyingSymbol = Symbol.Create(baseData.Symbol.ID.Symbol, SecurityType.Equity, baseData.Symbol.ID.Market); contract = new OptionContract(baseData.Symbol, underlyingSymbol) { Time = baseData.EndTime, LastPrice = security.Close, BidPrice = security.BidPrice, BidSize = security.BidSize, AskPrice = security.AskPrice, AskSize = security.AskSize, UnderlyingLastPrice = chain.Underlying != null ? chain.Underlying.Price : 0m }; 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 static void UpdateContract(OptionContract contract, QuoteBar quote) { if (quote.Ask != null && quote.Ask.Close != 0m) { contract.AskPrice = quote.Ask.Close; contract.AskSize = quote.LastAskSize; } if (quote.Bid != null && quote.Bid.Close != 0m) { contract.BidPrice = quote.Bid.Close; contract.BidSize = quote.LastBidSize; } }
/// <summary> /// Creates a new <see cref="OptionPriceModelResult"/> containing the current <see cref="Security.Price"/> /// and a default, empty instance of <see cref="FirstOrderGreeks"/> /// </summary> /// <param name="security">The option security object</param> /// <param name="slice">The current data slice. This can be used to access other information /// available to the algorithm</param> /// <param name="contract">The option contract to evaluate</param> /// <returns>An instance of <see cref="OptionPriceModelResult"/> containing the theoretical /// price of the specified option contract</returns> public OptionPriceModelResult Evaluate(Security security, Slice slice, OptionContract contract) { return new OptionPriceModelResult(security.Price, new FirstOrderGreeks()); }