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);
}
}
}