using YLErp.Modules.CalculationModule; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// 为亚式期权交易获取fixing数据 /// 支持缓存处理提升实时计算性能 /// class AsiaOptionProvider { DateTime _lastUpTime; readonly Dictionary _cacheDic; private AsiaOptionProvider() { _cacheDic = new Dictionary(StringComparer.OrdinalIgnoreCase); } /// /// 更新缓存(存留3分钟) /// public void UpdateCache() { if (_lastUpTime.AddMinutes(3) < DateTime.Now || _lastUpTime > DateTime.Now) { lock (_cacheDic) { _cacheDic.Clear(); } _lastUpTime = DateTime.Now; } } /// /// 为亚式期权交易获取fixing数据 /// public string GetFixingString(DateTime valueDate, OtcTradeBase otcTrade, trade_asian_option asianOption) { if (otcTrade is null) { throw new ArgumentNullException(nameof(otcTrade)); } if (asianOption is null) { throw new ArgumentNullException(nameof(asianOption)); } var startDate = asianOption.AveragingPeriodStartDate ?? otcTrade.TradeDate; if (!startDate.HasValue) { return string.Empty; } var cacheKey = $"{otcTrade.UnderlyingCode}^{valueDate:yyMMdd}^{startDate.Value:yyMMdd}"; if (_cacheDic.TryGetValue(cacheKey, out var fixing)) { return fixing; } fixing = AsianOptionFixingService.GetFixingString(valueDate, otcTrade, asianOption); lock (_cacheDic) { _cacheDic[cacheKey] = fixing; } return fixing; } public static readonly AsiaOptionProvider Default; static AsiaOptionProvider() { Default = new AsiaOptionProvider(); } } }