using YLErp.Abstract.DataProviders; using YLErp.Modules.EodModule; using YLErp.Modules.TradeRiskCalcModule.Abstract; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { internal class EodPositionDataProvider : ITradeRiskEodPositionDataProvider { readonly Dictionary _pVolOtcTradeDic; //持仓波动率场外交易数据 readonly Dictionary _hVolOtcTradeDic; //对冲波动率场外交易数据 readonly List _pVolExchTradeList; //持仓波动率场内交易数据 readonly List _hVolExchTradeList; //对冲波动率场内交易数据 public EodPositionDataProvider() { _pVolOtcTradeDic = new Dictionary(); _hVolOtcTradeDic = new Dictionary(); _pVolExchTradeList = new List(); _hVolExchTradeList = new List(); } #region----数据初始化---- public EodPositionDataProvider Initialize(DateTime positionDate, IUnderlyingDataProvider underlyingDataProvider) { if (underlyingDataProvider is null) { throw new ArgumentNullException(nameof(underlyingDataProvider)); } //初始化持仓波动率日终持仓数据 InitializePositionVolData(positionDate, underlyingDataProvider); //初始化对冲波动率日终持仓数据 InitializeHedgeVolData(positionDate, underlyingDataProvider); return this; } /// /// 初始化对冲波动率日终持仓数据 /// private void InitializePositionVolData(DateTime positionDate, IUnderlyingDataProvider underlyingDataProvider) { _pVolOtcTradeDic.Clear(); _pVolExchTradeList.Clear(); _pVolExchTradeList.Capacity = 500; var service = new EodSettlementService(OptUserInfo.SystemUser); var eodPositions = service.GetEodTradePosition(positionDate); LogFactory.GetLogger("实时风险").Debug($"获取'{positionDate:yyyy-MM-dd}'持仓波动率结算数据,数据总数:{eodPositions.Count()}"); foreach (var item in eodPositions) { if (item.Position.TradeId > 0) { _pVolOtcTradeDic[item.Position.TradeId] = item; } else if (item.Position.TradeType == "商品期货") { var un = underlyingDataProvider.GetUnderlying(item.Position.UnderlyingCode); if (un == null || un.MaturityDate.HasValue && DateTime.Compare(un.MaturityDate.Value, positionDate) > 0) { _pVolExchTradeList.Add(item.Position); } } else { _pVolExchTradeList.Add(item.Position); } } _pVolExchTradeList.TrimExcess(); } /// /// 初始化对冲波动率日终持仓数据 /// private void InitializeHedgeVolData(DateTime positionDate, IUnderlyingDataProvider underlyingDataProvider) { _hVolOtcTradeDic.Clear(); _hVolExchTradeList.Clear(); _hVolExchTradeList.Capacity = 500; var service = new EodSettlementService(OptUserInfo.SystemUser); var eodPositions2 = service.GetEodTradePosition(positionDate); LogFactory.GetLogger("实时风险").Debug($"获取'{positionDate:yyyy-MM-dd}'对冲波动率结算数据,数据总数:{eodPositions2.Count()}"); foreach (var item in eodPositions2) { if (item.Position.TradeId > 0) { _hVolOtcTradeDic[item.Position.TradeId] = item; } else if (item.Position.TradeType == "商品期货") { var un = underlyingDataProvider.GetUnderlying(item.Position.UnderlyingCode); if (un == null || un.MaturityDate.HasValue && DateTime.Compare(un.MaturityDate.Value, positionDate) > 0) { _hVolExchTradeList.Add(item.Position); } } else { _hVolExchTradeList.Add(item.Position); } } _hVolExchTradeList.TrimExcess(); } #endregion /// /// 根据交易ID和波动率类型获取场外交易 /// /// /// 对冲|持仓 /// public EodTradePositionAndRisk GetOtcTradePositionData(int tradeId, string volType) { return (volType == ConsGlobal.VolType.HedgingVol ? _hVolOtcTradeDic : _pVolOtcTradeDic) .TryGetValue(tradeId, out var item) ? item : null; } public IEnumerable GetExchangeTradePositionList(string volType) { return volType == ConsGlobal.VolType.HedgingVol && _hVolExchTradeList.Count > 0 ? _hVolExchTradeList : _pVolExchTradeList; } } }