65 lines
2.0 KiB
C#
65 lines
2.0 KiB
C#
using System.Collections.Concurrent;
|
|
using YLErp.Abstract;
|
|
using YLErp.Modules.ExchangeOptionTradeModule;
|
|
|
|
namespace YLErp.Modules.DataProviderModule
|
|
{
|
|
/// <summary>
|
|
/// 场内期权保存波动率提供
|
|
/// </summary>
|
|
public class ExOptionSavedVolProvider : IDataUpdater, IJsonSerializable
|
|
{
|
|
readonly DateTime _valueDate;
|
|
//使用场内期权代码做为主键
|
|
readonly ConcurrentDictionary<string, double?> _dic;
|
|
//业务操作上来说,旧的波动率不会再变更
|
|
readonly ConcurrentDictionary<string, double?> _dicOld;
|
|
|
|
/// <summary>
|
|
/// 构造函数
|
|
/// </summary>
|
|
/// <param name="valueDate">当前结算日期</param>
|
|
public ExOptionSavedVolProvider(DateTime valueDate)
|
|
{
|
|
_valueDate = valueDate;
|
|
_dic = new ConcurrentDictionary<string, double?>();
|
|
_dicOld = new ConcurrentDictionary<string, double?>();
|
|
}
|
|
|
|
public string TableName => nameof(ExchangeOptionVol);
|
|
|
|
/// <summary>
|
|
/// 获取交易波动率
|
|
/// </summary>
|
|
public double? GetSavedVol(string optionCode, DateTime valueDate)
|
|
{
|
|
var dic = valueDate < _valueDate ? _dicOld : _dic;
|
|
if (!dic.TryGetValue(optionCode, out var vol))
|
|
{
|
|
vol = new ExchangeOptionVolQueryService(OptUserInfo.SystemUser).GetSavedVol(optionCode, valueDate);
|
|
dic.AddOrUpdate(optionCode, vol, (n, m) => vol);
|
|
}
|
|
return vol;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新数据--keyid为optionCode
|
|
/// </summary>
|
|
public void UpdateData(IEnumerable<string> updateKeyIds)
|
|
{
|
|
foreach (var optionCode in updateKeyIds)
|
|
{
|
|
if (optionCode != null)
|
|
{
|
|
_dic.TryRemove(optionCode, out _);
|
|
}
|
|
}
|
|
}
|
|
|
|
public string ToJson()
|
|
{
|
|
return new { _valueDate, _dic, _dicOld }.ToJson();
|
|
}
|
|
}
|
|
}
|