Files
zszq-trs/YLErpDAL/Modules/ExchangeOptionTradeModule/EodExchangeOptionRiskCalcService.cs
T
2024-05-09 14:06:26 +08:00

70 lines
2.8 KiB
C#

using System.Linq.Expressions;
using YLErp.BLL.Hedge;
using YLErp.Modules.CalculationModule;
using YLErp.Modules.CalculationModule.Abstract;
using YLErp.Modules.DataProviderModule;
using YLErp.Modules.EodModule;
namespace YLErp.Modules.ExchangeOptionTradeModule
{
/// <summary>
/// 日终场内期权风险计算服务
/// </summary>
public class EodExchangeOptionRiskCalcService : YLBaseService
{
private EodPriceProvider _eodPriceProvider = null;
EodExchangeOptionPriceProvider _eodExchangeOptionProvider;
public EodExchangeOptionRiskCalcService(OptUserInfo userInfo) : base(userInfo)
{
}
public EodExchangeOptionRiskCalcService(YLBaseService baseService) : base(baseService)
{
}
/// <summary>
/// 取结算日期的场内期权收盘持仓数据并进行风险计算
/// </summary>
/// <typeparam name="T">EodTradePositionBase</typeparam>
/// <param name="valueDate">结算日期</param>
/// <param name="volType">波动率类型</param>
/// <param name="predicate">数据过滤预测</param>
public IEnumerable<HedgePnl> CalculateEodRisk<T>(DateTime valueDate, string volType, bool useClosePrice, Expression<Func<T, bool>> predicate = null)
where T : EodTradePosition
{
if (volType is null)
{
throw new ArgumentNullException(nameof(volType));
}
predicate = predicate == null
? PredicateBuilder.Create<T>(p => p.TradeType == "场内期权")
: PredicateBuilder.Create<T>(p => p.TradeType == "场内期权").And(predicate);
var oldHoldPosition = new EodSettlementService(this).GetEodTradePosition(valueDate, predicate);
if (_eodPriceProvider == null || _eodPriceProvider.ValueDate != valueDate)
{
_eodPriceProvider = new EodPriceProvider(valueDate);
_eodExchangeOptionProvider = new EodExchangeOptionPriceProvider(valueDate, useClosePrice);
}
var priceProvider = _eodPriceProvider.GetPriceProvider(useClosePrice ? SettlementTypeEnum.ClosePrice : SettlementTypeEnum.SettlePrice);
var context =
new HedgePnlCalcContext(Enums.CalcScenarioEnum.EodSettlement, valueDate, volType, true, priceProvider
, _eodPriceProvider.GetPriceProvider(SettlementTypeEnum.SettlePrice), _eodExchangeOptionProvider, OptUser)
{
ExchangeOptionPriceUseFlag = PS.Config.ErpElement.ExchangeOptionSettleByPrice
? ExchangeOptionPriceUseFlag.CalcPv : ExchangeOptionPriceUseFlag.None
};
return new HedgePnlCalc(context).Calculate(null, oldHoldPosition);
}
}
}