Files
zszq-trs/YLErpWeb/WebAPI/Controllers/VolatilityController.cs
T
2024-05-09 14:06:26 +08:00

140 lines
4.8 KiB
C#

using System.Text.RegularExpressions;
using YLErp.DBModels.Consts;
using YLErp.Modules.CalculationModule;
using YLErp.Modules.VolatilityModule;
namespace YLErp.Web.WebAPI.Controllers
{
/// <summary>
/// 波动率
/// </summary>
public class VolatilityController : BaseController
{
/// 定价页面获取单个波动率值
/// </summary>
[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
{
/// <summary>
/// 波动率值
/// </summary>
public double? VolValue { get; set; }
/// <summary>
/// 光大光子var值
/// </summary>
public double? VarValue { get; set; }
/// <summary>
/// 光大光子basevol
/// </summary>
public double? BaseVolValue { get; set; }
/// <summary>
/// 东证专用midvol
/// </summary>
public double? MidVolValue { get; set; }
}
}
}