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 { /// /// 日终场内期权风险计算服务 /// public class EodExchangeOptionRiskCalcService : YLBaseService { private EodPriceProvider _eodPriceProvider = null; EodExchangeOptionPriceProvider _eodExchangeOptionProvider; public EodExchangeOptionRiskCalcService(OptUserInfo userInfo) : base(userInfo) { } public EodExchangeOptionRiskCalcService(YLBaseService baseService) : base(baseService) { } /// /// 取结算日期的场内期权收盘持仓数据并进行风险计算 /// /// EodTradePositionBase /// 结算日期 /// 波动率类型 /// 数据过滤预测 public IEnumerable CalculateEodRisk(DateTime valueDate, string volType, bool useClosePrice, Expression> predicate = null) where T : EodTradePosition { if (volType is null) { throw new ArgumentNullException(nameof(volType)); } predicate = predicate == null ? PredicateBuilder.Create(p => p.TradeType == "场内期权") : PredicateBuilder.Create(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); } } }