using System.Text.RegularExpressions; using YLErp.DBModels.Consts; using YLErp.Modules.CalculationModule; using YLErp.Modules.VolatilityModule; namespace YLErp.Web.WebAPI.Controllers { /// /// 波动率 /// public class VolatilityController : BaseController { /// 定价页面获取单个波动率值 /// [HttpPost("m/api/volatility/single")] public JsonResult GetSingleVolValue(SingleVolReq req) { var userGroup = UserBLL.GetUserGroup(CurUser.UserId); if (PS.Config.ErpElement.SkewMapVolConstruction) { try { if (req.IsMoneynessOption == "是") { req.Strike = req.SpotPrice * req.Strike; } var volType = req.VolType; req.Vols = VolatilityHelper.GetVol(req.TradeDate, "交易", req.UnderlyingCode, userGroup); if (req.Vols == null || string.IsNullOrEmpty(req.Vols.VolSurfaceMode)) { throw new InvalidOperationException($"找不到波动率曲面{req.UnderlyingCode}"); } if (req.BaseVol == null || req.BaseVol <= 0) { req.BaseVol = SkewMapVolHelper.GetSkewMapBaseVolForTrade(req.TradeDate, req.UnderlyingCode, req.Vols, req.UnderlyingTypeId, req.ExerciseDate); } int? varValue = null; switch (volType) { case "报价Ask": varValue = req.AskVar; break; case "报价Bid": varValue = req.BidVar; break; } if (!varValue.HasValue) { var vol = VolatilityHelper.GetVol(req.TradeDate, "交易", req.UnderlyingCode, CurUser.UserGroup); if (vol == null) { return JsonError("找不到波动率:" + req.UnderlyingCode); } switch (volType) { case "报价Ask": req.AskVar = varValue = (int)(vol.GetAskVar() ?? 0); break; case "报价Bid": req.BidVar = varValue = (int)(vol.GetBidVar() ?? 0); break; } } req.VolType = volType; var TargetVol = SingleVolService.GetSingleVol(req, CurUser.UserId); return JsonSuccess(new SingleVolResult { VarValue = varValue, VolValue = TargetVol, BaseVolValue = req.BaseVol }); } catch (ArgumentException ex) { if (Regex.IsMatch(ex.Message, @"列.\d+.不属于表")) { return JsonError("Var值超出SkewMap可选范围"); } return JsonError(ex.Message); } catch (Exception ex) { return JsonError(ex.Message); } } else { if (ConsUserGroup.HasGroup && string.IsNullOrWhiteSpace(userGroup)) { return JsonSuccess(new SingleVolResult()); } var vol = SingleVolService.GetSingleVol(req, CurUser.UserId); if (PS.Config.Is润和) { req.VolType = "交易"; var Midvol = SingleVolService.GetSingleVol(req, CurUser.UserId); return JsonSuccess(new SingleVolResult { VolValue = vol, MidVolValue = Midvol }); } return JsonSuccess(new SingleVolResult { VolValue = vol }); } } class SingleVolResult { /// /// 波动率值 /// public double? VolValue { get; set; } /// /// 光大光子var值 /// public double? VarValue { get; set; } /// /// 光大光子basevol /// public double? BaseVolValue { get; set; } /// /// 东证专用midvol /// public double? MidVolValue { get; set; } } } }