67 lines
1.9 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|