using Qdp.Pricing.Base.Enums; using Qdp.Pricing.Base.Implementations; using YLErp.BLL.Calculation; using YLErp.BLL.Calculation.V2; using YLErp.BLL.Calculation.V2.Parameter; using YLErp.Enums; using YLErp.Modules.CalculationModule; using YLErp.Modules.ClientModule; using YLErp.Modules.PricingModule; using YLErp.Modules.TQuoteModule; using YLErp.Modules.TradeRiskCalcModule; using YLErp.Modules.TradeRiskCalcModule.TaskRunner; using YLErp.Modules.VolatilityModule; using YLErp.OldVersion; using YLErp.QdpModule; namespace YLErp.Modules.RiskModule { [TestClass] public class RealtimeRiskTest { /// /// 构造一些典型的交易数据,测试风险对冲2的计算逻辑 /// [TestMethod] public void RealtimeRiskStaticDataTest() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); Assert.AreEqual(2.5, valuedateBLL.RiskFreeRate, 1e-8, "无风险利率设置不正确"); Assert.AreEqual("Bus244", valuedateBLL.TradeDayCount, "TradeDayCount 设置不正确"); var now = DateTime.Now; Assert.IsTrue(now.Hour >= 12 && now.Hour < 15, "运行的时间不正确,为保证计算结果可比较,请在12点到15点之间运行"); var volType = "对冲"; var valueDate = new DateTime(2019, 6, 17); var lastSettleDate = new DateTime(2019, 6, 14); var initializer = new DataInitializer { SpecialValueDate = valueDate }; initializer.Init(out _); var context = new TradeRiskCalcContext(volType, false, valueDate, lastSettleDate, initializer.DataProvider); var tradeDataSource = initializer.TradeDataSource; var calcService = new TradeRiskCalcService(context, null); PS.ResetConfig("{\"ShowAccruedTotalPnL\":\"true\"}"); var results = calcService.Calculate(tradeDataSource, null); #region RB 香草期权 var result = results.FirstOrDefault(x => x.TradeId == 1); Assert.AreEqual(0.121, result.Vol, 1e-8, "trade 1 vol"); Assert.AreEqual(-8135.2970075410021, result.Pv, 1e-8, "trade 1 Pv"); Assert.AreEqual(-69.373394608192029, result.Delta, 1e-8, "trade 1 Delta"); Assert.AreEqual(-279227.91329797293, result.DeltaCash, 1e-8, "trade 1 DeltaCash"); Assert.AreEqual(-6.9373394608192029, result.DeltaInLots, 1e-8, "trade 1 DeltaInLots"); Assert.AreEqual(-0.34161641451646574, result.Gamma, 1e-8, "trade 1 Gamma"); Assert.AreEqual(-55343.994254258185, result.GammaCash, 1e-8, "trade 1 GammaCash"); Assert.AreEqual(-0.034161641451646574, result.GammaInLots, 1e-8, "trade 1 GammaInLots"); Assert.AreEqual(-530.60707905442541, result.Vega, 1e-8, "trade 1 Vega"); Assert.AreEqual(167.35648498901173, result.Theta, 1e-8, "trade 1 Theta"); Assert.AreEqual(6.44574499358896, result.Rho, 1e-8, "trade 1 Rho"); Assert.AreEqual(114.70299245899787, result.TotalPnl, 1e-8, "trade 1 TotalPnl"); Assert.AreEqual(1185.2296981627578, result.DailyPnl, 1e-8, "trade 1 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 2); Assert.AreEqual(0.122, result.Vol, 1e-8, "trade 2 vol"); Assert.AreEqual(4328.5847257567975, result.Pv, 1e-8, "trade 2 Pv"); Assert.AreEqual(-42.043990200818371, result.Delta, 1e-8, "trade 2 Delta"); Assert.AreEqual(-169227.06055829395, result.DeltaCash, 1e-8, "trade 2 DeltaCash"); Assert.AreEqual(-4.2043990200818371, result.DeltaInLots, 1e-8, "trade 2 DeltaInLots"); Assert.AreEqual(0.28242289772606455, result.Gamma, 1e-8, "trade 2 Gamma"); Assert.AreEqual(45754.274574733245, result.GammaCash, 1e-8, "trade 2 GammaCash"); Assert.AreEqual(0.028242289772606455, result.GammaInLots, 1e-8, "trade 2 GammaInLots"); Assert.AreEqual(442.29230318387636, result.Vega, 1e-8, "trade 2 Vega"); Assert.AreEqual(-140.9125090211528, result.Theta, 1e-8, "trade 2 Theta"); Assert.AreEqual(-3.4296170501875167, result.Rho, 1e-8, "trade 2 Rho"); Assert.AreEqual(-3861.4152742432025, result.TotalPnl, 1e-8, "trade 2 TotalPnl"); Assert.AreEqual(509.31366932939636, result.DailyPnl, 1e-8, "trade 2 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 3); Assert.AreEqual(0.123, result.Vol, 1e-8, "trade 3 vol"); Assert.AreEqual(6867.8725374983105, result.Pv, 1e-8, "trade 3 Pv"); Assert.AreEqual(57.706012582639232, result.Delta, 1e-8, "trade 3 Delta"); Assert.AreEqual(232266.70064512291, result.DeltaCash, 1e-8, "trade 3 DeltaCash"); Assert.AreEqual(5.7706012582639232, result.DeltaInLots, 1e-8, "trade 3 DeltaInLots"); Assert.AreEqual(0.28020042009302415, result.Gamma, 1e-8, "trade 3 Gamma"); Assert.AreEqual(45394.219307695494, result.GammaCash, 1e-8, "trade 3 GammaCash"); Assert.AreEqual(0.028020042009302415, result.GammaInLots, 1e-8, "trade 3 GammaInLots"); Assert.AreEqual(442.4091285698978, result.Vega, 1e-8, "trade 3 Vega"); Assert.AreEqual(-141.84965329371062, result.Theta, 1e-8, "trade 3 Theta"); Assert.AreEqual(-5.44154134558994, result.Rho, 1e-8, "trade 3 Rho"); Assert.AreEqual(-1327.1274625016895, result.TotalPnl, 1e-8, "trade 3 TotalPnl"); Assert.AreEqual(-987.21648518817256, result.DailyPnl, 1e-8, "trade 3 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 4); Assert.AreEqual(0.124, result.Vol, 1e-8, "trade 4 vol"); Assert.AreEqual(-11175.742786933908, result.Pv, 1e-8, "trade 4 Pv"); Assert.AreEqual(76.3514164604203, result.Delta, 1e-8, "trade 4 Delta"); Assert.AreEqual(307314.45125319168, result.DeltaCash, 1e-8, "trade 4 DeltaCash"); Assert.AreEqual(7.63514164604203, result.DeltaInLots, 1e-8, "trade 4 DeltaInLots"); Assert.AreEqual(-0.27352030883776024, result.Gamma, 1e-8, "trade 4 Gamma"); Assert.AreEqual(-44311.999533647395, result.GammaCash, 1e-8, "trade 4 GammaCash"); Assert.AreEqual(-0.027352030883776024, result.GammaInLots, 1e-8, "trade 4 GammaInLots"); Assert.AreEqual(-435.36997378178057, result.Vega, 1e-8, "trade 4 Vega"); Assert.AreEqual(139.81100055834213, result.Theta, 1e-8, "trade 4 Theta"); Assert.AreEqual(8.854745936369, result.Rho, 1e-8, "trade 4 Rho"); Assert.AreEqual(-2975.7427869339081, result.TotalPnl, 1e-8, "trade 4 TotalPnl"); Assert.AreEqual(-1017.3011650851695, result.DailyPnl, 1e-8, "trade 4 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 5); Assert.AreEqual(0.125, result.Vol, 1e-8, "trade 5 vol"); Assert.AreEqual(6970.1704398118181, result.Pv, 1e-8, "trade 5 Pv"); Assert.AreEqual(57.7187468570628, result.Delta, 1e-8, "trade 5 Delta"); Assert.AreEqual(232317.95609967777, result.DeltaCash, 1e-8, "trade 5 DeltaCash"); Assert.AreEqual(5.77187468570628, result.DeltaInLots, 1e-8, "trade 5 DeltaInLots"); Assert.AreEqual(0.27640635380521417, result.Gamma, 1e-8, "trade 5 Gamma"); Assert.AreEqual(44779.55685615597, result.GammaCash, 1e-8, "trade 5 GammaCash"); Assert.AreEqual(0.027640635380521417, result.GammaInLots, 1e-8, "trade 5 GammaInLots"); Assert.AreEqual(443.512080180426, result.Vega, 1e-8, "trade 5 Vega"); Assert.AreEqual(-145.21962543790323, result.Theta, 1e-8, "trade 5 Theta"); Assert.AreEqual(-5.5225938493913418, result.Rho, 1e-8, "trade 5 Rho"); Assert.AreEqual(-1129.8295601881819, result.TotalPnl, 1e-8, "trade 5 TotalPnl"); Assert.AreEqual(-989.30960923635212, result.DailyPnl, 1e-8, "trade 5 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 6); Assert.AreEqual(0.126, result.Vol, 1e-8, "trade 6 vol"); Assert.AreEqual(-6810.5367598768225, result.Pv, 1e-8, "trade 6 Pv"); Assert.AreEqual(-65.524466149508953, result.Delta, 1e-8, "trade 6 Delta"); Assert.AreEqual(-263735.97625177354, result.DeltaCash, 1e-8, "trade 6 DeltaCash"); Assert.AreEqual(-6.5524466149508953, result.DeltaInLots, 1e-8, "trade 6 DeltaInLots"); Assert.AreEqual(-0.41324034100398421, result.Gamma, 1e-8, "trade 6 Gamma"); Assert.AreEqual(-66947.517994776717, result.GammaCash, 1e-8, "trade 6 GammaCash"); Assert.AreEqual(-0.041324034100398421, result.GammaInLots, 1e-8, "trade 6 GammaInLots"); Assert.AreEqual(-668.37968810414168, result.Vega, 1e-8, "trade 6 Vega"); Assert.AreEqual(219.92643141441931, result.Theta, 1e-8, "trade 6 Theta"); Assert.AreEqual(5.39611315763068, result.Rho, 1e-8, "trade 6 Rho"); Assert.AreEqual(1189.4632401231775, result.TotalPnl, 1e-8, "trade 6 TotalPnl"); Assert.AreEqual(1189.4632401231775, result.DailyPnl, 1e-8, "trade 6 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 7); Assert.AreEqual(0.127, result.Vol, 1e-8, "trade 7 vol"); Assert.AreEqual(7780.7617181414962, result.Pv, 1e-8, "trade 7 Pv"); Assert.AreEqual(-65.7418387368125, result.Delta, 1e-8, "trade 7 Delta"); Assert.AreEqual(-264610.90091567033, result.DeltaCash, 1e-8, "trade 7 DeltaCash"); Assert.AreEqual(-6.57418387368125, result.DeltaInLots, 1e-8, "trade 7 DeltaInLots"); Assert.AreEqual(0.35966915675089695, result.Gamma, 1e-8, "trade 7 Gamma"); Assert.AreEqual(58268.651325875, result.GammaCash, 1e-8, "trade 7 GammaCash"); Assert.AreEqual(0.035966915675089695, result.GammaInLots, 1e-8, "trade 7 GammaInLots"); Assert.AreEqual(586.348476881767, result.Vega, 1e-8, "trade 7 Vega"); Assert.AreEqual(-194.36242502044115, result.Theta, 1e-8, "trade 7 Theta"); Assert.AreEqual(-6.1648401827915222, result.Rho, 1e-8, "trade 7 Rho"); Assert.AreEqual(-319.2382818585038, result.TotalPnl, 1e-8, "trade 7 TotalPnl"); Assert.AreEqual(-319.2382818585038, result.DailyPnl, 1e-8, "trade 7 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 8); Assert.AreEqual(0.128, result.Vol, 1e-8, "trade 8 vol"); Assert.AreEqual(-8750.8659508510173, result.Pv, 1e-8, "trade 8 Pv"); Assert.AreEqual(-75.538359720121662, result.Delta, 1e-8, "trade 8 Delta"); Assert.AreEqual(-304041.89787348971, result.DeltaCash, 1e-8, "trade 8 DeltaCash"); Assert.AreEqual(-7.5538359720121662, result.DeltaInLots, 1e-8, "trade 8 DeltaInLots"); Assert.AreEqual(-0.39833332266425714, result.Gamma, 1e-8, "trade 8 Gamma"); Assert.AreEqual(-64532.4878548763, result.GammaCash, 1e-8, "trade 8 GammaCash"); Assert.AreEqual(-0.039833332266425714, result.GammaInLots, 1e-8, "trade 8 GammaInLots"); Assert.AreEqual(-654.490843824351, result.Vega, 1e-8, "trade 8 Vega"); Assert.AreEqual(219.53295966470432, result.Theta, 1e-8, "trade 8 Theta"); Assert.AreEqual(6.9334715548939139, result.Rho, 1e-8, "trade 8 Rho"); Assert.AreEqual(-750.86595085101726, result.TotalPnl, 1e-8, "trade 8 TotalPnl"); Assert.AreEqual(-750.86595085101726, result.DailyPnl, 1e-8, "trade 8 DailyPnl"); #endregion #region RB 商品期货 //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_long_RB1909"); //Assert.AreEqual(1180, result.Notional, 1e-8, "1_商品期货_long_RB1909 Notional"); //Assert.AreEqual(4749500, result.Pv, 1e-8, "1_商品期货_long_RB1909 Pv"); //Assert.AreEqual(-3223.975, result.DailyPnl, 1e-8, "1_商品期货_long_RB1909 DailyPnl"); //Assert.AreEqual(44280.775, result.TotalPnl, 1e-8, "1_商品期货_long_RB1909 TotalPnl"); //Assert.AreEqual(4705219.225, result.Cost.Value, 1e-8, "1_商品期货_long_RB1909 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_short_RB1909"); //Assert.AreEqual(30, result.Notional, 1e-8, "1_商品期货_short_RB1909 Notional"); //Assert.AreEqual(120750, result.Pv, 1e-8, "1_商品期货_short_RB1909 Pv"); //Assert.AreEqual(5392.75, result.DailyPnl, 1e-8, "1_商品期货_short_RB1909 DailyPnl"); //Assert.AreEqual(5392.75, result.TotalPnl, 1e-8, "1_商品期货_short_RB1909 TotalPnl"); //Assert.AreEqual(115357.25, result.Cost.Value, 1e-8, "1_商品期货_short_RB1909 Cost"); #endregion #region RB 场内期权 //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_RB1909C4000"); //Assert.AreEqual(60, result.Notional, 1e-8, "1_场内期权_long_RB1909C4000 Notional"); //Assert.AreEqual(0.1, result.Vol, 1e-8, "1_场内期权_long_RB1909C4000 Vol"); //Assert.AreEqual(3512.45066692385, result.Pv, 1e-8, "1_场内期权_long_RB1909C4000 Pv"); //Assert.AreEqual(1512.45066692385, result.DailyPnl, 1e-8, "1_场内期权_long_RB1909C4000 DailyPnl"); //Assert.AreEqual(1512.45066692385, result.TotalPnl, 1e-8, "1_场内期权_long_RB1909C4000 TotalPnl"); //Assert.AreEqual(2000, result.Cost.Value, 1e-8, "1_场内期权_long_RB1909C4000 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_RB1909C3950"); //Assert.AreEqual(70, result.Notional, 1e-8, "1_场内期权_long_RB1909C3950 Notional"); //Assert.AreEqual(0.101, result.Vol, 1e-8, "1_场内期权_long_RB1909C3950 Vol"); //Assert.AreEqual(6446.50859145755, result.Pv, 1e-8, "1_场内期权_long_RB1909C3950 Pv"); //Assert.AreEqual(1546.50859145755, result.DailyPnl, 1e-8, "1_场内期权_long_RB1909C3950 DailyPnl"); //Assert.AreEqual(1546.50859145755, result.TotalPnl, 1e-8, "1_场内期权_long_RB1909C3950 TotalPnl"); //Assert.AreEqual(4900, result.Cost.Value, 1e-8, "1_场内期权_long_RB1909C3950 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_RB1909P4100"); //Assert.AreEqual(-80, result.Notional, 1e-8, "1_场内期权_short_RB1909P4100 Notional"); //Assert.AreEqual(0.102, result.Vol, 1e-8, "1_场内期权_short_RB1909P4100 Vol"); //Assert.AreEqual(-7451.78254457061, result.Pv, 1e-8, "1_场内期权_short_RB1909P4100 Pv"); //Assert.AreEqual(-1051.78254457061, result.DailyPnl, 1e-8, "1_场内期权_short_RB1909P4100 DailyPnl"); //Assert.AreEqual(-1051.78254457061, result.TotalPnl, 1e-8, "1_场内期权_short_RB1909P4100 TotalPnl"); //Assert.AreEqual(-6400, result.Cost.Value, 1e-8, "1_场内期权_short_RB1909P4100 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_RB1909P4200"); //Assert.AreEqual(-60, result.Notional, 1e-8, "1_场内期权_short_RB1909P4200 Notional"); //Assert.AreEqual(0.103, result.Vol, 1e-8, "1_场内期权_short_RB1909P4200 Vol"); //Assert.AreEqual(-10704.1875197521, result.Pv, 1e-8, "1_场内期权_short_RB1909P4200 Pv"); //Assert.AreEqual(-2304.1875197521, result.DailyPnl, 1e-8, "1_场内期权_short_RB1909P4200 DailyPnl"); //Assert.AreEqual(-2304.1875197521, result.TotalPnl, 1e-8, "1_场内期权_short_RB1909P4200 TotalPnl"); //Assert.AreEqual(-8400, result.Cost.Value, 1e-8, "1_场内期权_short_RB1909P4200 Cost"); #endregion #region JD 香草期权 result = results.FirstOrDefault(x => x.TradeId == 1001); Assert.AreEqual(0.129, result.Vol, 1e-8, "trade 1001 vol"); Assert.AreEqual(-18881.938346775569, result.Pv, 1e-8, "trade 1001 Pv"); Assert.AreEqual(-87.96759689830651, result.Delta, 1e-8, "trade 1001 Delta"); Assert.AreEqual(-393830.93131371826, result.DeltaCash, 1e-8, "trade 1001 DeltaCash"); Assert.AreEqual(-8.796759689830651, result.DeltaInLots, 1e-8, "trade 1001 DeltaInLots"); Assert.AreEqual(-0.13973236491438001, result.Gamma, 1e-8, "trade 1001 Gamma"); Assert.AreEqual(-28007.297083999583, result.GammaCash, 1e-8, "trade 1001 GammaCash"); Assert.AreEqual(-0.013973236491438001, result.GammaInLots, 1e-8, "trade 1001 GammaInLots"); Assert.AreEqual(-263.09952668088954, result.Vega, 1e-8, "trade 1001 Vega"); Assert.AreEqual(86.425659544744121, result.Theta, 1e-8, "trade 1001 Theta"); Assert.AreEqual(1.8526530574672506, result.Rho, 1e-8, "trade 1001 Rho"); Assert.AreEqual(-13631.938346775569, result.TotalPnl, 1e-8, "trade 1001 TotalPnl"); Assert.AreEqual(3819.6334732789692, result.DailyPnl, 1e-8, "trade 1001 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 1002); Assert.AreEqual(0.130, result.Vol, 1e-8, "trade 1002 vol"); Assert.AreEqual(891.49146952448359, result.Pv, 1e-8, "trade 1002 Pv"); Assert.AreEqual(-10.589403102585493, result.Delta, 1e-8, "trade 1002 Delta"); Assert.AreEqual(-47408.757690275248, result.DeltaCash, 1e-8, "trade 1002 DeltaCash"); Assert.AreEqual(-1.0589403102585493, result.DeltaInLots, 1e-8, "trade 1002 DeltaInLots"); Assert.AreEqual(0.10415321867185412, result.Gamma, 1e-8, "trade 1002 Gamma"); Assert.AreEqual(20875.980588926497, result.GammaCash, 1e-8, "trade 1002 GammaCash"); Assert.AreEqual(0.010415321867185412, result.GammaInLots, 1e-8, "trade 1002 GammaInLots"); Assert.AreEqual(217.03733477865512, result.Vega, 1e-8, "trade 1002 Vega"); Assert.AreEqual(-72.102324115425176, result.Theta, 1e-8, "trade 1002 Theta"); Assert.AreEqual(-0.28428024221511805, result.Rho, 1e-8, "trade 1002 Rho"); Assert.AreEqual(-4088.5085304755166, result.TotalPnl, 1e-8, "trade 1002 TotalPnl"); Assert.AreEqual(351.3805111689519, result.DailyPnl, 1e-8, "trade 1002 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 1003); Assert.AreEqual(0.131, result.Vol, 1e-8, "trade 1003 vol"); Assert.AreEqual(-25178.826003618018, result.Pv, 1e-8, "trade 1003 Pv"); Assert.AreEqual(-86.3413192484586, result.Delta, 1e-8, "trade 1003 Delta"); Assert.AreEqual(-386550.08627534914, result.DeltaCash, 1e-8, "trade 1003 DeltaCash"); Assert.AreEqual(-8.63413192484586, result.DeltaInLots, 1e-8, "trade 1003 DeltaInLots"); Assert.AreEqual(-0.047397115849889815, result.Gamma, 1e-8, "trade 1003 Gamma"); Assert.AreEqual(-9500.0546605362615, result.GammaCash, 1e-8, "trade 1003 GammaCash"); Assert.AreEqual(-0.0047397115849889815, result.GammaInLots, 1e-8, "trade 1003 GammaInLots"); Assert.AreEqual(-99.460958276904421, result.Vega, 1e-8, "trade 1003 Vega"); Assert.AreEqual(32.5409403759586, result.Theta, 1e-8, "trade 1003 Theta"); Assert.AreEqual(-2053.0174556343627, result.Rho, 1e-8, "trade 1003 Rho"); Assert.AreEqual(-20078.826003618018, result.TotalPnl, 1e-8, "trade 1003 TotalPnl"); Assert.AreEqual(3666.4893877908544, result.DailyPnl, 1e-8, "trade 1003 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 1004); Assert.AreEqual(0.132, result.Vol, 1e-8, "trade 1004 vol"); Assert.AreEqual(664.58072634923155, result.Pv, 1e-8, "trade 1004 Pv"); Assert.AreEqual(-8.66937456839878, result.Delta, 1e-8, "trade 1004 Delta"); Assert.AreEqual(-38812.789942721342, result.DeltaCash, 1e-8, "trade 1004 DeltaCash"); Assert.AreEqual(-0.866937456839878, result.DeltaInLots, 1e-8, "trade 1004 DeltaInLots"); Assert.AreEqual(0.096788407972780988, result.Gamma, 1e-8, "trade 1004 Gamma"); Assert.AreEqual(19399.812620662669, result.GammaCash, 1e-8, "trade 1004 GammaCash"); Assert.AreEqual(0.0096788407972780988, result.GammaInLots, 1e-8, "trade 1004 GammaInLots"); Assert.AreEqual(204.65243817582746, result.Vega, 1e-8, "trade 1004 Vega"); Assert.AreEqual(-68.390399111310671, result.Theta, 1e-8, "trade 1004 Theta"); Assert.AreEqual(24.446118771464853, result.Rho, 1e-8, "trade 1004 Rho"); Assert.AreEqual(-4335.4192736507684, result.TotalPnl, 1e-8, "trade 1004 TotalPnl"); Assert.AreEqual(-4335.4192736507684, result.DailyPnl, 1e-8, "trade 1004 DailyPnl"); result = results.FirstOrDefault(x => x.TradeId == 1005); Assert.AreEqual(0.133, result.Vol, 1e-8, "trade 1005 vol"); Assert.AreEqual(-39319.005944028089, result.Pv, 1e-8, "trade 1005 Pv"); Assert.AreEqual(-117.26072473247768, result.Delta, 1e-8, "trade 1005 Delta"); Assert.AreEqual(-524976.26462730253, result.DeltaCash, 1e-8, "trade 1005 DeltaCash"); Assert.AreEqual(-11.726072473247768, result.DeltaInLots, 1e-8, "trade 1005 DeltaInLots"); Assert.AreEqual(-0.035720877349376678, result.Gamma, 1e-8, "trade 1005 Gamma"); Assert.AreEqual(-7159.7244105767459, result.GammaCash, 1e-8, "trade 1005 GammaCash"); Assert.AreEqual(-0.0035720877349376678, result.GammaInLots, 1e-8, "trade 1005 GammaInLots"); Assert.AreEqual(-76.099462055572076, result.Vega, 1e-8, "trade 1005 Vega"); Assert.AreEqual(20.891020308095904, result.Theta, 1e-8, "trade 1005 Theta"); Assert.AreEqual(31.421720464059032, result.Rho, 1e-8, "trade 1005 Rho"); Assert.AreEqual(-34019.005944028089, result.TotalPnl, 1e-8, "trade 1005 TotalPnl"); Assert.AreEqual(-34019.005944028089, result.DailyPnl, 1e-8, "trade 1005 DailyPnl"); #endregion #region JD 商品期货 //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_long_JD1909"); //Assert.AreEqual(1260, result.Notional, 1e-8, "1_商品期货_long_JD1909 Notional"); //Assert.AreEqual(5641020, result.Pv, 1e-8, "1_商品期货_long_JD1909 Pv"); //Assert.AreEqual(-85982.2, result.DailyPnl, 1e-8, "1_商品期货_long_JD1909 DailyPnl"); //Assert.AreEqual(316561.55, result.TotalPnl, 1e-8, "1_商品期货_long_JD1909 TotalPnl"); //Assert.AreEqual(5324458.45, result.Cost.Value, 1e-8, "1_商品期货_long_JD1909 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_short_JD1909"); //Assert.AreEqual(-250, result.Notional, 1e-8, "1_商品期货_short_JD1909 Notional"); //Assert.AreEqual(-1119250, result.Pv, 1e-8, "1_商品期货_short_JD1909 Pv"); //Assert.AreEqual(345207.5, result.DailyPnl, 1e-8, "1_商品期货_short_JD1909 DailyPnl"); //Assert.AreEqual(73505.9, result.TotalPnl, 1e-8, "1_商品期货_short_JD1909 TotalPnl"); //Assert.AreEqual(-1192755.9, result.Cost.Value, 1e-8, "1_商品期货_short_JD1909 Cost"); #endregion #region JD 场内期权 //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_JD1909C4300"); //Assert.AreEqual(160, result.Notional, 1e-8, "1_场内期权_long_JD1909C4300 Notional"); //Assert.AreEqual(0.104, result.Vol, 1e-8, "1_场内期权_long_JD1909C4300 Vol"); //Assert.AreEqual(29066.4901782639, result.Pv, 1e-8, "1_场内期权_long_JD1909C4300 Pv"); //Assert.AreEqual(21066.4901782639, result.DailyPnl, 1e-8, "1_场内期权_long_JD1909C4300 DailyPnl"); //Assert.AreEqual(21066.4901782639, result.TotalPnl, 1e-8, "1_场内期权_long_JD1909C4300 TotalPnl"); //Assert.AreEqual(8000, result.Cost.Value, 1e-8, "1_场内期权_long_JD1909C4300 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_JD1909C4300"); //Assert.AreEqual(-65, result.Notional, 1e-8, "1_场内期权_short_JD1909C4300 Notional"); //Assert.AreEqual(0.104, result.Vol, 1e-8, "1_场内期权_short_JD1909C4300 Vol"); //Assert.AreEqual(-11808.2616349197, result.Pv, 1e-8, "1_场内期权_short_JD1909C4300 Pv"); //Assert.AreEqual(14993.919567198500, result.DailyPnl, 1e-8, "1_场内期权_short_JD1909C4300 DailyPnl"); //Assert.AreEqual(6541.738365080300, result.TotalPnl, 1e-8, "1_场内期权_short_JD1909C4300 TotalPnl"); //Assert.AreEqual(-18350, result.Cost.Value, 1e-8, "1_场内期权_short_JD1909C4300 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_JD1909P4400"); //Assert.AreEqual(30, result.Notional, 1e-8, "1_场内期权_long_JD1909P4400 Notional"); //Assert.AreEqual(0.105, result.Vol, 1e-8, "1_场内期权_long_JD1909P4400 Vol"); //Assert.AreEqual(682.250581766453, result.Pv, 1e-8, "1_场内期权_long_JD1909P4400 Pv"); //Assert.AreEqual(-3346.688309786890, result.DailyPnl, 1e-8, "1_场内期权_long_JD1909P4400 DailyPnl"); //Assert.AreEqual(3482.250581766450, result.TotalPnl, 1e-8, "1_场内期权_long_JD1909P4400 TotalPnl"); //Assert.AreEqual(-2800, result.Cost.Value, 1e-8, "1_场内期权_long_JD1909P4400 Cost"); //result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_JD1909P4400"); //Assert.AreEqual(-70, result.Notional, 1e-8, "1_场内期权_short_JD1909P4400 Notional"); //Assert.AreEqual(0.105, result.Vol, 1e-8, "1_场内期权_short_JD1909P4400 Vol"); //Assert.AreEqual(-1591.91802412172, result.Pv, 1e-8, "1_场内期权_short_JD1909P4400 Pv"); //Assert.AreEqual(8208.08197587828, result.DailyPnl, 1e-8, "1_场内期权_short_JD1909P4400 DailyPnl"); //Assert.AreEqual(8208.08197587828, result.TotalPnl, 1e-8, "1_场内期权_short_JD1909P4400 TotalPnl"); //Assert.AreEqual(-9800, result.Cost.Value, 1e-8, "1_场内期权_short_JD1909P4400 Cost"); #endregion #region AU 香草期权 //此交易有部分平仓的情况 result = results.FirstOrDefault(x => x.TradeId == 2001); Assert.AreEqual(0.134, result.Vol, 1e-8, "trade 2001 vol"); Assert.AreEqual(-734.79976938977222, result.Pv, 1e-8, "trade 2001 Pv"); Assert.AreEqual(-70.036312279432877, result.Delta, 1e-8, "trade 2001 Delta"); Assert.AreEqual(-21277.03167049171, result.DeltaCash, 1e-8, "trade 2001 DeltaCash"); Assert.AreEqual(-0.070036312279432883, result.DeltaInLots, 1e-8, "trade 2001 DeltaInLots"); Assert.AreEqual(-3.5916961564907979, result.Gamma, 1e-8, "trade 2001 Gamma"); Assert.AreEqual(-3314.9358541347056, result.GammaCash, 1e-8, "trade 2001 GammaCash"); Assert.AreEqual(-0.0035916961564907979, result.GammaInLots, 1e-8, "trade 2001 GammaInLots"); Assert.AreEqual(-35.196287307263674, result.Vega, 1e-8, "trade 2001 Vega"); Assert.AreEqual(12.266805039301175, result.Theta, 1e-8, "trade 2001 Theta"); Assert.AreEqual(0.58219533109308941, result.Rho, 1e-8, "trade 2001 Rho"); Assert.AreEqual(15.200230610227777, result.TotalPnl, 1e-8, "trade 2001 TotalPnl"); Assert.AreEqual(-811.09770746206, result.DailyPnl, 1e-8, "trade 2001 DailyPnl"); #endregion #region AU 商品期货 #endregion #region AU 场内期权 #endregion } [TestMethod] public void AtmQuoteTestV2() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); #region Normal Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); //只计算主力合约 var mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: true); Assert.AreEqual(3, mainContraceQuoteResults.Count, "mainContraceQuoteResults onlyMainContract count"); Assert.AreEqual("CU1909", mainContraceQuoteResults[0].underlyingCode, "CU1909"); Assert.AreEqual("SHFE", mainContraceQuoteResults[0].marketCode, "CU1909"); Assert.AreEqual(47100, mainContraceQuoteResults[0].spotPrice, "CU1909 spotPrice"); Assert.AreEqual(715.49051521718434, mainContraceQuoteResults[0].sellOptionPrice, 1e-8, "CU1909 sellOptionPrice"); Assert.AreEqual(0.12906666666666669, mainContraceQuoteResults[0].sellOptionVol, 1e-8, "CU1909 sellOptionVol"); Assert.AreEqual(453.5500469250411, mainContraceQuoteResults[0].buyOptionPrice, 1e-8, "CU1909 buyOptionPrice"); Assert.AreEqual(0.08181250000000001, mainContraceQuoteResults[0].buyOptionVol, 1e-8, "CU1909 buyOptionVol"); Assert.AreEqual("RB1910", mainContraceQuoteResults[1].underlyingCode, "RB1910"); Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "RB1910"); Assert.AreEqual(3973, mainContraceQuoteResults[1].spotPrice, "RB1910 spotPrice"); Assert.AreEqual(140.24670982614325, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "RB1910 sellOptionPrice"); Assert.AreEqual(0.3, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "RB1910 sellOptionVol"); Assert.AreEqual(140.24670982614325, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "RB1910 buyOptionPrice"); Assert.AreEqual(0.3, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "RB1910 buyOptionVol"); Assert.AreEqual("AP911", mainContraceQuoteResults[2].underlyingCode, "AP911"); Assert.AreEqual(8758, mainContraceQuoteResults[2].spotPrice, "AP911 spotPrice"); Assert.AreEqual(310.35618111067134, mainContraceQuoteResults[2].sellOptionPrice, 1e-8, "AP911 sellOptionPrice"); Assert.AreEqual(0.3, mainContraceQuoteResults[2].sellOptionVol, 1e-8, "AP911 sellOptionVol"); Assert.AreEqual(310.35618111067134, mainContraceQuoteResults[2].buyOptionPrice, 1e-8, "AP911 buyOptionPrice"); Assert.AreEqual(0.3, mainContraceQuoteResults[2].buyOptionVol, 1e-8, "AP911 buyOptionVol"); //Assert.AreEqual("JD1909", mainContraceQuoteResults[3].underlyingCode, "JD1909"); //Assert.AreEqual(4477, mainContraceQuoteResults[3].spotPrice, "JD1909 spotPrice"); //Assert.AreEqual(158.65090463946953, mainContraceQuoteResults[3].sellOptionPrice, 1e-8, "JD1909 sellOptionPrice"); //Assert.AreEqual(0.3, mainContraceQuoteResults[3].sellOptionVol, 1e-8, "JD1909 sellOptionVol"); //Assert.AreEqual(158.65090463946953, mainContraceQuoteResults[3].buyOptionPrice, 1e-8, "JD1909 buyOptionPrice"); //Assert.AreEqual(0.3, mainContraceQuoteResults[3].buyOptionVol, 1e-8, "JD1909 buyOptionVol"); //计算所有报价合约 mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: false); Assert.AreEqual(5, mainContraceQuoteResults.Count, "mainContraceQuoteResults count"); Assert.AreEqual("CU1910", mainContraceQuoteResults[1].underlyingCode, "CU1910"); Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "CU1910"); Assert.AreEqual(47120, mainContraceQuoteResults[1].spotPrice, "CU1CU1910909 spotPrice"); Assert.AreEqual(715.79433284572588, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "CU1910 sellOptionPrice"); Assert.AreEqual(0.12906666666666669, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "CU1910 sellOptionVol"); Assert.AreEqual(453.74263717851096, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "CU1910 buyOptionPrice"); Assert.AreEqual(0.08181250000000001, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "CU1910 buyOptionVol"); Assert.AreEqual("RB1912", mainContraceQuoteResults[3].underlyingCode, "RB1912"); Assert.AreEqual("SHFE", mainContraceQuoteResults[3].marketCode, "RB1912"); Assert.AreEqual(3766, mainContraceQuoteResults[3].spotPrice, "RB1912 spotPrice"); Assert.AreEqual(132.9396197345217, mainContraceQuoteResults[3].sellOptionPrice, 1e-8, "RB1912 sellOptionPrice"); Assert.AreEqual(0.3, mainContraceQuoteResults[3].sellOptionVol, 1e-8, "RB1912 sellOptionVol"); Assert.AreEqual(132.9396197345217, mainContraceQuoteResults[3].buyOptionPrice, 1e-8, "RB1912 buyOptionPrice"); Assert.AreEqual(0.3, mainContraceQuoteResults[3].buyOptionVol, 1e-8, "RB1912 buyOptionVol"); #endregion #region SkewMap Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}"); //只计算主力合约 mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: true); Assert.AreEqual(3, mainContraceQuoteResults.Count, "mainContraceQuoteResults onlyMainContract count"); Assert.AreEqual("CU1909", mainContraceQuoteResults[0].underlyingCode, "CU1909"); Assert.AreEqual("SHFE", mainContraceQuoteResults[0].marketCode, "CU1909"); Assert.AreEqual(47100, mainContraceQuoteResults[0].spotPrice, "CU1909 spotPrice"); Assert.AreEqual(909.05249440526984, mainContraceQuoteResults[0].sellOptionPrice, 1e-8, "CU1909 sellOptionPrice"); Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[0].sellOptionVol, 1e-8, "CU1909 sellOptionVol"); Assert.AreEqual(609.75971514150763, mainContraceQuoteResults[0].buyOptionPrice, 1e-8, "CU1909 buyOptionPrice"); Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[0].buyOptionVol, 1e-8, "CU1909 buyOptionVol"); Assert.AreEqual("RB1910", mainContraceQuoteResults[1].underlyingCode, "RB1910"); Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "RB1910"); Assert.AreEqual(3973, mainContraceQuoteResults[1].spotPrice, "RB1910 spotPrice"); Assert.AreEqual(76.680797458007078, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "RB1910 sellOptionPrice"); Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "RB1910 sellOptionVol"); Assert.AreEqual(51.434720769792484, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "RB1910 buyOptionPrice"); Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "RB1910 buyOptionVol"); Assert.AreEqual("AP911", mainContraceQuoteResults[2].underlyingCode, "AP911"); Assert.AreEqual(8758, mainContraceQuoteResults[2].spotPrice, "AP911 spotPrice"); Assert.AreEqual(169.68955794100592, mainContraceQuoteResults[2].sellOptionPrice, 1e-8, "AP911 sellOptionPrice"); Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[2].sellOptionVol, 1e-8, "AP911 sellOptionVol"); Assert.AreEqual(113.82169974887145, mainContraceQuoteResults[2].buyOptionPrice, 1e-8, "AP911 buyOptionPrice"); Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[2].buyOptionVol, 1e-8, "AP911 buyOptionVol"); //计算所有报价合约 mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: false); Assert.AreEqual(5, mainContraceQuoteResults.Count, "mainContraceQuoteResults count"); Assert.AreEqual("CU1910", mainContraceQuoteResults[1].underlyingCode, "CU1910"); Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "CU1910"); Assert.AreEqual(47120, mainContraceQuoteResults[1].spotPrice, "CU1CU1910909 spotPrice"); Assert.AreEqual(909.43850395703168, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "CU1910 sellOptionPrice"); Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "CU1910 sellOptionVol"); Assert.AreEqual(610.01863646428569, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "CU1910 buyOptionPrice"); Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "CU1910 buyOptionVol"); Assert.AreEqual("RB1912", mainContraceQuoteResults[3].underlyingCode, "RB1912"); Assert.AreEqual("SHFE", mainContraceQuoteResults[3].marketCode, "RB1912"); Assert.AreEqual(3766, mainContraceQuoteResults[3].spotPrice, "RB1912 spotPrice"); Assert.AreEqual(72.685598597245161, mainContraceQuoteResults[3].sellOptionPrice, 1e-8, "RB1912 sellOptionPrice"); Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[3].sellOptionVol, 1e-8, "RB1912 sellOptionVol"); Assert.AreEqual(48.754885079042914, mainContraceQuoteResults[3].buyOptionPrice, 1e-8, "RB1912 buyOptionPrice"); Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[3].buyOptionVol, 1e-8, "RB1912 buyOptionVol"); #endregion } /// /// T型实时报价测试 /// [TestMethod] public void TQuoteTest() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); #region Normal Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); #region CU1910 采用系统中设置的200为strike间隔 var tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16) }; var result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price"); Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count"); Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(1323.8188434410963, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke"); Assert.AreEqual(0.028094627407493553, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent"); Assert.AreEqual(1113.8549476759197, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice"); Assert.AreEqual(0.0818819326542162, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol"); Assert.AreEqual(0.023638687344565357, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent"); Assert.AreEqual(326.00224868627646, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol"); Assert.AreEqual(0.0069185536648191095, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent"); Assert.AreEqual(116.0383529211035, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice"); Assert.AreEqual(0.0818819326542162, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol"); Assert.AreEqual(0.0024626136018909908, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent"); Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike"); Assert.AreEqual(1055.4409173448089, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice"); Assert.AreEqual(0.13005274476513867, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke"); Assert.AreEqual(0.022399000792546878, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent"); Assert.AreEqual(812.21812605787193, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice"); Assert.AreEqual(0.081854159592529716, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol"); Assert.AreEqual(0.017237226783910695, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent"); Assert.AreEqual(456.75096049191916, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice"); Assert.AreEqual(0.13005274476513867, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol"); Assert.AreEqual(0.0096933565469422573, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent"); Assert.AreEqual(213.52816920498219, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice"); Assert.AreEqual(0.081854159592529716, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol"); Assert.AreEqual(0.0045315825383060735, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent"); Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike"); Assert.AreEqual(820.295788822324, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke"); Assert.AreEqual(0.01740865426193387, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent"); Assert.AreEqual(559.61782699983837, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol"); Assert.AreEqual(0.01187643945245837, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent"); Assert.AreEqual(620.73246987136076, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol"); Assert.AreEqual(0.013173439513398997, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent"); Assert.AreEqual(360.05450804887511, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol"); Assert.AreEqual(0.0076412247039234953, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent"); Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike"); Assert.AreEqual(623.75969955305777, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke"); Assert.AreEqual(0.013237684625489342, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent"); Assert.AreEqual(361.95132597733681, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol"); Assert.AreEqual(0.0076814797533390662, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent"); Assert.AreEqual(823.32301850402462, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol"); Assert.AreEqual(0.017472899374024291, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent"); Assert.AreEqual(561.51464492830371, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol"); Assert.AreEqual(0.011916694501874018, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent"); Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike"); Assert.AreEqual(339.23353112420568, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke"); Assert.AreEqual(0.0071993533769992716, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent"); Assert.AreEqual(122.60154224895, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice"); Assert.AreEqual(0.081881932654216186, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol"); Assert.AreEqual(0.0026019003023970712, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent"); Assert.AreEqual(1337.05012587902, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol"); Assert.AreEqual(0.0283754271196736, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent"); Assert.AreEqual(1120.4181370037679, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice"); Assert.AreEqual(0.081881932654216186, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol"); Assert.AreEqual(0.023777974045071475, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent"); #endregion #region CU1910 采用参数传递的100作为Strike间隔 tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16), strikeInterval = 100, strikeCount = 3 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2"); Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2"); Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(766.94209355431292, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2"); Assert.AreEqual(0.12923101301641202, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2"); Assert.AreEqual(0.016276360219743484, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2"); Assert.AreEqual(504.93702285546607, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2"); Assert.AreEqual(0.081819443265421635, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2"); Assert.AreEqual(0.010715980960430095, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2"); Assert.AreEqual(667.16043407883126, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2"); Assert.AreEqual(0.12923101301641202, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2"); Assert.AreEqual(0.014158752845476045, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2"); Assert.AreEqual(405.15536337998446, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2"); Assert.AreEqual(0.081819443265421635, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2"); Assert.AreEqual(0.0085983735861626578, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2"); Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike"); Assert.AreEqual(715.79433284572588, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice"); Assert.AreEqual(0.12906666666666669, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke"); Assert.AreEqual(0.015190881427116424, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent"); Assert.AreEqual(453.74263717851096, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice"); Assert.AreEqual(0.08181250000000001, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol"); Assert.AreEqual(0.00962951267356772, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent"); Assert.AreEqual(715.79433284572588, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice"); Assert.AreEqual(0.12906666666666669, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol"); Assert.AreEqual(0.015190881427116424, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent"); Assert.AreEqual(453.74263717851454, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice"); Assert.AreEqual(0.08181250000000001, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol"); Assert.AreEqual(0.0096295126735677951, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent"); #endregion #region AP911 系统未设置Strike间隔,应使用100 tQuoteRequest = new TQuoteRequest() { underlyingCode = "AP911", maturityDate = new DateTime(2019, 7, 16), spotPrice = 8600 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price"); Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count"); Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike"); Assert.AreEqual(609.80154469645686, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice"); Assert.AreEqual(0.3, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke"); Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent"); Assert.AreEqual(609.801544696456, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice"); Assert.AreEqual(0.3, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol"); Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent"); Assert.AreEqual(110.90176685520926, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice"); Assert.AreEqual(0.3, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol"); Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent"); Assert.AreEqual(110.90176685520926, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice"); Assert.AreEqual(0.3, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol"); Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent"); Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike"); Assert.AreEqual(472.58446045531184, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice"); Assert.AreEqual(0.3, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke"); Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent"); Assert.AreEqual(472.58446045531184, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice"); Assert.AreEqual(0.3, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol"); Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent"); Assert.AreEqual(173.24459375056367, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice"); Assert.AreEqual(0.3, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol"); Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent"); Assert.AreEqual(173.24459375056367, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice"); Assert.AreEqual(0.3, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol"); Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent"); #endregion #endregion #region SkewMap Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}"); #region CU1910 采用系统中设置的200为strike间隔 tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16) }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price"); Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count"); Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(1502.6575903670266, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice"); Assert.AreEqual(0.1674694930736175, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke"); Assert.AreEqual(0.031890016773493776, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent"); Assert.AreEqual(1210.8776103576965, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice"); Assert.AreEqual(0.10581671458278169, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol"); Assert.AreEqual(0.025697742155299162, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent"); Assert.AreEqual(504.84099561221052, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice"); Assert.AreEqual(0.1674694930736175, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol"); Assert.AreEqual(0.010713943030819408, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent"); Assert.AreEqual(231.33391923267263, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice"); Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol"); Assert.AreEqual(0.0049094634811687743, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent"); Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike"); Assert.AreEqual(1245.4771707744617, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice"); Assert.AreEqual(0.16607739179657319, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke"); Assert.AreEqual(0.026432028242242396, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent"); Assert.AreEqual(942.12908835003475, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice"); Assert.AreEqual(0.10806727953002154, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol"); Assert.AreEqual(0.019994250601656084, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent"); Assert.AreEqual(646.78721392157206, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice"); Assert.AreEqual(0.16607739179657319, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol"); Assert.AreEqual(0.013726383996637778, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent"); Assert.AreEqual(353.23967712691137, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice"); Assert.AreEqual(0.10999215915889668, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol"); Assert.AreEqual(0.0074965975621161156, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent"); Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike"); Assert.AreEqual(1014.6151321609087, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke"); Assert.AreEqual(0.021532579205452224, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent"); Assert.AreEqual(710.72991801994544, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice"); Assert.AreEqual(0.10945013204491073, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol"); Assert.AreEqual(0.015083402334888486, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent"); Assert.AreEqual(815.05181320994552, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol"); Assert.AreEqual(0.01729736445691735, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent"); Assert.AreEqual(514.14037483185348, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice"); Assert.AreEqual(0.10999215915889665, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol"); Assert.AreEqual(0.010911298277416246, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent"); Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike"); Assert.AreEqual(818.91359452952906, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke"); Assert.AreEqual(0.017379320766755711, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent"); Assert.AreEqual(516.70763413647092, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice"); Assert.AreEqual(0.10999215915889665, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol"); Assert.AreEqual(0.010965781709178075, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent"); Assert.AreEqual(1018.4769134804924, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol"); Assert.AreEqual(0.021614535515290585, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent"); Assert.AreEqual(713.28431131438026, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice"); Assert.AreEqual(0.10945013204491073, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol"); Assert.AreEqual(0.015137612718896016, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent"); Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike"); Assert.AreEqual(522.821549821188, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice"); Assert.AreEqual(0.1674694930736175, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke"); Assert.AreEqual(0.011095533739838456, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent"); Assert.AreEqual(241.7972661396918, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice"); Assert.AreEqual(0.10999215915889668, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol"); Assert.AreEqual(0.00513152092826171, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent"); Assert.AreEqual(1520.6381445760005, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice"); Assert.AreEqual(0.16746949307361747, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol"); Assert.AreEqual(0.032271607482512746, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent"); Assert.AreEqual(1220.7727682449518, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice"); Assert.AreEqual(0.10581671458278175, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol"); Assert.AreEqual(0.025907741261565191, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent"); #endregion #region CU1910 采用参数传递的100作为Strike间隔 tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16), strikeInterval = 100, strikeCount = 3 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2"); Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2"); Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(961.16172642256765, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2"); Assert.AreEqual(0.16433726926385428, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2"); Assert.AreEqual(0.02039816906669286, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2"); Assert.AreEqual(659.063558942026, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2"); Assert.AreEqual(0.1097211456019037, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2"); Assert.AreEqual(0.013986917634593083, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2"); Assert.AreEqual(861.380066947086, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2"); Assert.AreEqual(0.16433726926385428, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2"); Assert.AreEqual(0.018280561692425423, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2"); Assert.AreEqual(560.78001074353426, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2"); Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2"); Assert.AreEqual(0.011901103793368725, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2"); Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike"); Assert.AreEqual(909.43850395703168, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice"); Assert.AreEqual(0.16398924510717011, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke"); Assert.AreEqual(0.019300477588222235, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent"); Assert.AreEqual(610.01863646428569, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol"); Assert.AreEqual(0.01294606613888552, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent"); Assert.AreEqual(909.43850395703532, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice"); Assert.AreEqual(0.16398924510717011, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol"); Assert.AreEqual(0.019300477588222311, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent"); Assert.AreEqual(610.01863646428569, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol"); Assert.AreEqual(0.01294606613888552, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent"); #endregion #region AP911 系统未设置Strike间隔,应使用100 tQuoteRequest = new TQuoteRequest() { underlyingCode = "AP911", maturityDate = new DateTime(2019, 7, 16), spotPrice = 8600 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price"); Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count"); Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike"); Assert.AreEqual(524.85087792247145, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice"); Assert.AreEqual(0.17352349778994552, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke"); Assert.AreEqual(0.061029171851450167, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent"); Assert.AreEqual(498.90324898752039, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice"); Assert.AreEqual(0.054514165017942422, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol"); Assert.AreEqual(0.0580120056962233, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent"); Assert.AreEqual(25.951100081224173, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice"); Assert.AreEqual(0.17352349778994552, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol"); Assert.AreEqual(0.0030175697768865316, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent"); Assert.AreEqual(3.5563656761788791, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol"); Assert.AreEqual(0.00041353089257893942, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent"); Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike"); Assert.AreEqual(359.51333952624168, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice"); Assert.AreEqual(0.16970980053784771, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke"); Assert.AreEqual(0.041803876689097873, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent"); Assert.AreEqual(305.98465068823054, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice"); Assert.AreEqual(0.0821231255492105, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol"); Assert.AreEqual(0.035579610545143088, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent"); Assert.AreEqual(60.173472821493313, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice"); Assert.AreEqual(0.16970980053784771, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol"); Assert.AreEqual(0.0069969154443596873, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent"); Assert.AreEqual(19.357376942186907, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol"); Assert.AreEqual(0.0022508577839752218, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent"); #endregion #endregion } [TestMethod] public void TQuoteV2Test() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); #region Normal Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); #region CU1910 采用系统中设置的200为strike间隔 var tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16) }; var result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price"); Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count"); Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(1323.8188434410963, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke"); Assert.AreEqual(0.028094627407493553, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent"); Assert.AreEqual(1113.8549476759197, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice"); Assert.AreEqual(0.0818819326542162, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol"); Assert.AreEqual(0.023638687344565357, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent"); Assert.AreEqual(326.00224868627646, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol"); Assert.AreEqual(0.0069185536648191095, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent"); Assert.AreEqual(116.0383529211035, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice"); Assert.AreEqual(0.0818819326542162, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol"); Assert.AreEqual(0.0024626136018909908, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent"); Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike"); Assert.AreEqual(1055.4409173448089, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice"); Assert.AreEqual(0.13005274476513867, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke"); Assert.AreEqual(0.022399000792546878, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent"); Assert.AreEqual(812.21812605787193, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice"); Assert.AreEqual(0.081854159592529716, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol"); Assert.AreEqual(0.017237226783910695, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent"); Assert.AreEqual(456.75096049191916, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice"); Assert.AreEqual(0.13005274476513867, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol"); Assert.AreEqual(0.0096933565469422573, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent"); Assert.AreEqual(213.52816920498219, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice"); Assert.AreEqual(0.081854159592529716, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol"); Assert.AreEqual(0.0045315825383060735, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent"); Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike"); Assert.AreEqual(820.295788822324, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke"); Assert.AreEqual(0.01740865426193387, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent"); Assert.AreEqual(559.61782699983837, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol"); Assert.AreEqual(0.01187643945245837, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent"); Assert.AreEqual(620.73246987136076, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol"); Assert.AreEqual(0.013173439513398997, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent"); Assert.AreEqual(360.05450804887511, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol"); Assert.AreEqual(0.0076412247039234953, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent"); Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike"); Assert.AreEqual(623.75969955305777, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke"); Assert.AreEqual(0.013237684625489342, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent"); Assert.AreEqual(361.95132597733681, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol"); Assert.AreEqual(0.0076814797533390662, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent"); Assert.AreEqual(823.32301850402462, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice"); Assert.AreEqual(0.12939535936615731, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol"); Assert.AreEqual(0.017472899374024291, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent"); Assert.AreEqual(561.51464492830371, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice"); Assert.AreEqual(0.081826386530843245, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol"); Assert.AreEqual(0.011916694501874018, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent"); Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike"); Assert.AreEqual(339.23353112420568, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke"); Assert.AreEqual(0.0071993533769992716, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent"); Assert.AreEqual(122.60154224895, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice"); Assert.AreEqual(0.081881932654216186, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol"); Assert.AreEqual(0.0026019003023970712, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent"); Assert.AreEqual(1337.05012587902, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice"); Assert.AreEqual(0.13071013016411998, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol"); Assert.AreEqual(0.0283754271196736, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent"); Assert.AreEqual(1120.4181370037679, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice"); Assert.AreEqual(0.081881932654216186, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol"); Assert.AreEqual(0.023777974045071475, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent"); #endregion #region CU1910 采用参数传递的100作为Strike间隔 tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16), strikeInterval = 100, strikeCount = 3 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2"); Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2"); Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(766.94209355431292, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2"); Assert.AreEqual(0.12923101301641202, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2"); Assert.AreEqual(0.016276360219743484, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2"); Assert.AreEqual(504.93702285546607, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2"); Assert.AreEqual(0.081819443265421635, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2"); Assert.AreEqual(0.010715980960430095, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2"); Assert.AreEqual(667.16043407883126, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2"); Assert.AreEqual(0.12923101301641202, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2"); Assert.AreEqual(0.014158752845476045, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2"); Assert.AreEqual(405.15536337998446, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2"); Assert.AreEqual(0.081819443265421635, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2"); Assert.AreEqual(0.0085983735861626578, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2"); Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike"); Assert.AreEqual(715.79433284572588, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice"); Assert.AreEqual(0.12906666666666669, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke"); Assert.AreEqual(0.015190881427116424, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent"); Assert.AreEqual(453.74263717851096, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice"); Assert.AreEqual(0.08181250000000001, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol"); Assert.AreEqual(0.00962951267356772, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent"); Assert.AreEqual(715.79433284572588, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice"); Assert.AreEqual(0.12906666666666669, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol"); Assert.AreEqual(0.015190881427116424, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent"); Assert.AreEqual(453.74263717851454, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice"); Assert.AreEqual(0.08181250000000001, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol"); Assert.AreEqual(0.0096295126735677951, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent"); #endregion #region AP911 系统未设置Strike间隔,应使用100 tQuoteRequest = new TQuoteRequest() { underlyingCode = "AP911", maturityDate = new DateTime(2019, 7, 16), spotPrice = 8600 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price"); Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count"); Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike"); Assert.AreEqual(609.80154469645686, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice"); Assert.AreEqual(0.3, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke"); Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent"); Assert.AreEqual(609.801544696456, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice"); Assert.AreEqual(0.3, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol"); Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent"); Assert.AreEqual(110.90176685520926, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice"); Assert.AreEqual(0.3, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol"); Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent"); Assert.AreEqual(110.90176685520926, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice"); Assert.AreEqual(0.3, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol"); Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent"); Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike"); Assert.AreEqual(472.58446045531184, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice"); Assert.AreEqual(0.3, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke"); Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent"); Assert.AreEqual(472.58446045531184, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice"); Assert.AreEqual(0.3, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol"); Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent"); Assert.AreEqual(173.24459375056367, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice"); Assert.AreEqual(0.3, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol"); Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent"); Assert.AreEqual(173.24459375056367, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice"); Assert.AreEqual(0.3, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol"); Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent"); #endregion #endregion #region SkewMap Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}"); #region CU1910 采用系统中设置的200为strike间隔 tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16) }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price"); Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count"); Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(1502.6575903670266, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice"); Assert.AreEqual(0.1674694930736175, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke"); Assert.AreEqual(0.031890016773493776, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent"); Assert.AreEqual(1210.8776103576965, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice"); Assert.AreEqual(0.10581671458278169, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol"); Assert.AreEqual(0.025697742155299162, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent"); Assert.AreEqual(504.84099561221052, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice"); Assert.AreEqual(0.1674694930736175, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol"); Assert.AreEqual(0.010713943030819408, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent"); Assert.AreEqual(231.33391923267263, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice"); Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol"); Assert.AreEqual(0.0049094634811687743, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent"); Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike"); Assert.AreEqual(1245.4771707744617, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice"); Assert.AreEqual(0.16607739179657319, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke"); Assert.AreEqual(0.026432028242242396, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent"); Assert.AreEqual(942.12908835003475, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice"); Assert.AreEqual(0.10806727953002154, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol"); Assert.AreEqual(0.019994250601656084, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent"); Assert.AreEqual(646.78721392157206, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice"); Assert.AreEqual(0.16607739179657319, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol"); Assert.AreEqual(0.013726383996637778, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent"); Assert.AreEqual(353.23967712691137, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice"); Assert.AreEqual(0.10999215915889668, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol"); Assert.AreEqual(0.0074965975621161156, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent"); Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike"); Assert.AreEqual(1014.6151321609087, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke"); Assert.AreEqual(0.021532579205452224, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent"); Assert.AreEqual(710.72991801994544, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice"); Assert.AreEqual(0.10945013204491073, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol"); Assert.AreEqual(0.015083402334888486, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent"); Assert.AreEqual(815.05181320994552, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol"); Assert.AreEqual(0.01729736445691735, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent"); Assert.AreEqual(514.14037483185348, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice"); Assert.AreEqual(0.10999215915889665, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol"); Assert.AreEqual(0.010911298277416246, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent"); Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike"); Assert.AreEqual(818.91359452952906, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke"); Assert.AreEqual(0.017379320766755711, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent"); Assert.AreEqual(516.70763413647092, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice"); Assert.AreEqual(0.10999215915889665, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol"); Assert.AreEqual(0.010965781709178075, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent"); Assert.AreEqual(1018.4769134804924, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice"); Assert.AreEqual(0.16468529342053853, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol"); Assert.AreEqual(0.021614535515290585, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent"); Assert.AreEqual(713.28431131438026, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice"); Assert.AreEqual(0.10945013204491073, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol"); Assert.AreEqual(0.015137612718896016, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent"); Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike"); Assert.AreEqual(522.821549821188, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice"); Assert.AreEqual(0.1674694930736175, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke"); Assert.AreEqual(0.011095533739838456, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent"); Assert.AreEqual(241.7972661396918, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice"); Assert.AreEqual(0.10999215915889668, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol"); Assert.AreEqual(0.00513152092826171, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent"); Assert.AreEqual(1520.6381445760005, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice"); Assert.AreEqual(0.16746949307361747, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol"); Assert.AreEqual(0.032271607482512746, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent"); Assert.AreEqual(1220.7727682449518, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice"); Assert.AreEqual(0.10581671458278175, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol"); Assert.AreEqual(0.025907741261565191, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent"); #endregion #region CU1910 采用参数传递的100作为Strike间隔 tQuoteRequest = new TQuoteRequest() { underlyingCode = "CU1910", maturityDate = new DateTime(2019, 7, 16), strikeInterval = 100, strikeCount = 3 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2"); Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2"); Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(961.16172642256765, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2"); Assert.AreEqual(0.16433726926385428, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2"); Assert.AreEqual(0.02039816906669286, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2"); Assert.AreEqual(659.063558942026, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2"); Assert.AreEqual(0.1097211456019037, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2"); Assert.AreEqual(0.013986917634593083, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2"); Assert.AreEqual(861.380066947086, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2"); Assert.AreEqual(0.16433726926385428, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2"); Assert.AreEqual(0.018280561692425423, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2"); Assert.AreEqual(560.78001074353426, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2"); Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2"); Assert.AreEqual(0.011901103793368725, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2"); Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike"); Assert.AreEqual(909.43850395703168, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice"); Assert.AreEqual(0.16398924510717011, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke"); Assert.AreEqual(0.019300477588222235, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent"); Assert.AreEqual(610.01863646428569, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol"); Assert.AreEqual(0.01294606613888552, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent"); Assert.AreEqual(909.43850395703532, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice"); Assert.AreEqual(0.16398924510717011, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol"); Assert.AreEqual(0.019300477588222311, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent"); Assert.AreEqual(610.01863646428569, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol"); Assert.AreEqual(0.01294606613888552, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent"); #endregion #region AP911 系统未设置Strike间隔,应使用100 tQuoteRequest = new TQuoteRequest() { underlyingCode = "AP911", maturityDate = new DateTime(2019, 7, 16), spotPrice = 8600 }; result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest); Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price"); Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count"); Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike"); Assert.AreEqual(524.85087792247145, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice"); Assert.AreEqual(0.17352349778994552, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke"); Assert.AreEqual(0.061029171851450167, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent"); Assert.AreEqual(498.90324898752039, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice"); Assert.AreEqual(0.054514165017942422, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol"); Assert.AreEqual(0.0580120056962233, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent"); Assert.AreEqual(25.951100081224173, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice"); Assert.AreEqual(0.17352349778994552, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol"); Assert.AreEqual(0.0030175697768865316, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent"); Assert.AreEqual(3.5563656761788791, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol"); Assert.AreEqual(0.00041353089257893942, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent"); Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike"); Assert.AreEqual(359.51333952624168, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice"); Assert.AreEqual(0.16970980053784771, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke"); Assert.AreEqual(0.041803876689097873, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent"); Assert.AreEqual(305.98465068823054, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice"); Assert.AreEqual(0.0821231255492105, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol"); Assert.AreEqual(0.035579610545143088, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent"); Assert.AreEqual(60.173472821493313, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice"); Assert.AreEqual(0.16970980053784771, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol"); Assert.AreEqual(0.0069969154443596873, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent"); Assert.AreEqual(19.357376942186907, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice"); Assert.AreEqual(0.10999215915889667, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol"); Assert.AreEqual(0.0022508577839752218, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent"); #endregion #endregion } /// /// 用户自定义波动率的T型报价测试 /// [TestMethod] public void TQuoteWithCustomizedVol() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); #region Normal Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); var tQuoteRequest = new TQuoteWithCustomizedVolRequest() { UnderlyingCode = "CU1910", MaturityDate = "2019-07-16", SpotPrice = 47120, Records = new List() { new TQuoteRecord() { Strike = 46120, CallAskVol = 0.13077323776205435, CallBidVol = 0.081913770241203956, PutAskVol = 0.13077323776205435, PutBidVol = 0.081913770241203956 }, new TQuoteRecord() { Strike = 46520, CallAskVol = 0.13011253524877023, CallBidVol = 0.081885976840221253, PutAskVol = 0.13011253524877023, PutBidVol = 0.081885976840221253 }, } }; var result = new TQuoteService(OptUserInfo.UnitTestUser).TQuoteWithCustomizedVol(tQuoteRequest); Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(1324.1156586629375, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice"); Assert.AreEqual(0.13077323776205435, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke"); Assert.AreEqual(0.028100926542082714, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent"); Assert.AreEqual(1113.9729435134141, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice"); Assert.AreEqual(0.081913770241203956, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol"); Assert.AreEqual(0.023641191500709126, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent"); Assert.AreEqual(326.29906390812664, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice"); Assert.AreEqual(0.13077323776205435, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol"); Assert.AreEqual(0.00692485279940846, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent"); Assert.AreEqual(116.15634875859961, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice"); Assert.AreEqual(0.081913770241203956, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol"); Assert.AreEqual(0.0024651177580347966, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent"); Assert.AreEqual(46520, result.quotaList[1].Strike, 1e-8, "CU1910 2 Strike"); Assert.AreEqual(1055.7525657923322, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice"); Assert.AreEqual(0.13011253524877023, result.quotaList[1].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke"); Assert.AreEqual(0.022405614723945932, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent"); Assert.AreEqual(812.3705295309245, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice"); Assert.AreEqual(0.081885976840221253, result.quotaList[1].CallBidVol, 1e-8, "CU1910 2 CallBidVol"); Assert.AreEqual(0.017240461153033203, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent"); Assert.AreEqual(457.0626089394425, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice"); Assert.AreEqual(0.13011253524877023, result.quotaList[1].PutAskVol, 1e-8, "CU1910 2 PutAskVol"); Assert.AreEqual(0.00969997047834131, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent"); Assert.AreEqual(213.68057267803292, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice"); Assert.AreEqual(0.081885976840221253, result.quotaList[1].PutBidVol, 1e-8, "CU1910 2 PutBidVol"); Assert.AreEqual(0.0045348169074285426, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent"); #endregion } [TestMethod] public void TQuoteWithCustomizedVolV2() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); var tQuoteRequest = new TQuoteWithCustomizedVolRequest() { UnderlyingCode = "CU1910", MaturityDate = "2019-07-16", SpotPrice = 47120, Records = new List() { new TQuoteRecord() { Strike = 46120, CallAskVol = 0.13077323776205435, CallBidVol = 0.081913770241203956, PutAskVol = 0.13077323776205435, PutBidVol = 0.081913770241203956 }, new TQuoteRecord() { Strike = 46520, CallAskVol = 0.13011253524877023, CallBidVol = 0.081885976840221253, PutAskVol = 0.13011253524877023, PutBidVol = 0.081885976840221253 }, } }; var result = new TQuoteService(OptUserInfo.UnitTestUser).TQuoteWithCustomizedVol(tQuoteRequest); Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike"); Assert.AreEqual(1324.1156586629375, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice"); Assert.AreEqual(0.13077323776205435, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke"); Assert.AreEqual(0.028100926542082714, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent"); Assert.AreEqual(1113.9729435134141, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice"); Assert.AreEqual(0.081913770241203956, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol"); Assert.AreEqual(0.023641191500709126, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent"); Assert.AreEqual(326.29906390812664, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice"); Assert.AreEqual(0.13077323776205435, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol"); Assert.AreEqual(0.00692485279940846, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent"); Assert.AreEqual(116.15634875859961, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice"); Assert.AreEqual(0.081913770241203956, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol"); Assert.AreEqual(0.0024651177580347966, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent"); Assert.AreEqual(46520, result.quotaList[1].Strike, 1e-8, "CU1910 2 Strike"); Assert.AreEqual(1055.7525657923322, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice"); Assert.AreEqual(0.13011253524877023, result.quotaList[1].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke"); Assert.AreEqual(0.022405614723945932, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent"); Assert.AreEqual(812.3705295309245, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice"); Assert.AreEqual(0.081885976840221253, result.quotaList[1].CallBidVol, 1e-8, "CU1910 2 CallBidVol"); Assert.AreEqual(0.017240461153033203, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent"); Assert.AreEqual(457.0626089394425, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice"); Assert.AreEqual(0.13011253524877023, result.quotaList[1].PutAskVol, 1e-8, "CU1910 2 PutAskVol"); Assert.AreEqual(0.00969997047834131, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent"); Assert.AreEqual(213.68057267803292, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice"); Assert.AreEqual(0.081885976840221253, result.quotaList[1].PutBidVol, 1e-8, "CU1910 2 PutBidVol"); Assert.AreEqual(0.0045348169074285426, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent"); } public class ClientOptionQuoteResult { public double BuyQuote { get; set; } public double BuyVol { get; set; } public double BuyPv { get; set; } public double BuyPercentageQuote { get; set; } public double SellQuote { get; set; } public double SellVol { get; set; } public double SellPv { get; set; } public double SellPercentageQuote { get; set; } public double SellMargin { get; set; } } public ClientOptionQuoteResult ValueOptionV2(OptionValueRequest req, string userGroup = null) { try { var valueDate = req.ValueDate ?? CalculatorHelper.RealtimeQuoteValueDate(); if (req.MaturityDate < valueDate) { throw new Exception("到期日小于估值日"); } var qdpMarketId = Guid.NewGuid().ToString(); var marketProxy = QdpMarketManager.Instance.GetPrebuiltMarketProxy(qdpMarketId); volatility bidVol = null, askVol = null; underlying_manager underlying = null; Variety variety = null; using (var db = new YLContext()) { underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(req.UnderlyingCode); if (underlying != null) { underlying.QuotationDate = valueDate; if (PS.Config.ErpElement.SkewMapVolConstruction) { bidVol = askVol = VolatilityHelper.GetVol(valueDate.Date, "交易", underlying.UnderlyingCode, userGroup ?? ""); } else { bidVol = VolatilityHelper.GetVol(valueDate.Date, "报价Bid", underlying.UnderlyingCode, userGroup ?? ""); askVol = VolatilityHelper.GetVol(valueDate.Date, "报价Ask", underlying.UnderlyingCode, userGroup ?? ""); } variety = db.variety.FirstOrDefault(x => x.VarietyCode != null && x.id == underlying.UnderlyingTypeId); } } if (underlying != null && bidVol != null && askVol != null) { //var maturityDate = req.MaturityDate.ToString("yyyy-MM-dd"); //根据用户设置的bid/ask天数调整规则来分别调整到期日 //TODO: bidMaturityShift和askMaturityShift应该从某数据库表读取 var bidMaturityShift = 0; var askMaturityShift = 0; var otherInfo = ""; var client_param = ClientPricingParamService.GetPricingParam(valueDate.Date, req.MaturityDate.Date); if (client_param != null) { askMaturityShift = client_param.ask_tuning_day ?? 0; bidMaturityShift = client_param.bid_tuning_day ?? 0; otherInfo = client_param.ToJson();//$"ask到期日偏离{askMaturityShift}天,bid到期日偏离{bidMaturityShift}天"; } var dayCount = CalculatorHelper.GetTradeDayCount(); var bidMaturityDate = QdpCalendarHelper.ShiftDate(req.MaturityDate, dayCount, bidMaturityShift).DateTime; var askMaturityDate = QdpCalendarHelper.ShiftDate(req.MaturityDate, dayCount, askMaturityShift).DateTime; //使用全局的DiscountCurve以提高计算效率 var discountCurveName = Guid.NewGuid().ToString(); var discountCurve = CalculatorHelper.CreateConstantRiskFreeCurve(discountCurveName, valuedateBLL.RiskFreeRate / 100.0); marketProxy.AddYieldCurve(discountCurveName, valueDate.ToString("yyyy-MM-dd"), discountCurve); var volSurfaceName = underlying.GenerateVolSurfaceName(); var parameter = new VanillaOptionParameter() { ValueDate = valueDate, SpotPrices = new Dictionary() { { req.UnderlyingCode, req.SpotPrice } }, DiscountCurveName = discountCurveName, HasNightMarket = variety.HasNightMarket, PreciseTimeMode = req.preciseTimeMode }; var trade = new trade() { TradeType = "香草期权", TradeDate = valueDate, MaturityDate = bidMaturityDate, ExerciseDate = bidMaturityDate, OptionType = req.OptionType, ExerciseMode = req.Exercise, BuySell = "Buy", Strike = req.Strike, Notional = req.Notional }; parameter.Volatility = VolatilityHelper.GetInterpolatedVol( volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal, volSurface: bidVol, valueDate: valueDate, underlyingCode: req.UnderlyingCode, exerciseDate: bidMaturityDate, strike: req.Strike, isBuy: true, isCall: req.OptionType == "Call", spotPrice: req.SpotPrice, isMoneynessOption: false); var bidResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter); trade.MaturityDate = askMaturityDate; trade.ExerciseDate = askMaturityDate; parameter.Volatility = VolatilityHelper.GetInterpolatedVol( volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal, volSurface: askVol, valueDate: valueDate, underlyingCode: req.UnderlyingCode, exerciseDate: askMaturityDate, strike: req.Strike, isBuy: false, isCall: req.OptionType == "Call", spotPrice: req.SpotPrice, isMoneynessOption: false); var askResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter); var valueResult = new ClientOptionQuoteResult() { BuyQuote = Math.Abs(bidResult.Pv) / req.Notional, BuyVol = bidResult.Vol, BuyPv = Math.Abs(bidResult.Pv), BuyPercentageQuote = Math.Abs(bidResult.Pv) / req.Notional / req.SpotPrice, SellQuote = Math.Abs(askResult.Pv) / req.Notional, SellVol = askResult.Vol, SellPv = Math.Abs(askResult.Pv), SellPercentageQuote = Math.Abs(askResult.Pv) / req.Notional / req.SpotPrice, SellMargin = OptionCalculatorV1.CommodityFutureOptionMargin( Math.Abs(askResult.Pv), req.Notional, req.Strike, req.SpotPrice, variety.Margin ?? 0.0, //避免品种预付金未设置而导致计算出错 req.OptionType) }; QdpMarketManager.Instance.RemovePrebuiltMarketProxy(qdpMarketId); return valueResult; } else { LogFactory.GetLogger().Error($"ValueOptionV2: 未找到标的{req.UnderlyingCode}或其波动率为空!"); return null; } } catch (Exception ex) { LogFactory.GetLogger().Error("ValueOptionV2", ex); return null; } } public class OptionValueRequest { public DateTime? ValueDate { get; set; } public string UnderlyingCode { get; set; } public DateTime MaturityDate { get; set; } public string UnderlyingInstrumentType { get; set; } public double Strike { get; set; } public string OptionType { get; set; } public string Exercise { get; set; } public double SpotPrice { get; set; } public double Notional { get; set; } public double RiskFreeRate { get; set; } public double Vol { get; set; } public bool preciseTimeMode { get; set; } = true; } [TestMethod] public void ValueOptionTestV2() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); #region Normal Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); var valueRequest = new OptionValueRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, OptionType = "Call", Exercise = "European", SpotPrice = 47120, Notional = 2 }; var result = ValueOptionV2(valueRequest); Assert.AreEqual(0.081854159592529716, result.BuyVol, 1e-8, "Call BuyVol"); Assert.AreEqual(1624.4362521157439, result.BuyPv, 1e-8, "Call BuyPv"); Assert.AreEqual(812.21812605787193, result.BuyQuote, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.017237226783910695, result.BuyPercentageQuote, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.13005274476513867, result.SellVol, 1e-8, "Call SellVol"); Assert.AreEqual(2110.8818346896178, result.SellPv, 1e-8, "Call SellPv"); Assert.AreEqual(1055.4409173448089, result.SellQuote, 1e-8, "Call SellQuote"); Assert.AreEqual(0.022399000792546878, result.SellPercentageQuote, 1e-8, "Call SellPercentageQuote"); Assert.AreEqual(11534.881834689619, result.SellMargin, 1e-8, "Call SellMargin"); valueRequest = new OptionValueRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, OptionType = "Put", Exercise = "European", SpotPrice = 47120, Notional = 2 }; result = ValueOptionV2(valueRequest); Assert.AreEqual(0.081854159592529716, result.BuyVol, 1e-8, "Put BuyVol"); Assert.AreEqual(427.05633840996438, result.BuyPv, 1e-8, "Put BuyPv"); Assert.AreEqual(213.52816920498219, result.BuyQuote, 1e-8, "Put BuyQuote"); Assert.AreEqual(0.0045315825383060735, result.BuyPercentageQuote, 1e-8, "Put BuyQuote"); Assert.AreEqual(0.13005274476513867, result.SellVol, 1e-8, "Put SellVol"); Assert.AreEqual(913.50192098383832, result.SellPv, 1e-8, "Put SellPv"); Assert.AreEqual(456.75096049191916, result.SellQuote, 1e-8, "Put SellQuote"); Assert.AreEqual(0.0096933565469422573, result.SellPercentageQuote, 1e-8, "Put SellPercentageQuote"); Assert.AreEqual(9737.50192098384, result.SellMargin, 1e-8, "Put SellMargin"); #endregion #region SkewMap Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}"); valueRequest = new OptionValueRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, OptionType = "Call", Exercise = "European", SpotPrice = 47120, Notional = 2 }; result = ValueOptionV2(valueRequest); Assert.AreEqual(0.10806727953002154, result.BuyVol, 1e-8, "Call BuyVol"); Assert.AreEqual(1884.2581767000695, result.BuyPv, 1e-8, "Call BuyPv"); Assert.AreEqual(942.12908835003475, result.BuyQuote, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.019994250601656084, result.BuyPercentageQuote, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.16607739179657319, result.SellVol, 1e-8, "Call SellVol"); Assert.AreEqual(2490.9543415489234, result.SellPv, 1e-8, "Call SellPv"); Assert.AreEqual(1245.4771707744617, result.SellQuote, 1e-8, "Call SellQuote"); Assert.AreEqual(0.026432028242242396, result.SellPercentageQuote, 1e-8, "Call SellPercentageQuote"); Assert.AreEqual(11914.954341548924, result.SellMargin, 1e-8, "Call SellMargin"); valueRequest = new OptionValueRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, OptionType = "Put", Exercise = "European", SpotPrice = 47120, Notional = 2 }; result = ValueOptionV2(valueRequest); Assert.AreEqual(0.10999215915889668, result.BuyVol, 1e-8, "Put BuyVol"); Assert.AreEqual(706.47935425382275, result.BuyPv, 1e-8, "Put BuyPv"); Assert.AreEqual(353.23967712691137, result.BuyQuote, 1e-8, "Put BuyQuote"); Assert.AreEqual(0.0074965975621161156, result.BuyPercentageQuote, 1e-8, "Put BuyQuote"); Assert.AreEqual(0.16607739179657319, result.SellVol, 1e-8, "Put SellVol"); Assert.AreEqual(1293.5744278431441, result.SellPv, 1e-8, "Put SellPv"); Assert.AreEqual(646.78721392157206, result.SellQuote, 1e-8, "Put SellQuote"); Assert.AreEqual(0.013726383996637778, result.SellPercentageQuote, 1e-8, "Put SellPercentageQuote"); Assert.AreEqual(10117.574427843145, result.SellMargin, 1e-8, "Put SellMargin"); #endregion } public class CustomizedQuoteResult { public double CallAskPrice { get; set; } public double CallBidPrice { get; set; } public double Strike { get; set; } public double PutAskPrice { get; set; } public double PutBidPrice { get; set; } public double BidVol { get; set; } public double AskVol { get; set; } public double LatestPrice { get; set; } public double Change { get; set; } public double ChangePercent { get; set; } public double RiskFreeRate { get; set; } } public CustomizedQuoteResult CustomizedQuoteV2(CustomizedQuoteRequest request, string userGroup = "") { try { if (request.MaturityDate < request.ValueDate) { throw new Exception("到期日小于估值日"); } var qdpMarketId = Guid.NewGuid().ToString(); var marketProxy = QdpMarketManager.Instance.GetPrebuiltMarketProxy(qdpMarketId); var valueDate = request.ValueDate; var maturityDate = request.MaturityDate; volatility bidVol = null, askVol = null; underlying_manager underlying = null; Variety variety = null; using (var db = new YLContext()) { underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(request.UnderlyingCode); if (underlying != null) { variety = db.variety.FirstOrDefault(x => x.VarietyCode != null && x.id == underlying.UnderlyingTypeId); if (request.BidVol <= 0 && request.AskVol <= 0) { underlying.QuotationDate = request.ValueDate; if (PS.Config.ErpElement.SkewMapVolConstruction) { bidVol = askVol = VolatilityHelper.GetVol(DateTime.Today, "交易", underlying.UnderlyingCode, userGroup ?? ""); } else { bidVol = VolatilityHelper.GetVol(DateTime.Today, "报价Bid", underlying.UnderlyingCode, userGroup ?? ""); askVol = VolatilityHelper.GetVol(DateTime.Today, "报价Ask", underlying.UnderlyingCode, userGroup ?? ""); } } } } //如果用户未指定标的,构造一个虚拟标的 if (string.IsNullOrWhiteSpace(request.UnderlyingCode)) { underlying = new underlying_manager() { UnderlyingCode = "dummy_code", UnderlyingInstrumentType = "CommodityFutures", QuotationDate = request.ValueDate, Price = request.SpotPrice, PrevClosePrice = request.SpotPrice, MaturityDate = request.MaturityDate }; } //根据用户设置的bid/ask天数调整规则来分别调整到期日 //TODO: bidMaturityShift和askMaturityShift应该从某数据库表读取 var bidMaturityShift = 0; var askMaturityShift = 0; var otherInfo = ""; var client_param = ClientPricingParamService.GetPricingParam(request.ValueDate.Date, request.MaturityDate.Date); if (client_param != null) { askMaturityShift = client_param.ask_tuning_day ?? 0; bidMaturityShift = client_param.bid_tuning_day ?? 0; otherInfo = client_param.ToJson();//$"ask到期日偏离{askMaturityShift}天,bid到期日偏离{bidMaturityShift}天"; } var dayCount = CalculatorHelper.GetTradeDayCount(); var bidMaturityDate = QdpCalendarHelper.ShiftDate(maturityDate, dayCount, bidMaturityShift).DateTime; var askMaturityDate = QdpCalendarHelper.ShiftDate(maturityDate, dayCount, askMaturityShift).DateTime; if (underlying != null) { // 如果未传入最新价格,则使用系统里的最新价格; 如果未传入无风险利率,则使用系统里的无风险利率 var spotPrice = (request.SpotPrice <= 0) ? (underlying.Price ?? 0) : request.SpotPrice; var riskFreeRate = (request.RiskFreeRate <= 0) ? (valuedateBLL.RiskFreeRate / 100.0) : request.RiskFreeRate; var strike = (request.Strike <= 0) ? spotPrice : request.Strike; //使用全局的DiscountCurve以提高计算效率 var discountCurveName = Guid.NewGuid().ToString(); var discountCurve = CalculatorHelper.CreateConstantRiskFreeCurve(discountCurveName, riskFreeRate); marketProxy.AddYieldCurve(discountCurveName, valueDate, discountCurve); var trade = new trade() { TradeType = "香草期权", TradeDate = request.ValueDate, ExerciseMode = request.Exercise, Strike = strike, Notional = request.Notional }; var parameter = new VanillaOptionParameter() { ValueDate = request.ValueDate, DiscountCurveName = discountCurveName, SpotPrices = new Dictionary() { { underlying.UnderlyingCode, spotPrice } }, HasNightMarket = variety.HasNightMarket, PreciseTimeMode = request.preciseTimeMode }; trade.OptionType = "看涨"; trade.MaturityDate = bidMaturityDate; trade.ExerciseDate = bidMaturityDate; parameter.Volatility = bidVol == null ? request.BidVol : VolatilityHelper.GetInterpolatedVol( volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal, volSurface: bidVol, valueDate: valueDate, underlyingCode: underlying.UnderlyingCode, exerciseDate: bidMaturityDate, strike: strike, isBuy: true, isCall: true, spotPrice: spotPrice, isMoneynessOption: false); var callBidResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter); trade.OptionType = "看跌"; parameter.Volatility = bidVol == null ? request.BidVol : VolatilityHelper.GetInterpolatedVol( volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal, volSurface: bidVol, valueDate: valueDate, underlyingCode: underlying.UnderlyingCode, exerciseDate: bidMaturityDate, strike: strike, isBuy: true, isCall: false, spotPrice: spotPrice, isMoneynessOption: false); var putBidResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter); trade.OptionType = "看涨"; trade.MaturityDate = askMaturityDate; trade.ExerciseDate = askMaturityDate; parameter.Volatility = askVol == null ? request.AskVol : VolatilityHelper.GetInterpolatedVol( volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal, volSurface: askVol, valueDate: valueDate, underlyingCode: underlying.UnderlyingCode, exerciseDate: askMaturityDate, strike: strike, isBuy: false, isCall: true, spotPrice: spotPrice, isMoneynessOption: false); var callAskResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter); trade.OptionType = "看跌"; parameter.Volatility = askVol == null ? request.AskVol : VolatilityHelper.GetInterpolatedVol( volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal, volSurface: askVol, valueDate: valueDate, underlyingCode: underlying.UnderlyingCode, exerciseDate: askMaturityDate, strike: strike, isBuy: false, isCall: false, spotPrice: spotPrice, isMoneynessOption: false); var putAskResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter); var valueResult = new CustomizedQuoteResult { CallAskPrice = callAskResult.Pv / request.Notional, CallBidPrice = callBidResult.Pv / request.Notional, Strike = strike, PutAskPrice = putAskResult.Pv / request.Notional, PutBidPrice = putBidResult.Pv / request.Notional, BidVol = callBidResult.Vol, AskVol = callAskResult.Vol, RiskFreeRate = riskFreeRate, LatestPrice = underlying.Price.Value }; if (underlying.PrevClosePrice.HasValue && underlying.PrevClosePrice.Value > 0.0) { valueResult.Change = underlying.Price.Value - underlying.PrevClosePrice.Value; valueResult.ChangePercent = valueResult.Change / underlying.PrevClosePrice.Value; } else { valueResult.Change = 0.0; valueResult.ChangePercent = 0.0; } QdpMarketManager.Instance.RemovePrebuiltMarketProxy(qdpMarketId); return valueResult; } else { return null; } } catch (Exception) { return null; } } public class CustomizedQuoteRequest { public DateTime ValueDate { get; set; } public string UnderlyingCode { get; set; } public DateTime MaturityDate { get; set; } public string UnderlyingInstrumentType { get; set; } public double Strike { get; set; } public string Exercise { get; set; } public double SpotPrice { get; set; } public double Notional { get; set; } public double RiskFreeRate { get; set; } public double BidVol { get; set; } public double AskVol { get; set; } public bool preciseTimeMode { get; set; } = true; } [TestMethod] public void CustomizedQuoteTestV2() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); #region Normal Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); var request = new CustomizedQuoteRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, Exercise = "European", SpotPrice = 47120, Notional = 2 }; var result = CustomizedQuoteV2(request); Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.081854159592529716, result.BidVol, 1e-8, "Call BuyVol"); Assert.AreEqual(812.21812605787193, result.CallBidPrice, 1e-8, "Call BuyPv"); Assert.AreEqual(1055.4409173448089, result.CallAskPrice, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.13005274476513867, result.AskVol, 1e-8, "Call SellQuote"); Assert.AreEqual(213.52816920498219, result.PutBidPrice, 1e-8, "Call SellVol"); Assert.AreEqual(456.75096049191916, result.PutAskPrice, 1e-8, "Call SellPv"); request = new CustomizedQuoteRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, Exercise = "European", SpotPrice = 47120, Notional = 2, BidVol = 0.123, AskVol = 0.246 }; result = CustomizedQuoteV2(request); Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.123, result.BidVol, 1e-8, "Call BuyVol"); Assert.AreEqual(1018.7969661161158, result.CallBidPrice, 1e-8, "Call BuyPv"); Assert.AreEqual(1675.7118430710132, result.CallAskPrice, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.246, result.AskVol, 1e-8, "Call SellQuote"); Assert.AreEqual(420.107009263226, result.PutBidPrice, 1e-8, "Call SellVol"); Assert.AreEqual(1077.0218862181234, result.PutAskPrice, 1e-8, "Call SellPv"); #endregion #region SkewMap Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}"); request = new CustomizedQuoteRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, Exercise = "European", SpotPrice = 47120, Notional = 2 }; result = CustomizedQuoteV2(request); Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.10806727953002154, result.BidVol, 1e-8, "Call BuyVol"); Assert.AreEqual(942.12908835003475, result.CallBidPrice, 1e-8, "Call BuyPv"); Assert.AreEqual(1245.4771707744617, result.CallAskPrice, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.16607739179657319, result.AskVol, 1e-8, "Call SellQuote"); Assert.AreEqual(353.23967712691137, result.PutBidPrice, 1e-8, "Call SellVol"); Assert.AreEqual(646.78721392157206, result.PutAskPrice, 1e-8, "Call SellPv"); request = new CustomizedQuoteRequest() { ValueDate = new DateTime(2019, 6, 17), UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), UnderlyingInstrumentType = "CommodityFutures", Strike = 46520, Exercise = "European", SpotPrice = 47120, Notional = 2, BidVol = 0.123, AskVol = 0.246 }; result = CustomizedQuoteV2(request); Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.123, result.BidVol, 1e-8, "Call BuyVol"); Assert.AreEqual(1018.7969661161158, result.CallBidPrice, 1e-8, "Call BuyPv"); Assert.AreEqual(1675.7118430710132, result.CallAskPrice, 1e-8, "Call BuyQuote"); Assert.AreEqual(0.246, result.AskVol, 1e-8, "Call SellQuote"); Assert.AreEqual(420.107009263226, result.PutBidPrice, 1e-8, "Call SellVol"); Assert.AreEqual(1077.0218862181234, result.PutAskPrice, 1e-8, "Call SellPv"); #endregion } /// /// 在期权定价时调整定价日 /// private DateTime AdjustQuotationDate(DateTime quotationDate, string tradeType) { // 对凤凰雪球不做报价日调整 if (tradeType == "雪球期权" || tradeType == "凤凰期权") { return quotationDate; } //为了暂时修复一个QDP计算方式与客户需求不匹配的情况 //在非精确模式下,QDP不包括交易日当天的时间价值,但根据报价需求,需要将交易日当天的时间价值计算在内, //所以要将交易日向前移动一天。未来QDP支持传递TTM来计算时,可以直接在TTM上加1,而不用移动交易日 //注意:当前这个临时修改必须在波动率插值之前调用,这样才能正确设置波动率日期 var calendar = CalendarImpl.Get("chn"); return calendar.PrevBizDay(quotationDate).DateTime; } [TestMethod] public void GetOptionCalculatorTestV2() { //等待数据初始化,等法见改进数据加载后可去掉 Thread.Sleep(3000); var userInfo = OptUserInfo.UnitTestUser; var calcParam = new OptionCalcParams { IsCalcGreeks = true, EngineName = null, UserId = "0" }; var underlying = new underlying_manager() { UnderlyingCode = "RB1909", UnderlyingInstrumentType = "CommodityFutures", MaturityDate = new DateTime(2019, 7, 16), QuotationDate = new DateTime(2019, 6, 17), Price = 2900.0 }; #region Normal Vol Mode #region 香草期权 PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}"); var tradeId = Guid.NewGuid().ToString(); var vtParam = new VanillaOptionTradeParam { annualizedFactor = 0, isAnnualized = false, buysell = "买入", preciseTimeMode = false, dividendRate = 0, dividends = null, endDate = new DateTime(2019, 7, 16), exerciseDate = new DateTime(2019, 7, 16), exerciseType = "European", hasNightMarket = false, initialSpotPrice = 2900.0, isForwardTrade = false, isMoneynessOption = false, notional = 20, optionType = OptionType.Call, participationRate = 1, principalRate = 0, riskFreeRate = 0.035, settlementDate = new DateTime(2019, 7, 16), startDate = new DateTime(2019, 6, 17), strike = 2950, timeToMaturityDays = double.NaN, tradeDate = new DateTime(2019, 6, 17), tradeId = tradeId, underlyingInstrumentType = "CommodityFutures", underlyingTickers = new[] { "RB1909" }, volSurfaceNames = new[] { tradeId } }; var result = new TradeValueResult[5]; var quotDate = AdjustQuotationDate(vtParam.tradeDate, vtParam.tradeType); using (var marketProxy = new MarketProxy(quotDate, vtParam.riskFreeRate)) { var volatility = QdpVolHelper.GetDefaultVolatility(0.3); marketProxy.SetVolSurface(vtParam.tradeId, volatility); var vcParam = new OptionCalcParam(vtParam) { pricingRequest = QdpPricingRequest.BASIC_GREEKS, spotPrices = new[] { vtParam.initialSpotPrice }, engineName = null }; result[0] = TradeRiskCalcUtil.GetVanillaOptionValue(marketProxy, vcParam); vtParam.optionType = OptionType.Put; result[1] = TradeRiskCalcUtil.GetVanillaOptionValue(marketProxy, vcParam); } Assert.IsTrue(result[0] != null && result[1] != null); Assert.AreEqual(0.3, result[0].Vol, 1e-8, ""); Assert.AreEqual(1634.1684722973448, result[0].Pv, 1e-8, ""); Assert.AreEqual(8.82155311051065, result[0].Delta, 1e-4, ""); Assert.AreEqual(0.030129099286568817, result[0].Gamma, 1e-5, ""); Assert.AreEqual(68.538687287491484, result[0].Vega, 1e-5, ""); Assert.AreEqual(-47.02780051542436, result[0].Theta, 1e-5, ""); Assert.AreEqual(-0.014733641666248331, result[0].Rho, 1e-5, ""); //Assert.AreEqual(0.3, result[1].Vol, 1e-8, ""); Assert.AreEqual(2631.017708698957, result[1].Pv, 1e-8, ""); Assert.AreEqual(-11.1154316174634, result[1].Delta, 1e-4, ""); Assert.AreEqual(0.030129149308777414, result[1].Gamma, 1e-5, ""); Assert.AreEqual(68.538687287718858, result[1].Vega, 1e-5, ""); Assert.AreEqual(-46.884799590299735, result[1].Theta, 1e-5, ""); Assert.AreEqual(-0.023721221400774085, result[1].Rho, 1e-5, ""); #endregion #region 亚式期权 var trade = new trade() { TradeType = "亚式期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 2950.0, SpotPrice = 2900.0, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy", TradeOpenVolatility = 0.3, trade_asian_option = new trade_asian_option() { PayoffType = "ArithmeticAverage", StrikeType = "Fixed", AveragingPeriodStartDate = new DateTime(2019, 6, 17) } }; calcParam.QuotationType = "波动率调整"; calcParam.BidVol = 0.30; calcParam.AskVol = 0.35; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.Pricing).ToArray(); Assert.AreEqual(2, result.Length, ""); Assert.AreEqual(0.3, result[0].Vol, 1e-8, ""); Assert.AreEqual(827.56511017840455, result[0].Pv, 1e-8, ""); Assert.AreEqual(7.7136697062655912, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.048432627863803646, result[0].Gamma, 1e-8, ""); Assert.AreEqual(40.109226554295674, result[0].Vega, 1e-8, ""); Assert.AreEqual(-77.2550826512495, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.0074613162568880394, result[0].Rho, 1e-8, ""); Assert.AreEqual(827.56511017840455, result[0].TradePriceBid, 1e-8, ""); Assert.AreEqual(827.6, result[0].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(1029.5537801997957, result[0].TradePriceAsk, 1e-8, ""); Assert.AreEqual(1029.6, result[0].RoundedTradePriceAsk, 1e-8, ""); Assert.AreEqual(1824.4143465800216, result[1].Pv, 1e-8, ""); Assert.AreEqual(-12.223315023152281, result[1].Delta, 1e-8, ""); Assert.AreEqual(0.048432484618388116, result[1].Gamma, 1e-8, ""); Assert.AreEqual(40.109226554511679, result[1].Vega, 1e-8, ""); Assert.AreEqual(-77.112081726129481, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.016448895991425162, result[1].Rho, 1e-8, ""); Assert.AreEqual(1824.4143465800216, result[1].TradePriceBid, 1e-8, ""); Assert.AreEqual(1824.4, result[1].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(2026.4030166014081, result[1].TradePriceAsk, 1e-8, ""); Assert.AreEqual(2026.4, result[1].RoundedTradePriceAsk, 1e-8, ""); #endregion #region 障碍期权 trade = new trade() { TradeType = "障碍期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 2950.0, SpotPrice = 2900.0, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy", TradeOpenVolatility = 0.3, trade_barrier_option = new trade_barrier_option() { BarrierType = "上升敲出", BarrierPrice = 3000.0, BarrierShift = 20, Discrete = "离散", Rebate = 20.0, KnockInOutStatus = "Monitoring" } }; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray(); Assert.AreEqual(2, result.Length, ""); Assert.AreEqual(0.3, result[0].Vol, 1e-8, ""); Assert.AreEqual(239.48055669661045, result[0].Pv, 1e-8, ""); Assert.AreEqual(0.9664803751263662, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.0014877446119498927, result[0].Gamma, 1e-8, ""); Assert.AreEqual(2.9460320661684136, result[0].Vega, 1e-8, ""); Assert.AreEqual(-2.3536033746325984, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.00016961721587449574, result[0].Rho, 1e-8, ""); Assert.AreEqual(239.48055669661045, result[0].TradePriceBid, 1e-8, ""); Assert.AreEqual(239.4, result[0].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(252.59384629234816, result[0].TradePriceAsk, 1e-8, ""); Assert.AreEqual(252.6, result[0].RoundedTradePriceAsk, 1e-8, ""); Assert.AreEqual(2377.5015214798786, result[1].Pv, 1e-8, ""); Assert.AreEqual(-13.55024409649559, result[1].Delta, 1e-8, ""); Assert.AreEqual(0.012942437024321407, result[1].Gamma, 1e-8, ""); Assert.AreEqual(35.624956503443173, result[1].Vega, 1e-8, ""); Assert.AreEqual(-20.374879840752783, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.019445986393657223, result[1].Rho, 1e-8, ""); Assert.AreEqual(2377.5015214798786, result[1].TradePriceBid, 1e-8, ""); Assert.AreEqual(2377.6, result[1].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(2545.7364831269824, result[1].TradePriceAsk, 1e-8, ""); Assert.AreEqual(2545.8, result[1].RoundedTradePriceAsk, 1e-8, ""); #endregion #region 二元期权 trade = new trade() { TradeType = "二元期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 2950.0, SpotPrice = 2900.0, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy", TradeOpenVolatility = 0.3, trade_binary_option = new trade_binary_option() { PayoffType = "CashOrNothing", CashOrNothingAmount = 200, RebateType = "AtHit" } }; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray(); Assert.AreEqual(2, result.Length, ""); Assert.AreEqual(0.3, result[0].Vol, 1e-8, ""); Assert.AreEqual(1623.5863508863104, result[0].Pv, 1e-8, ""); Assert.AreEqual(5.9236973067754661, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.0032816706152516417, result[0].Gamma, 1e-8, ""); Assert.AreEqual(7.4653126550401794, result[0].Vega, 1e-8, ""); Assert.AreEqual(-5.0737698819882553, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.014638233397386102, result[0].Rho, 1e-8, ""); Assert.AreEqual(1623.5863508863104, result[0].TradePriceBid, 1e-8, ""); Assert.AreEqual(1623.6, result[0].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(1653.9889811223582, result[0].TradePriceAsk, 1e-8, ""); Assert.AreEqual(1654, result[0].RoundedTradePriceAsk, 1e-8, ""); Assert.AreEqual(2363.8105947201393, result[1].Pv, 1e-8, ""); Assert.AreEqual(-5.9236973067527288, result[1].Delta, 1e-8, ""); Assert.AreEqual(-0.0032816751627251506, result[1].Gamma, 1e-8, ""); Assert.AreEqual(-7.4653126550401794, result[1].Vega, 1e-8, ""); Assert.AreEqual(5.6457735824865267, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.021312085540694171, result[1].Rho, 1e-8, ""); Assert.AreEqual(2363.8105947201393, result[1].TradePriceBid, 1e-8, ""); Assert.AreEqual(2363.8, result[1].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(2333.4079644840913, result[1].TradePriceAsk, 1e-8, ""); Assert.AreEqual(2333.4, result[1].RoundedTradePriceAsk, 1e-8, ""); #endregion #region 合成价差期权 calcParam.QuotationType = "价格调整"; calcParam.BidVol = null; calcParam.AskVol = null; trade = new trade() { TradeType = "合成价差期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 18, SpotPrice = 16, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy", TradeOpenVolatility = 30 }; underlying.Price = 16; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray(); Assert.AreEqual(2, result.Length, ""); Assert.AreEqual(30, result[0].Vol, 1e-8, ""); Assert.AreEqual(53.470199810079578, result[0].Pv, 1e-8, ""); Assert.AreEqual(8.2213181785292022, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.86144587200465139, result[0].Gamma, 1e-8, ""); Assert.AreEqual(0.0233014070001758, result[0].Vega, 1e-8, ""); Assert.AreEqual(-1.5988365822235835, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.00048208662520323744, result[0].Rho, 1e-8, ""); Assert.AreEqual(93.344169266144078, result[1].Pv, 1e-8, ""); Assert.AreEqual(-11.715666549507375, result[1].Delta, 1e-8, ""); Assert.AreEqual(0.86144587129410866, result[1].Gamma, 1e-8, ""); Assert.AreEqual(0.023301406999820529, result[1].Vega, 1e-8, ""); Assert.AreEqual(-1.5931165452185923, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.00084158981458415383, result[1].Rho, 1e-8, ""); #endregion #region 彩虹期权 //trade = new trade() //{ // TradeType = "彩虹期权", // UnderlyingInstrumentType = "CommodityFutures", // TradeDate = new DateTime(2019, 6, 17), // StartDate = new DateTime(2019, 6, 17), // MaturityDate = new DateTime(2019, 7, 16), // ExerciseDate = new DateTime(2019, 7, 16), // OptionType = "看涨", // ExerciseMode = "European", // Strike = 2950, // SpotPrice = 2900, // Notional = 20, // NoRiskRate = 0.035, // BuySell = "Buy", // QuotationType = "波动率调整", // BidVol = 0.30, // AskVol = 0.35, // trade_rainbow_option = new trade_rainbow_option() // { // RainbowType = "BestOfAssetsOrCash", // CashAmount = 150.0, // UnderlyingAssetCode = "RB1910", // UnderlyingAssetCode2 = "RB1912", // Strike2 = 2970.0, // Vol2 = 0.25, // SpotPrice1 = 2900, // SpotPrice2 = 2850, // CorRelation = 0.85 // } //}; //underlying.Price = 2900; //result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam).ToList(); //Assert.AreEqual(2, result.Count, ""); //Assert.AreEqual(3029.6196742715465, result[0].Pv, 1e-8, ""); //Assert.AreEqual(0.37022875631009811, result[0].Delta, 1e-8, ""); //Assert.AreEqual(0.0018189894035458565, result[0].Gamma, 1e-8, ""); //Assert.AreEqual(3.0355839711528461, result[0].Vega, 1e-8, ""); //Assert.AreEqual(0, result[0].Theta, 1e-8, ""); //Assert.AreEqual(-0.027316119817896833, result[0].Rho, 1e-8, ""); //Assert.AreEqual(3029.6196742715465, result[1].Pv, 1e-8, ""); //Assert.AreEqual(0.37022875631009811, result[1].Delta, 1e-8, ""); //Assert.AreEqual(0.0018189894035458565, result[1].Gamma, 1e-8, ""); //Assert.AreEqual(3.0355839711528461, result[1].Vega, 1e-8, ""); //Assert.AreEqual(0, result[1].Theta, 1e-8, ""); //Assert.AreEqual(-0.027316119817896833, result[1].Rho, 1e-8, ""); #endregion #endregion #region SkewMap Vol Mode PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}"); underlying.Price = 2900; calcParam.QuotationType = "波动率调整"; calcParam.BidVol = 0.30; calcParam.AskVol = 0.35; trade = new trade() { TradeType = "香草期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 2950.0, SpotPrice = 2900.0, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy", TradeOpenVolatility = 0.30, }; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray(); Assert.AreEqual(2, result.Length, ""); //Assert.AreEqual(0.3, result[0].Vol, 1e-8, ""); Assert.AreEqual(1634.1684722973448, result[0].Pv, 1e-8, ""); Assert.AreEqual(8.82155311051065, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.030129099286568817, result[0].Gamma, 1e-8, ""); Assert.AreEqual(68.538687287491484, result[0].Vega, 1e-8, ""); Assert.AreEqual(-47.02780051542436, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.014733641666248331, result[0].Rho, 1e-8, ""); Assert.AreEqual(1634.1684722973448, result[0].TradePriceBid, 1e-8, ""); Assert.AreEqual(1634.2, result[0].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(1977.6834940442398, result[0].TradePriceAsk, 1e-8, ""); Assert.AreEqual(1977.6, result[0].RoundedTradePriceAsk, 1e-8, ""); //Assert.AreEqual(0.3, result[1].Vol, 1e-8, ""); Assert.AreEqual(2631.017708698957, result[1].Pv, 1e-8, ""); Assert.AreEqual(-11.1154316174634, result[1].Delta, 1e-8, ""); Assert.AreEqual(0.030129149308777414, result[1].Gamma, 1e-8, ""); Assert.AreEqual(68.538687287718858, result[1].Vega, 1e-8, ""); Assert.AreEqual(-46.884799590299735, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.023721221400774085, result[1].Rho, 1e-8, ""); Assert.AreEqual(2631.017708698957, result[1].TradePriceBid, 1e-8, ""); Assert.AreEqual(2631, result[1].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(2974.5327304458565, result[1].TradePriceAsk, 1e-8, ""); Assert.AreEqual(2974.6, result[1].RoundedTradePriceAsk, 1e-8, ""); trade = new trade() { TradeType = "香草期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 2950.0, SpotPrice = 2900.0, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy", TradeOpenVolatility = 0.3 }; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray(); Assert.AreEqual(2, result.Length, ""); Assert.AreEqual(0.3, result[0].Vol, 1e-8, ""); Assert.AreEqual(1634.1684722973448, result[0].Pv, 1e-8, ""); Assert.AreEqual(8.82155311051065, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.030129099286568817, result[0].Gamma, 1e-8, ""); Assert.AreEqual(68.538687287491484, result[0].Vega, 1e-8, ""); Assert.AreEqual(-47.02780051542436, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.014733641666248331, result[0].Rho, 1e-8, ""); Assert.AreEqual(1634.1684722973448, result[0].TradePriceBid, 1e-8, ""); Assert.AreEqual(1634.2, result[0].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(1634.1684722973448, result[0].TradePriceAsk, 1e-8, ""); Assert.AreEqual(1634.2, result[0].RoundedTradePriceAsk, 1e-8, ""); //Assert.AreEqual(0.3, result[1].Vol, 1e-8, ""); Assert.AreEqual(2631.017708698957, result[1].Pv, 1e-8, ""); Assert.AreEqual(-11.1154316174634, result[1].Delta, 1e-8, ""); Assert.AreEqual(0.030129149308777414, result[1].Gamma, 1e-8, ""); Assert.AreEqual(68.538687287718858, result[1].Vega, 1e-8, ""); Assert.AreEqual(-46.884799590299735, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.023721221400774085, result[1].Rho, 1e-8, ""); Assert.AreEqual(2631.017708698957, result[1].TradePriceBid, 1e-8, ""); Assert.AreEqual(2631, result[1].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(2631.017708698957, result[1].TradePriceAsk, 1e-8, ""); Assert.AreEqual(2631, result[1].RoundedTradePriceAsk, 1e-8, ""); //从波动率曲面读取 trade = new trade() { TradeType = "香草期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 2950.0, SpotPrice = 2900.0, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy", VolType = "交易" }; underlying = new underlying_manager() { UnderlyingInstrumentType = "CommodityFutures", UnderlyingCode = "CU1910", MaturityDate = new DateTime(2019, 7, 16), QuotationDate = new DateTime(2019, 6, 17), Price = 2900.0 }; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray(); Assert.AreEqual(2, result.Length, ""); Assert.AreEqual(0.10956030060947755, result[0].Vol, 1e-8, ""); Assert.AreEqual(367.94427810143958, result[0].Pv, 1e-8, ""); Assert.AreEqual(6.1294421966010759, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.073455497613394982, result[0].Gamma, 1e-8, ""); Assert.AreEqual(61.0248278879169, result[0].Vega, 1e-8, ""); Assert.AreEqual(-15.272668657703719, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.0033173808200274379, result[0].Rho, 1e-8, ""); Assert.AreEqual(367.94427810143958, result[0].TradePriceBid, 1e-8, ""); Assert.AreEqual(368, result[0].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(729.21420750241577, result[0].TradePriceAsk, 1e-8, ""); Assert.AreEqual(729.2, result[0].RoundedTradePriceAsk, 1e-8, ""); //Assert.AreEqual(0.3, result[1].Vol, 1e-8, ""); Assert.AreEqual(1347.0332956294735, result[1].Pv, 1e-8, ""); Assert.AreEqual(-13.909974736793629, result[1].Delta, 1e-8, ""); Assert.AreEqual(0.074904696703015361, result[1].Gamma, 1e-8, ""); Assert.AreEqual(60.569446355327727, result[1].Vega, 1e-8, ""); Assert.AreEqual(-14.609684783051534, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.012144834652463032, result[1].Rho, 1e-8, ""); Assert.AreEqual(1347.0332956294735, result[1].TradePriceBid, 1e-8, ""); Assert.AreEqual(1347, result[1].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(1726.0634439040327, result[1].TradePriceAsk, 1e-8, ""); Assert.AreEqual(1726, result[1].RoundedTradePriceAsk, 1e-8, ""); //传入BaseVol和BidVar、AskVar new trade() { TradeType = "香草期权", UnderlyingCode = underlying.UnderlyingCode, UnderlyingInstrumentType = "CommodityFutures", TradeDate = new DateTime(2019, 6, 17), StartDate = new DateTime(2019, 6, 17), MaturityDate = new DateTime(2019, 7, 16), ExerciseDate = new DateTime(2019, 7, 16), OptionType = "看涨", ExerciseMode = "European", Strike = 2950.0, SpotPrice = 2900.0, Notional = 20, NoRiskRate = 0.035, BuySell = "Buy" }; result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray(); Assert.AreEqual(2, result.Length, ""); Assert.AreEqual(0.2471367218114178, result[0].Vol, 1e-8, ""); Assert.AreEqual(1273.1815280634544, result[0].Pv, 1e-8, ""); Assert.AreEqual(8.44111397193501, result[0].Delta, 1e-8, ""); Assert.AreEqual(0.036274864214647096, result[0].Gamma, 1e-8, ""); Assert.AreEqual(67.978921076371535, result[0].Vega, 1e-8, ""); Assert.AreEqual(-38.425449979023824, result[0].Theta, 1e-8, ""); Assert.AreEqual(-0.011478988077760733, result[0].Rho, 1e-8, ""); Assert.AreEqual(1273.1815280634544, result[0].TradePriceBid, 1e-8, ""); Assert.AreEqual(1273.2, result[0].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(2299.7798038856977, result[0].TradePriceAsk, 1e-8, ""); Assert.AreEqual(2299.8, result[0].RoundedTradePriceAsk, 1e-8, ""); //Assert.AreEqual(0.3, result[1].Vol, 1e-8, ""); Assert.AreEqual(2263.6749352101019, result[1].Pv, 1e-8, ""); Assert.AreEqual(-11.503795101498326, result[1].Delta, 1e-8, ""); Assert.AreEqual(0.036405872378963977, result[1].Gamma, 1e-8, ""); Assert.AreEqual(67.965549632390321, result[1].Vega, 1e-8, ""); Assert.AreEqual(-38.129531169690836, result[1].Theta, 1e-8, ""); Assert.AreEqual(-0.020409263738520166, result[1].Rho, 1e-8, ""); Assert.AreEqual(2263.6749352101019, result[1].TradePriceBid, 1e-8, ""); Assert.AreEqual(2263.6, result[1].RoundedTradePriceBid, 1e-8, ""); Assert.AreEqual(3296.62904028731, result[1].TradePriceAsk, 1e-8, ""); Assert.AreEqual(3296.6, result[1].RoundedTradePriceAsk, 1e-8, ""); #endregion } [TestMethod] public void RealTimePnlCalcTest() { var result = YLErp.BLL.Eod.RealtimePnlCalc.RealtimePosition(OptUserInfo.UnitTestUser); Assert.AreNotEqual(0, result.Count); } [TestMethod] public void QueryFlowRiskListTest() { new FlowRiskService(OptUserInfo.UnitTestUser).QueryFlowRiskList(DateTime.Today, DateTime.Today.AddMonths(1)); } } }