using YLErp.Abstract; using YLErp.Abstract.DataProviders; using YLErp.Enums; using YLErp.Modules.CalculationModule; using YLErp.Modules.CalculationModule.Abstract; using YLErp.Modules.TradeRiskCalcModule.Abstract; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// 实时风险计算上下文 /// public class TradeRiskCalcContext : ITradeRiskCalcContext, IErrorHandler { readonly TradeRiskCalcDataProvider _dataProvider; public TradeRiskCalcContext(string volType, bool isEodCalc, DateTime valueDate, DateTime preSettleDate, TradeRiskCalcDataProvider dataProvider) { VolType = volType; IsEodCalc = isEodCalc; ValueDate = valueDate; PreSettleDate = preSettleDate; //todo:多交易日历 PreValueDate = QdpModule.QdpCalendarHelper.GetNonHolidayDefore(valueDate.AddDays(-1)); _dataProvider = CalcCheckHelper.CheckOptionCalcDataProvider(dataProvider); } #region-----ITradeRiskCalcContext----- /// /// 估值日期 /// public DateTime ValueDate { get; } /// /// 上个交易日(场外交易计算用这个) /// public DateTime PreValueDate { get; } /// /// 上个结算日(在场外交易风险计算时这个用不上) /// public DateTime PreSettleDate { get; } /// /// 波动率类型 /// public string VolType { get; } public bool IsEodCalc { get; } /// /// 是否处于价格试算模式 /// public bool TrialCalclMode { get; set; } /// /// 期权价值计算数据接口 /// public IOptionCalcDataProvider OptionCalcDataProvider => _dataProvider; /// /// 上个交易日结算价接口 /// public IEodPriceProvider YdEodPriceProvider => _dataProvider.YdClosePriceProvider; /// /// 上日交易历史数据接口 /// public ITradeHisDataProvider YdTradeHisDataProvider => _dataProvider.YdTradeHisDataProvider; /// /// 上日持仓数据接口 /// public ITradeRiskEodPositionDataProvider YdEodPositionDataProvider => _dataProvider.YdEodPositionDataProvider; /// /// 根据期权价值计算上下文生成对冲损益计算上下文 /// public IHedgePnlCalcContext CreateHedgePnlCalcContext(IOtcTradeValueCalcContext optionValueCaclContext) { return new TradeRiskHedgePnlCalcContext(optionValueCaclContext, new ExchangeTradeCommissionCalc() , _dataProvider.ExchangeOptionPriceProvider) { ExchangeOptionPriceUseFlag = TrialCalclMode ? ExchangeOptionPriceUseFlag.TrialCalclMode : ExchangeOptionPriceUseFlag.SetExOptionPrice }; } /// /// 获取交易出入金 /// public IEnumerable GetTrade_Cashes(IEnumerable tradeIds) { return _dataProvider.GetTrade_Cashes(tradeIds); } /// /// 创建场外交易计算上下文 /// public IOtcTradeValueCalcContext CreateOptionValueCalcContext(double sysRiskFreeRate) { return new InnerOptionValueCalcContext(VolType, IsEodCalc, ValueDate, sysRiskFreeRate, _dataProvider) { AddingVolRate = 0, ErrorHandler = this, CalcScenario = CalcScenarioEnum.RealtimeRisk, CalcDeltaT1 = TradeRiskHelper.IsCalcDeltaT1() }; } #endregion #region----IErrorHandler---- List _errorList; public bool HasError => _errorList != null && _errorList.Count > 0; public void AddError(string error) { if (_errorList == null) { _errorList = new List(); } _errorList.Add(error); } public IEnumerable GetErrors() { return _errorList ?? Enumerable.Empty(); } #endregion } }