using YLErp.Enums;
using YLErp.Modules.PricingModule;
namespace YLErp.Web.WebAPI.Controllers
{
///
/// 期权定价
///
public class PricingController : BaseController
{
///
/// 计算pv margin greeks
///
[HttpPost("m/api/pricing/calc-basic")]
public JsonResult Calc(OtcOptionTradeFull req)
{
if (req is null)
{
return JsonError("错误:请求参数为空");
}
var trade = InitialTrade(req);
var result = new PriceCalcService(CurUser).CalcOptionPrice(trade, false, CalcScenarioEnum.Pricing, true);
return JsonSuccess(new { result.calcResult, result.Day1Pnl });
}
///
/// 根据权利金反算
///
[HttpPost("m/api/pricing/calc-target")]
public JsonResult CalcTargetValue(OtcOptionTradeFull req, int calTarget)
{
if (req is null)
{
return JsonError("错误:请求参数为空");
}
var trade = InitialTrade(req);
trade.TradePrice = trade.TradeSinglePrice;
var targetValue = new PriceCalcService(CurUser).CalcSnowballSpecialistTargetValue(trade, calTarget);
//敲出票息和红利票息
if (calTarget == 1)
{
var obsInfos = trade.KOObservationDates.Split(';');
var kORebates = obsInfos[2].Split(',');
trade.KOObservationDates = string.Join(";", new[] {
obsInfos[0],
obsInfos[1],
string.Join(",",kORebates.Select(x => String.IsNullOrEmpty(x) ? targetValue.ToString() : x))
});
trade.Coupon = targetValue;
}
//敲出票息
else if (calTarget == 2)
{
var obsInfos = trade.KOObservationDates.Split(';');
var kORebates = obsInfos[2].Split(',');
trade.KOObservationDates = string.Join(";", new[] {
obsInfos[0],
obsInfos[1],
string.Join(",",kORebates.Select(x => String.IsNullOrEmpty(x) ? targetValue.ToString() : x))
});
}
//红利票息
else if (calTarget == 3)
{
trade.Coupon = targetValue;
}
var result = new PriceCalcService(CurUser).CalcOptionPrice(trade, false, CalcScenarioEnum.Pricing, false);
return JsonSuccess(new { TargetValue = double.IsNaN(targetValue) ? 0 : targetValue, result.calcResult });
}
///
/// 定价页面初始值
///
[HttpPost("m/api/pricing/init-values")]
public JsonResult GetInitValues(PricingInitValuesRequest req)
{
var result = new PricingDataService(CurUser).GetPricingInitValues(req);
return JsonSuccess(result);
}
///
/// 初始化交易参数
///
///
///
private OtcOptionTradeFull InitialTrade(OtcOptionTradeFull trade)
{
//OtcOptionTradeFull trade = new OtcOptionTradeFull();
//YLAutoMapper.Map(req, trade);
// initial trade params
trade.PrepaymentUsed = true;
if (string.IsNullOrEmpty(trade.CouponDayCount) || trade.CouponDayCount == "非年化")
{
trade.CouponDayCount = string.Empty;
trade.IsFixedCoupon = true;
}
trade.TradeDate = trade.StartDate;
trade.AnnualizeFactor2 = 1;
trade.NumOfSmoothingDays = 1;
trade.ParentTradeId = 0;
trade.TradeCloseVolatility = trade.Vol;
trade.TradeOpenVolatility = trade.Vol;
trade.AnnualizeFactor = 1;
trade.ParticipationRate = 1;
trade.IsGroup = 0;
trade.CountRatio = 1;
if (!trade.MetaDic.ContainsKey("敲入观察周期"))
{
trade.MetaDic.Add("敲入观察周期", "1D");
}
return trade;
}
}
}