public void Update(DateTime expiryDate, double strike, OptionType type, VolQuote volQuote) { VolExpiry existingExpiry = null; if (this.VolExpiries.TryGetValue(expiryDate, out existingExpiry)) { existingExpiry.Update(strike, type, volQuote); } else { VolExpiry volExpiry = new VolExpiry(expiryDate); volExpiry.Update(strike, type, volQuote); this.VolExpiries[expiryDate] = volExpiry; } }
private void BuildChart(DateTime expiry) { VolExpiry volExpiry = null; double strikeMin = 9999.00; double strikeMax = 0.00; double volMin = 9999.00; double volMax = 0.00; if (this.VolSurface.VolExpiries.TryGetValue(expiry, out volExpiry)) { foreach (VolStrike volStrike in volExpiry.VolStrikes.Values) { if (volStrike.VolCallQuote != null) { VolQuote volCallQuote = volStrike.VolCallQuote; if (this.IsValid(volCallQuote.BidImpliedVolatility)) { double strike = volStrike.Strike; strikeMin = Math.Min(strikeMin, strike); strikeMax = Math.Max(strikeMax, strike); double vol = volCallQuote.BidImpliedVolatility * 100; volMin = Math.Min(volMin, vol); volMax = Math.Max(volMax, vol); chart1.Series["call_bid"].Points.AddXY(strike, vol); } if (this.IsValid(volCallQuote.AskImpliedVolatility)) { double strike = volStrike.Strike; strikeMin = Math.Min(strikeMin, strike); strikeMax = Math.Max(strikeMax, strike); double vol = volCallQuote.AskImpliedVolatility * 100; volMin = Math.Min(volMin, vol); volMax = Math.Max(volMax, vol); chart1.Series["call_ask"].Points.AddXY(strike, vol); } } if (volStrike.VolPutQuote != null) { VolQuote volPutQuote = volStrike.VolPutQuote; if (this.IsValid(volPutQuote.BidImpliedVolatility)) { double strike = volStrike.Strike; strikeMin = Math.Min(strikeMin, strike); strikeMax = Math.Max(strikeMax, strike); double vol = volPutQuote.BidImpliedVolatility * 100; volMin = Math.Min(volMin, vol); volMax = Math.Max(volMax, vol); chart1.Series["put_bid"].Points.AddXY(strike, vol); } if (this.IsValid(volPutQuote.AskImpliedVolatility)) { double strike = volStrike.Strike; strikeMin = Math.Min(strikeMin, strike); strikeMax = Math.Max(strikeMax, strike); double vol = volPutQuote.AskImpliedVolatility * 100; volMin = Math.Min(volMin, vol); volMax = Math.Max(volMax, vol); chart1.Series["put_ask"].Points.AddXY(strike, vol); } } } } chart1.ChartAreas[0].AxisX.Minimum = Math.Floor(strikeMin); chart1.ChartAreas[0].AxisX.Maximum = Math.Ceiling(strikeMax); chart1.ChartAreas[0].AxisX.Interval = 1; chart1.ChartAreas[0].AxisY.Minimum = Math.Floor(volMin); chart1.ChartAreas[0].AxisY.Maximum = Math.Ceiling(volMax); chart1.ChartAreas[0].AxisY.Interval = 5; }