namespace YLErp.Modules.VolatilityModule { /// /// 光证波动率数据提供 /// public class VarietyVolProvider { readonly DateTime _valueDate; Dictionary _dicData; public VarietyVolProvider(DateTime valueDate) { _valueDate = valueDate.Date; } private void Initialize() { if (_dicData != null) { return; } lock (this) { if (_dicData != null) { return; } //只取3个月以内的 var startDate = _valueDate.AddMonths(-3); using (var db = DbContextFactory.GetYLDbContext()) { var query1 = from a in db.variety_vol where a.ValueDate > startDate && a.ValueDate <= _valueDate group a by a.VarietyId into g select new { VarietyId = g.Key, ValueDate = g.Max(n => n.ValueDate) }; var query2 = from a in query1 join b in db.variety_vol on a equals new { b.VarietyId, b.ValueDate } select new { b.VarietyId, b.Vol }; _dicData = query2.ToDictionary(n => n.VarietyId, m => (double?)m.Vol); } } } public bool TryGetVol(int varietyId, out double vol) { vol = 0; if (varietyId < 1) { return false; } Initialize(); if (!_dicData.TryGetValue(varietyId, out var dvol)) { using (var db = DbContextFactory.GetYLDbContext()) { _dicData[varietyId] = dvol = db.variety_vol .Where(v => v.VarietyId == varietyId && v.ValueDate <= _valueDate) .OrderByDescending(v => v.ValueDate).Select(n => (double?)n.Vol).FirstOrDefault(); } } if (dvol.HasValue) { vol = dvol.Value; return true; } return false; } public bool TryGetVol(string underlyingCode, out double vol) { vol = 0; if (string.IsNullOrWhiteSpace(underlyingCode)) { return false; } var un = DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingCode); if (un != null) { return TryGetVol(un.UnderlyingTypeId, out vol); } return false; } } }