140 lines
4.8 KiB
C#
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; }
|
|
}
|
|
}
|
|
}
|