从山证v2.3.0拷贝
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
using System.Collections.Concurrent;
|
||||
using YLErp.Abstract;
|
||||
using YLErp.Models;
|
||||
|
||||
namespace YLErp.Modules.DataProviderModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 场外期权开仓平仓波动率提供
|
||||
/// </summary>
|
||||
public class OtcPositionVolProvider : IDataUpdater, IJsonSerializable
|
||||
{
|
||||
readonly DateTime _valueDate;
|
||||
//使用tradeid做为主键,为当日取波动率提供服务
|
||||
readonly ConcurrentDictionary<int, IOtcTradeVolatility> _dic;
|
||||
//业务操作上来说,旧的波动率不会再变更,为上一交易日取波动率提供服务
|
||||
readonly ConcurrentDictionary<int, IOtcTradeVolatility> _dicOld;
|
||||
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
/// <param name="valueDate">当前结算日期</param>
|
||||
public OtcPositionVolProvider(DateTime valueDate)
|
||||
{
|
||||
_valueDate = valueDate;
|
||||
_dic = new ConcurrentDictionary<int, IOtcTradeVolatility>();
|
||||
_dicOld = new ConcurrentDictionary<int, IOtcTradeVolatility>();
|
||||
}
|
||||
|
||||
public string TableName => nameof(TradeVolatility);
|
||||
|
||||
/// <summary>
|
||||
/// 获取交易波动率
|
||||
/// </summary>
|
||||
public IOtcTradeVolatility GetVol(int tradeId, DateTime valueDate)
|
||||
{
|
||||
var dic = valueDate < _valueDate ? _dicOld : _dic;
|
||||
if (!dic.TryGetValue(tradeId, out var vol))
|
||||
{
|
||||
var tradVol = DbContextFactory.GetYLDbContext().TradeVolatility
|
||||
.Where(n => n.TradeId == tradeId && n.ValueDate <= valueDate)
|
||||
.OrderByDescending(n => n.ValueDate)
|
||||
.Select(n => new
|
||||
{
|
||||
n.NumOfSmoothingDays,
|
||||
n.TradePositionVolatility,
|
||||
n.TradeCloseVolatility,
|
||||
n.IsFromTradeAdd,
|
||||
n.ValueDate
|
||||
}).FirstOrDefault();
|
||||
|
||||
if (tradVol != null)
|
||||
{
|
||||
vol = new OtcTradeVolatility
|
||||
{
|
||||
ValueDate = tradVol.ValueDate,
|
||||
OpenVol = tradVol.TradePositionVolatility ?? 0,
|
||||
CloseVol = tradVol.TradeCloseVolatility ?? 0,
|
||||
SmoothingDays = tradVol.NumOfSmoothingDays ?? 0,
|
||||
IsFirst = tradVol.IsFromTradeAdd == true
|
||||
};
|
||||
}
|
||||
dic.AddOrUpdate(tradeId, vol, (n, m) => vol);
|
||||
}
|
||||
return vol;
|
||||
}
|
||||
|
||||
public string ToJson()
|
||||
{
|
||||
return new { _valueDate, _dic, _dicOld }.ToJson();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新数据
|
||||
/// </summary>
|
||||
public void UpdateData(IEnumerable<string> updateKeyIds)
|
||||
{
|
||||
var tradeIds = DataConvert.ConvertToInt32Array(updateKeyIds);
|
||||
foreach (var tradeId in tradeIds)
|
||||
{
|
||||
_dic.TryRemove(tradeId, out IOtcTradeVolatility vol);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user