using YLErp.Enums; using YLErp.Modules.PricingModule; namespace YLErp.Web.WebAPI.Controllers { /// /// 期权定价 /// public class PricingController : BaseController { /// /// 计算pv margin greeks /// [HttpPost("m/api/pricing/calc-basic")] public JsonResult Calc(OtcOptionTradeFull req) { if (req is null) { return JsonError("错误:请求参数为空"); } var trade = InitialTrade(req); var result = new PriceCalcService(CurUser).CalcOptionPrice(trade, false, CalcScenarioEnum.Pricing, true); return JsonSuccess(new { result.calcResult, result.Day1Pnl }); } /// /// 根据权利金反算 /// [HttpPost("m/api/pricing/calc-target")] public JsonResult CalcTargetValue(OtcOptionTradeFull req, int calTarget) { if (req is null) { return JsonError("错误:请求参数为空"); } var trade = InitialTrade(req); trade.TradePrice = trade.TradeSinglePrice; var targetValue = new PriceCalcService(CurUser).CalcSnowballSpecialistTargetValue(trade, calTarget); //敲出票息和红利票息 if (calTarget == 1) { var obsInfos = trade.KOObservationDates.Split(';'); var kORebates = obsInfos[2].Split(','); trade.KOObservationDates = string.Join(";", new[] { obsInfos[0], obsInfos[1], string.Join(",",kORebates.Select(x => String.IsNullOrEmpty(x) ? targetValue.ToString() : x)) }); trade.Coupon = targetValue; } //敲出票息 else if (calTarget == 2) { var obsInfos = trade.KOObservationDates.Split(';'); var kORebates = obsInfos[2].Split(','); trade.KOObservationDates = string.Join(";", new[] { obsInfos[0], obsInfos[1], string.Join(",",kORebates.Select(x => String.IsNullOrEmpty(x) ? targetValue.ToString() : x)) }); } //红利票息 else if (calTarget == 3) { trade.Coupon = targetValue; } var result = new PriceCalcService(CurUser).CalcOptionPrice(trade, false, CalcScenarioEnum.Pricing, false); return JsonSuccess(new { TargetValue = double.IsNaN(targetValue) ? 0 : targetValue, result.calcResult }); } /// /// 定价页面初始值 /// [HttpPost("m/api/pricing/init-values")] public JsonResult GetInitValues(PricingInitValuesRequest req) { var result = new PricingDataService(CurUser).GetPricingInitValues(req); return JsonSuccess(result); } /// /// 初始化交易参数 /// /// /// private OtcOptionTradeFull InitialTrade(OtcOptionTradeFull trade) { //OtcOptionTradeFull trade = new OtcOptionTradeFull(); //YLAutoMapper.Map(req, trade); // initial trade params trade.PrepaymentUsed = true; if (string.IsNullOrEmpty(trade.CouponDayCount) || trade.CouponDayCount == "非年化") { trade.CouponDayCount = string.Empty; trade.IsFixedCoupon = true; } trade.TradeDate = trade.StartDate; trade.AnnualizeFactor2 = 1; trade.NumOfSmoothingDays = 1; trade.ParentTradeId = 0; trade.TradeCloseVolatility = trade.Vol; trade.TradeOpenVolatility = trade.Vol; trade.AnnualizeFactor = 1; trade.ParticipationRate = 1; trade.IsGroup = 0; trade.CountRatio = 1; if (!trade.MetaDic.ContainsKey("敲入观察周期")) { trade.MetaDic.Add("敲入观察周期", "1D"); } return trade; } } }