using System.Collections.Concurrent; using YLErp.Abstract; namespace YLErp.Modules.DataProviderModule { /// /// 场外期权对冲波动率提供 /// public class OtcHedgingVolProvider : IDataUpdater, IJsonSerializable { readonly DateTime _valueDate; //使用tradeid做为主键 readonly ConcurrentDictionary _dic; //业务操作上来说,旧的波动率不会再变更 readonly ConcurrentDictionary _dicOld; /// /// 构造函数 /// /// 当前结算日期 public OtcHedgingVolProvider(DateTime valueDate) { _valueDate = valueDate; _dic = new ConcurrentDictionary(); _dicOld = new ConcurrentDictionary(); } public string TableName => nameof(trade_hedge_vol); /// /// 获取交易波动率 /// public double? GetVol(int tradeId, DateTime valueDate) { var dic = valueDate < _valueDate ? _dicOld : _dic; if (!dic.TryGetValue(tradeId, out double? vol)) { vol = DbContextFactory.GetYLDbContext().trade_hedge_vol .Where(n => n.TradeId == tradeId && n.ValueDate <= valueDate) .OrderByDescending(n => n.ValueDate) .Select(n => (double?)n.TradeSavedVol).FirstOrDefault(); dic.AddOrUpdate(tradeId, vol, (n, m) => vol); } return vol; } /// /// 更新数据 /// public void UpdateData(IEnumerable updateKeyIds) { var tradeIds = DataConvert.ConvertToInt32Array(updateKeyIds); foreach (var tradeId in tradeIds) { _dic.TryRemove(tradeId, out _); } } public string ToJson() { return new { _valueDate, _dic, _dicOld }.ToJson(); } } }