253 lines
9.4 KiB
C#
253 lines
9.4 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 交易风险API
|
|
/// </summary>
|
|
[ManagerAuth]
|
|
public class TradeRiskCalcController : BaseApiController
|
|
{
|
|
/// <summary>
|
|
/// 实时风险运行切换(用于内部)
|
|
/// </summary>
|
|
[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");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 实时风险(用于内部)
|
|
/// </summary>
|
|
[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<TradingRiskParameter>(), date = "" });
|
|
}
|
|
|
|
return JsonSuccess(new
|
|
{
|
|
rows = result.TradeRiskList,
|
|
date = result.ValueDate.ToString("yyyy-MM-dd"),
|
|
calctimes = new[] { result.CalcStartTime, result.CalcEndTime }
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 价格试算(用于内部)
|
|
/// </summary>
|
|
[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<TradingRiskParameter>(), date = "" });
|
|
}
|
|
return JsonSuccess(new { rows = result.TradeRiskList, date = result.ValueDate.ToString("yyyy-MM-dd") });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 用正常验证方式提供实时风险数据
|
|
/// </summary>
|
|
[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<TradingRiskParameter>(), date = "" });
|
|
}
|
|
return new ApiResponseModel(new
|
|
{
|
|
rows = result.TradeRiskList,
|
|
date = result.ValueDate.ToString("yyyy-MM-dd"),
|
|
calctimes = new[] { result.CalcStartTime, result.CalcEndTime },
|
|
message = result.Message
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 提供实时预付金数据
|
|
/// </summary>
|
|
[HttpPost, Route("api/v1/realtimeMargin")]
|
|
public ApiResponseModel RealtimeMargin()
|
|
{
|
|
var datas = new RealTimeMarginService(CurUser).GetRealTimeMarginResult();
|
|
|
|
return JsonSuccess(datas);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 保存场外期权持仓波动率
|
|
/// </summary>
|
|
[HttpPost, Route("api/v1/saveOptionTradeVol")]
|
|
public ApiResponseModel SaveOptionTradeVol([FromBody] TradeVolatilityDto req)
|
|
{
|
|
new TradeHisDataService(CurUser).SaveTradeVolatility(req, false);
|
|
return JsonSuccess();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 历史交易统计数据
|
|
/// </summary>
|
|
[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 });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 自定义交易风险
|
|
/// </summary>
|
|
[HttpPost, Route("api/v1/updateCustomTradeRisk")]
|
|
public ApiResponseModel UpdateCustomTradeRisk([FromBody] eod_trade_risk_manualDto req)
|
|
{
|
|
new EodTradeRiskManualService(CurUser).SaveEodTradeRiskManualAPI(req);
|
|
|
|
return JsonSuccess();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询交易风险信息
|
|
/// </summary>
|
|
/// <param name="TradeNumber">交易编号</param>
|
|
/// <param name="ValueDate">估值日期</param>
|
|
/// <param name="DataType">
|
|
/// 数据类型:
|
|
/// <para>0:自定义维护数据</para>
|
|
/// <para>1:收盘价+持仓波动率</para>
|
|
/// <para>2:收盘价+对冲波动率</para>
|
|
/// <para>3:收盘价+开仓波动率</para>
|
|
/// <para>4:结算价+持仓波动率</para>
|
|
/// <para>5:结算价+对冲波动率</para>
|
|
/// <para>6:结算价+开仓波动率</para>
|
|
/// </param>
|
|
/// <returns></returns>
|
|
[HttpPost, Route("api/v1/queryTradeRisk")]
|
|
public ApiResponseModel QueryTradeRisk([FromBody] QueryTradeRiskReq req)
|
|
{
|
|
IEnumerable<EodTradeRisk> list;
|
|
Dictionary<int, string> tradeNumberDict;
|
|
switch (req.DataType)
|
|
{
|
|
case 1:
|
|
list = new EodPositionRisksQueryService(CurUser).SearchEodRisk<eod_trade_risk>(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast<EodTradeRisk>();
|
|
break;
|
|
case 2:
|
|
list = new EodPositionRisksQueryService(CurUser).SearchEodRisk<eod_trade_risk_hedgevol>(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast<EodTradeRisk>();
|
|
break;
|
|
case 3:
|
|
list = new EodPositionRisksQueryService(CurUser).SearchEodRisk<eod_trade_risk_openvol>(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast<EodTradeRisk>();
|
|
break;
|
|
case 4:
|
|
list = new EodPositionRisksQueryService(CurUser).SearchEodRisk<eod_trade_risk_s>(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast<EodTradeRisk>();
|
|
break;
|
|
case 5:
|
|
list = new EodPositionRisksQueryService(CurUser).SearchEodRisk<eod_trade_risk_hedgevol_s>(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast<EodTradeRisk>();
|
|
break;
|
|
case 6:
|
|
list = new EodPositionRisksQueryService(CurUser).SearchEodRisk<eod_trade_risk_openvol_s>(req.TradeNumbers, req.ValueDate, out tradeNumberDict).Cast<EodTradeRisk>();
|
|
break;
|
|
default:
|
|
return JsonError($"“{nameof(req.DataType)}”超出可选值范围:(0~6)");
|
|
}
|
|
|
|
var result = new List<QueryTradeRisk>();
|
|
|
|
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 });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新交易持仓预付金
|
|
/// </summary>
|
|
[HttpPost, Route("api/v1/updateTradePositionMargin")]
|
|
public ApiResponseModel UpdateTradePositionMargin([FromBody] eod_trade_risk_manualDto req)
|
|
{
|
|
new EodTradeRiskManualService(CurUser).SaveEodTradePositionMarginAPI(req);
|
|
|
|
return JsonSuccess();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 情景分析计算
|
|
/// </summary>
|
|
[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);
|
|
}
|
|
}
|
|
}
|