Files
zszq-trs/YLErpDAL/Modules/DataProviderModule/Volatility/OtcEodOverrideVolProvider.cs
T
2024-05-09 14:06:26 +08:00

67 lines
1.9 KiB
C#

using System.Collections.Concurrent;
using YLErp.Abstract;
namespace YLErp.Modules.DataProviderModule
{
/// <summary>
/// 场外期权结算波动率提供
/// </summary>
public class OtcEodOverrideVolProvider : IDataUpdater, IJsonSerializable
{
readonly DateTime _valueDate;
//数据ID做为KEY
readonly ConcurrentDictionary<int, double?> _dic;
/// <summary>
/// 构造函数
/// </summary>
public OtcEodOverrideVolProvider(DateTime valueDate)
{
_valueDate = valueDate;
_dic = new ConcurrentDictionary<int, double?>();
}
public string TableName => nameof(eod_trade_vol_override);
/// <summary>
/// 获取交易波动率
/// </summary>
public double? GetVol(int tradeId, DateTime valueDate)
{
System.Diagnostics.Debug.Assert(_valueDate == valueDate);
if (!_dic.TryGetValue(tradeId, out double? vol))
{
vol = DbContextFactory.GetYLDbContext().eod_trade_vol_override
.Where(n => n.valuedate == valueDate && n.tradeid == tradeId)
.Select(n => (double?)n.vol).FirstOrDefault();
_dic.AddOrUpdate(tradeId, vol, (n, m) => vol);
}
if (vol == null)
{
return null;
}
return Convert.ToDouble(vol.Value);
}
/// <summary>
/// 更新数据
/// </summary>
public void UpdateData(IEnumerable<string> updateKeyIds)
{
var tradeIds = DataConvert.ConvertToInt32Array(updateKeyIds);
foreach (var tradeId in tradeIds)
{
_dic.TryRemove(tradeId, out _);
}
}
public string ToJson()
{
return new { _valueDate, _dic }.ToJson();
}
}
}