using YLErp.Abstract; using YLErp.Abstract.DataProviders; using YLErp.BLL; using YLErp.Enums; using YLErp.Modules.CalculationModule.Abstract; using YLErp.Modules.DataProviderModule; namespace YLErp.Modules.CalculationModule { /// /// 持仓风险对冲计算上下文 /// public class HedgePnlCalcContext : IHedgePnlCalcContext { #region----属性定义---- /// /// 估值日 /// public DateTime ValueDate { get; } /// /// 计算场景 /// public CalcScenarioEnum CalcScenario { get; } /// /// 波动率类型 /// public string VolType { get; } public bool IsEodCalc { get; } /// /// /// public IPriceProvider UnderlyingPriceProvider { get; } /// /// /// public IPriceProvider UnderlyingSettlePriceProvider { get; } /// /// 场内标的价格提供者 /// public IPriceProvider ExchangeOptionPriceProvider { get; } /// /// /// public IUnderlyingDataProvider UnderlyingDataProvider { get; protected set; } /// /// 对冲交易佣金计算接口 /// public IExchangeTradeCommissionCalc CommissionCalc { get; protected set; } /// /// 错误处理接口 /// public IErrorHandler ErrorHandler { get; set; } /// /// /// public OptUserInfo OptUser { get; } /// /// 场内期权价格使用选项(默认SetExOptionPrice) /// 注意:在计算类中光子将忽略此项并固定为CalcPv /// public ExchangeOptionPriceUseFlag ExchangeOptionPriceUseFlag { get; set; } = ExchangeOptionPriceUseFlag.SetExOptionPrice; #endregion #region----构造函数---- public HedgePnlCalcContext(CalcScenarioEnum calcScenario, DateTime valueDate, string volType, bool isEodCalc , IPriceProvider underlyingPriceProvider, IPriceProvider underlyingSettlePriceProvider, IPriceProvider exchangeOptionPriceProvider, OptUserInfo optUser , IExchangeTradeCommissionCalc commissionCalc = null , IUnderlyingDataProvider underlyingDataProvider = null) { if (string.IsNullOrEmpty(volType)) { throw new ArgumentException("volType不能为空", nameof(volType)); } VolType = volType; IsEodCalc = isEodCalc; ValueDate = valueDate; CalcScenario = calcScenario; OptUser = optUser ?? throw new ArgumentNullException(nameof(optUser)); UnderlyingPriceProvider = underlyingPriceProvider ?? throw new ArgumentNullException(nameof(underlyingPriceProvider)); UnderlyingSettlePriceProvider = underlyingSettlePriceProvider ?? throw new ArgumentNullException(nameof(underlyingPriceProvider)); ExchangeOptionPriceProvider = exchangeOptionPriceProvider ?? throw new ArgumentNullException(nameof(exchangeOptionPriceProvider)); CommissionCalc = commissionCalc ?? new ExchangeTradeCommissionCalc(); UnderlyingDataProvider = underlyingDataProvider ?? new UnderlyingDataProvider(); } public HedgePnlCalcContext(IOtcTradeValueCalcContext optionCalcContext, IExchangeTradeCommissionCalc tradeCommissionCalc, IPriceProvider exchangeOptionPriceProvider) { if (optionCalcContext is null) { throw new ArgumentNullException(nameof(optionCalcContext)); } CommissionCalc = tradeCommissionCalc ?? throw new ArgumentNullException(nameof(tradeCommissionCalc)); ExchangeOptionPriceProvider = exchangeOptionPriceProvider ?? throw new ArgumentNullException(nameof(exchangeOptionPriceProvider)); var dataProvider = CalcCheckHelper.CheckOptionCalcDataProvider(optionCalcContext.DataProvider); UnderlyingDataProvider = dataProvider.UnderlyingDataProvider; UnderlyingPriceProvider = dataProvider.UnderlyingPriceProvider; UnderlyingSettlePriceProvider = dataProvider.UnderlyingPriceProvider; VolType = optionCalcContext.VolType; ValueDate = optionCalcContext.ValueDate; CalcScenario = optionCalcContext.CalcScenario; ErrorHandler = optionCalcContext.ErrorHandler; OptUser = OptUserInfo.SystemUser; } #endregion /// /// 创建期权计算上下文对象 /// public virtual IOtcTradeValueCalcContext CreateOptionCalculateContext() { var sysRiskFreeRate = valuedateBLL.RiskFreeRate * 0.01; var dataProvider = new InnerOptionCalcDataProvider(this); return new OptionValueCalcContext(VolType, IsEodCalc, ValueDate, sysRiskFreeRate, dataProvider) { AddingVolRate = 0, ErrorHandler = ErrorHandler, CalcScenario = CalcScenario }; } #region----InnerOptionCalcDataProvider---- class InnerOptionCalcDataProvider : IOptionCalcDataProvider { public InnerOptionCalcDataProvider(HedgePnlCalcContext context) { UnderlyingDataProvider = context.UnderlyingDataProvider; UnderlyingPriceProvider = context.UnderlyingPriceProvider; UnderlyingSettlePriceProvider = context.UnderlyingSettlePriceProvider; VolatilityDataProvider = new VolatilityDataProvider(context.ValueDate); TradeExtendDataProvider = new TradeExtendDataProvider(context.OptUser); } public IPriceProvider UnderlyingPriceProvider { get; } public IPriceProvider UnderlyingSettlePriceProvider { get; } public IUnderlyingDataProvider UnderlyingDataProvider { get; } public ITradeExtendDataProvider TradeExtendDataProvider { get; } public IVolatilityDataProvider VolatilityDataProvider { get; } } #endregion public HedgePnlCalc GetHedgePnlCalc() { return new HedgePnlCalc(this); } public MaturityOptionHedgePnlCalc GetOptionHedgePnlCalc() { return new MaturityOptionHedgePnlCalc(this); } } }