29 private IOptionData _optionData = OptionPriceModelResultData.Null;
75 public override decimal
LastPrice => _optionData.LastPrice;
80 public override long Volume => _optionData.Volume;
85 public override decimal
BidPrice => _optionData.BidPrice;
90 public override long BidSize => _optionData.BidSize;
95 public override decimal
AskPrice => _optionData.AskPrice;
100 public override long AskSize => _optionData.AskSize;
123 : base(contractData.
Symbol)
125 _symbolProperties = symbolProperties;
126 _optionData =
new OptionUniverseData(contractData);
133 internal void SetOptionPriceModel(Func<OptionPriceModelResult> optionPriceModelEvaluator)
135 _optionData =
new OptionPriceModelResultData(optionPriceModelEvaluator, _optionData as OptionPriceModelResultData);
146 =>
Create(baseData.EndTime, security, underlying);
161 contract._optionData.SetUnderlying(underlying);
194 internal override void Update(
BaseData data)
198 _optionData.Update(data);
202 _optionData.SetUnderlying(data);
206 #region Option Contract Data Handlers
208 private interface IOptionData
222 void Update(BaseData data);
224 void SetUnderlying(BaseData data);
230 private class OptionPriceModelResultData : IOptionData
234 private readonly Lazy<OptionPriceModelResult> _optionPriceModelResult;
238 private BaseData _underlying;
240 public decimal
LastPrice => _tradeBar?.Close ?? decimal.Zero;
246 public decimal
BidPrice => _quoteBar?.Bid?.Close ?? decimal.Zero;
248 public long BidSize => (long)(_quoteBar?.LastBidSize ?? 0L);
250 public decimal
AskPrice => _quoteBar?.Ask?.Close ?? decimal.Zero;
252 public long AskSize => (long)(_quoteBar?.LastAskSize ?? 0L);
254 public decimal
OpenInterest => _openInterest?.Value ?? decimal.Zero;
256 public decimal
TheoreticalPrice => _optionPriceModelResult.Value.TheoreticalPrice;
257 public decimal
ImpliedVolatility => _optionPriceModelResult.Value.ImpliedVolatility;
258 public Greeks Greeks => _optionPriceModelResult.Value.Greeks;
260 public OptionPriceModelResultData(Func<OptionPriceModelResult> optionPriceModelEvaluator,
261 OptionPriceModelResultData previousOptionData =
null)
263 _optionPriceModelResult =
new(optionPriceModelEvaluator, isThreadSafe:
false);
265 if (previousOptionData !=
null)
267 _tradeBar = previousOptionData._tradeBar;
268 _quoteBar = previousOptionData._quoteBar;
269 _openInterest = previousOptionData._openInterest;
270 _underlying = previousOptionData._underlying;
274 public void Update(BaseData data)
279 _tradeBar = tradeBar;
282 _quoteBar = quoteBar;
285 _openInterest = openInterest;
290 public void SetUnderlying(BaseData data)
299 private class OptionUniverseData : IOptionData
303 public decimal
LastPrice => _contractData.Close;
310 public long Volume => (long)_contractData.Volume;
312 public decimal
BidPrice => _contractData.Close;
316 public decimal
AskPrice => _contractData.Close;
320 public decimal
OpenInterest => _contractData.OpenInterest;
330 _contractData = contractData;
333 public void Update(BaseData data)
337 public void SetUnderlying(BaseData data)