using YLErp.Abstract; using YLErp.Abstract.DataProviders; using YLErp.Modules.CalculationModule.Abstract; using YLErp.Modules.DataProviderModule; using YLErp.Modules.TradeRiskCalcModule.Abstract; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// 确保数据的可控和可度量 /// public partial class TradeRiskCalcDataProvider : IOptionCalcDataProvider { readonly TradeExtendDataProvider _tradeExtendDataProvider; readonly IYcLogger _logger; DateTime _lastSettlementDate; EodPriceProvider _ydPriceProvider; ExchangeOptionPriceProvider _exchangeOptionPriceProvider; public TradeRiskCalcDataProvider(IPriceProvider priceProvider = null, IYcLogger logger = null) { _logger = logger ?? LogFactory.GetLogger("实时风险计算"); _tradeExtendDataProvider = new TradeExtendDataProvider(); UnderlyingDataProvider = new UnderlyingDataProvider(); UnderlyingPriceProvider = priceProvider ?? new TradeRiskCalcPriceProvider(); } /// /// 场内期权市场价格提供者 /// public ExchangeOptionPriceProvider ExchangeOptionPriceProvider { get { return _exchangeOptionPriceProvider ?? (_exchangeOptionPriceProvider = new ExchangeOptionPriceProvider()); } } /// /// 上个结算日历史交易数据接口 /// public ITradeHisDataProvider YdTradeHisDataProvider { get; private set; } /// /// 上个结算日日终价格数据接口 /// public IEodPriceProvider YdClosePriceProvider => _ydPriceProvider; /// /// 上日持仓数据接口 /// public ITradeRiskEodPositionDataProvider YdEodPositionDataProvider { get; private set; } = new EodPositionDataProvider(); #region ----IOptionCalcDataProvider---- public IUnderlyingDataProvider UnderlyingDataProvider { get; } public ITradeExtendDataProvider TradeExtendDataProvider => _tradeExtendDataProvider; public IVolatilityDataProvider VolatilityDataProvider { get; private set; } public IPriceProvider UnderlyingPriceProvider { get; private set; } #endregion #region------初始化数据------ /// /// 初始化数据 /// public void InitData(DateTime lastSettleDate, IVolatilityDataProvider volatilityProvider) { //解决价格不能及时更新的问题 _exchangeOptionPriceProvider = null; if (UnderlyingPriceProvider is TradeRiskCalcPriceProvider priceProvider) { priceProvider.Clear(); } VolatilityDataProvider = volatilityProvider ?? throw new ArgumentNullException(nameof(volatilityProvider)); if (_lastSettlementDate != lastSettleDate) { using (var db = DbContextFactory.GetYLDbContext()) { //结算价 _ydPriceProvider = new EodPriceProvider(lastSettleDate, isDiviendPrice: true).Initialize(); _logger?.Debug("更新上一结算日结算价,数据总数:" + _ydPriceProvider.Count); //持仓 YdEodPositionDataProvider = new EodPositionDataProvider() .Initialize(lastSettleDate, UnderlyingDataProvider); } //存留 _lastSettlementDate = lastSettleDate; YdTradeHisDataProvider = new TradeHisDataProvider(_lastSettlementDate); } AsiaOptionProvider.Default.UpdateCache(); } #endregion #region--------Others---------- /// /// 根据交易ID数组获取对应的入金信息 /// public IEnumerable GetTrade_Cashes(IEnumerable tradeIds) { using (var db = DbContextFactory.GetYLDbContext()) { //在使用时会判断ValidState(猜测是为新增待确认的交易) return db.trade_cash.Where(t => tradeIds.Contains(t.TradeId) && !t.IsDeleted).ToList(); } } #endregion #region-----Inner Classes------ /// /// 日终价格类 /// class InnerEodPrice { public string UnderlyingCode { get; set; } public double? ClosePrice { get; set; } } #endregion /// /// 克隆此对象并使用方法参数中的价格提供接口 /// public TradeRiskCalcDataProvider Clone(IPriceProvider underlyingPriceProvider) { var clone = (TradeRiskCalcDataProvider)MemberwiseClone(); clone.UnderlyingPriceProvider = underlyingPriceProvider ?? throw new ArgumentNullException(nameof(underlyingPriceProvider)); return clone; } } }