using Microsoft.AspNetCore.Authentication; using YLErp.Modules.ApiModule; using YLErp.Modules.DataProviderModule; using YLErp.Modules.EodModule; using YLErp.Modules.ScenarioModule; using YLErp.Modules.TradeModule; using YLErp.Modules.TradeRiskCalcModule; using YLErp.QdpModule; namespace YLWebAPI.ApiModule.ManagerApi { /// /// 交易风险API /// [ManagerAuth] public class TradeRiskCalcController : BaseApiController { /// /// 实时风险运行切换(用于内部) /// [HttpPost, Route("api/v100/traderisk_switch"), ManagerAuth] public ApiResponseModel TradeRiskCalcSwitch() { AppContext.TryGetSwitch("DisableTradeRiskCalcTaskRunner", out var disable); disable = !disable; AppContext.SetSwitch("DisableTradeRiskCalcTaskRunner", disable); return JsonSuccess(disable ? "停用实时风险计算" : "启用实时风险计算", "text/plain"); } /// /// 实时风险(用于内部) /// [HttpPost, Route("api/v100/traderisk"), ManagerAuth] public ApiResponseModel TradeRiskCalc([FromBody] TradingRiskReqModel req) { if (req == null) { req = new TradingRiskReqModel(); } if (string.IsNullOrWhiteSpace(req.VolType)) { req.VolType = "对冲"; } var result = new TradingRiskReqService(CurUser).GetResult(req); if (result == null) { return JsonSuccess(new { rows = Enumerable.Empty(), date = "" }); } return JsonSuccess(new { rows = result.TradeRiskList, date = result.ValueDate.ToString("yyyy-MM-dd"), calctimes = new[] { result.CalcStartTime, result.CalcEndTime } }); } /// /// 价格试算(用于内部) /// [HttpPost, Route("api/v100/traderisk_pricecalc"), ManagerAuth] public ApiResponseModel TradeRiskCalcPriceCalc([FromBody] TradingRiskPriceCalcReqModel req) { if (req is null) { req = new TradingRiskPriceCalcReqModel(); } if (string.IsNullOrWhiteSpace(req.VolType)) { req.VolType = "对冲"; } var result = new TradingRiskReqService(CurUser).GetPriceCalcResult(req); if (result == null) { return JsonSuccess(new { rows = Enumerable.Empty(), date = "" }); } return JsonSuccess(new { rows = result.TradeRiskList, date = result.ValueDate.ToString("yyyy-MM-dd") }); } /// /// 用正常验证方式提供实时风险数据 /// [HttpPost, Route("api/v1/realtimeRiskCalc")] public ApiResponseModel RealtimeRiskCalc([FromBody] TradingRiskReqModel req) { if (req is null) { req = new TradingRiskReqModel(); } req.IncludeStock = true; //return TradeRiskCalc(req); // 获取用户信息 var user = (LoadUserMiddleware.AuthUserInfo)HttpContext.User.Identity; // 通过接口查询风险数据 var result = new YLErpWebApiHelper(user.CreateJwtToken).GetTradingRisk(req).Result; // 响应结果 if (result == null) { return new ApiResponseModel(new { rows = Enumerable.Empty(), date = "" }); } return new ApiResponseModel(new { rows = result.TradeRiskList, date = result.ValueDate.ToString("yyyy-MM-dd"), calctimes = new[] { result.CalcStartTime, result.CalcEndTime }, message = result.Message }); } /// /// 提供实时预付金数据 /// [HttpPost, Route("api/v1/realtimeMargin")] public ApiResponseModel RealtimeMargin() { var datas = new RealTimeMarginService(CurUser).GetRealTimeMarginResult(); return JsonSuccess(datas); } /// /// 保存场外期权持仓波动率 /// [HttpPost, Route("api/v1/saveOptionTradeVol")] public ApiResponseModel SaveOptionTradeVol([FromBody] TradeVolatilityDto req) { new TradeHisDataService(CurUser).SaveTradeVolatility(req, false); return JsonSuccess(); } /// /// 历史交易统计数据 /// [HttpPost, Route("api/v1/tradePnlStaticsData")] public IActionResult TradePnlStaticsData() { var valueDate = QdpCalendarHelper.GetNonHoliday(DateTime.Today); var result = TradePnlStaticsDataProvider.Default.GetDatas(valueDate); return Ok(new { date = valueDate, data = result }); } /// /// 自定义交易风险 /// [HttpPost, Route("api/v1/updateCustomTradeRisk")] public ApiResponseModel UpdateCustomTradeRisk([FromBody] eod_trade_risk_manualDto req) { new EodTradeRiskManualService(CurUser).SaveEodTradeRiskManualAPI(req); return JsonSuccess(); } /// /// 查询交易风险信息 /// /// 交易编号 /// 估值日期 /// /// 数据类型: /// 0:自定义维护数据 /// 1:收盘价+持仓波动率 /// 2:收盘价+对冲波动率 /// 3:收盘价+开仓波动率 /// 4:结算价+持仓波动率 /// 5:结算价+对冲波动率 /// 6:结算价+开仓波动率 /// /// [HttpPost, Route("api/v1/queryTradeRisk")] public ApiResponseModel QueryTradeRisk([FromBody] QueryTradeRiskReq req) { IEnumerable list; Dictionary tradeNumberDict; switch (req.DataType) { case 1: list = new EodPositionRisksQueryService(CurUser).SearchEodRisk(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast(); break; case 2: list = new EodPositionRisksQueryService(CurUser).SearchEodRisk(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast(); break; case 3: list = new EodPositionRisksQueryService(CurUser).SearchEodRisk(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast(); break; case 4: list = new EodPositionRisksQueryService(CurUser).SearchEodRisk(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast(); break; case 5: list = new EodPositionRisksQueryService(CurUser).SearchEodRisk(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast(); break; case 6: list = new EodPositionRisksQueryService(CurUser).SearchEodRisk(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast(); break; default: return JsonError($"“{nameof(req.DataType)}”超出可选值范围:(0~6)"); } var result = new List(); foreach (var item in list) { result.Add(new QueryTradeRisk() { TradeNumber = tradeNumberDict.ContainsKey(item.TradeId) ? tradeNumberDict[item.TradeId] : "", ValueDate = item.ValueDate.ToString("yyyy-MM-dd"), Pv = item.Pv, Delta = item.Delta, Gamma = item.Gamma, Vega = item.Vega, Theta = item.Theta, Rho = item.Rho }); } return JsonSuccess(new { rows = result }); } /// /// 更新交易持仓预付金 /// [HttpPost, Route("api/v1/updateTradePositionMargin")] public ApiResponseModel UpdateTradePositionMargin([FromBody] eod_trade_risk_manualDto req) { new EodTradeRiskManualService(CurUser).SaveEodTradePositionMarginAPI(req); return JsonSuccess(); } /// /// 情景分析计算 /// [HttpPost, Route("api/v1/risk/scenario_calc")] public ApiResponseModel ScenarioCalc([FromBody] ScenarioCalcApiRequest req) { if (req is null) { return JsonError("缺少必要的请求参数"); } var result = new ScenarioCalcService(CurUser).Calculate(req); return JsonSuccess(result); } } }