using Qdp.Pricing.Base.Implementations; using YLErp.Abstract; using YLErp.Abstract.DataProviders; using YLErp.Enums; using YLErp.Modules.CalculationModule; using YLErp.Modules.CalculationModule.Abstract; using YLErp.Modules.DataProviderModule; using YLErp.Modules.TradeRiskCalcModule.TaskRunner; namespace YLErp.Modules.TradeRiskCalcModule { class InnerOptionValueCalcContext : OptionValueCalcContext { public InnerOptionValueCalcContext(DateTime valueDate, IOtcTradeValueCalcContext baseContext) : base(valueDate, baseContext) { } public InnerOptionValueCalcContext(string volType, bool isEodCalc, DateTime valueDate, double sysRiskFreeRate, IOptionCalcDataProvider dataProvider) : base(volType, isEodCalc, valueDate, sysRiskFreeRate, dataProvider) { } public override bool IsPreciseTimeMode => true; public override string GetFixingString(OtcTradeBase trade, trade_asian_option asianOption, double spotPrice) { var fixing = AsiaOptionProvider.Default.GetFixingString(ValueDate, trade, asianOption); if (CalcScenario == CalcScenarioEnum.RealtimeRisk && IsPreciseTimeMode) { //修复实时计算中fixing最后一天的价格不是实时价格 fixing = FixingService.AddOrReplaceLastDateSpotPrice(fixing, ValueDate, spotPrice); } if(PS.Config.Is润和 && DateTime.Now.Hour < 15) { var index = fixing.IndexOf(ValueDate.ToString("yyyy-MM-dd")); if (index >= 0) { fixing = fixing.Remove(index).TrimEnd(';'); } } return fixing; } } /// /// 上一交易日期权估值计算上下文 /// class YdOptionCalculateContext : InnerOptionValueCalcContext { readonly ITradeHisDataProvider _ydTradeHisDataProvider; public YdOptionCalculateContext(DateTime valueDate, IOtcTradeValueCalcContext baseContext, IEodPriceProvider eodPriceProvider, ITradeHisDataProvider ydTradeHisDataProvider, SettlementTypeEnum settlementType) : base(valueDate, baseContext) { if (eodPriceProvider is null) { throw new ArgumentNullException(nameof(eodPriceProvider)); } DataProvider = new OptionCalcDataProvider(baseContext.DataProvider) { UnderlyingPriceProvider = new EodPriceProviderWrap(eodPriceProvider, settlementType) }; _ydTradeHisDataProvider = ydTradeHisDataProvider ?? throw new ArgumentNullException(nameof(ydTradeHisDataProvider)); CalcDeltaT1 = false; } public override bool IsPreciseTimeMode => false; public override PricingRequest GetPricingRequest(OtcTradeBase trade) { if (CalcScenario == CalcScenarioEnum.RealtimeRisk && !string.IsNullOrEmpty(PS.Config.ErpElement.RealtimeRisk_SkipTradeTypes) && PS.Config.ErpElement.RealtimeRisk_SkipTradeTypes.Contains(trade.TradeType)) { return PricingRequest.None; } return PricingRequest.Pv; } /// /// 获取交易的无风险利率 /// public override double GetRiskFreeRate(OtcTradeBase trade) { return _ydTradeHisDataProvider.GetNoRiskRate(trade.id) ?? trade.NoRiskRate ?? SysRiskFreeRate; } /// /// 获取交易的分红率 /// public override double GetDividendRate(OtcTradeBase trade) { return _ydTradeHisDataProvider.GetDividendRate(trade.id) ?? GetRiskFreeRate(trade); } public override string ToString() { return base.ToString() + "--" + DataProvider.UnderlyingPriceProvider.ToString(); } } }