从山证v2.3.0拷贝
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user