Files
zszq-trs/YLErpDAL/Modules/VolatilityModule/Providers/TradeHedgeVolProvider.cs
T
2024-05-09 14:06:26 +08:00

88 lines
2.7 KiB
C#

namespace YLErp.Modules.VolatilityModule
{
/// <summary>
/// 交易对冲波动率数据提供
/// </summary>
public class TradeHedgeVolProvider
{
readonly DateTime _valueDate;
Dictionary<int, double?> _dicData;
public TradeHedgeVolProvider(DateTime valueDate)
{
_valueDate = valueDate.Date;
}
/// <summary>
/// 如果设为true程序内部将不会再进行数据初始化,
/// 这样做的目的是为了少量数据获取时避免初始化带来的性能损失
/// </summary>
public bool Initialized { get; set; }
private void Initialize()
{
if (_dicData != null)
{
return;
}
lock (this)
{
if (_dicData != null)
{
return;
}
if (Initialized)
{
_dicData = new Dictionary<int, double?>();
}
else
{
//只取3个月以内的
var startDate = _valueDate.AddMonths(-3);
using (var db = DbContextFactory.GetYLDbContext())
{
var query1 = from a in db.trade_hedge_vol
where a.ValueDate > startDate && a.ValueDate <= _valueDate
group a by a.TradeId into g
select new { TradeId = g.Key, ValueDate = g.Max(n => n.ValueDate) };
var query2 = from a in query1
join b in db.trade_hedge_vol on a equals new { b.TradeId, b.ValueDate }
select new { b.TradeId, b.TradeSavedVol };
_dicData = query2.ToDictionary(n => n.TradeId, m => (double?)m.TradeSavedVol);
}
}
}
}
public bool TryGetVol(int tradeId, out double vol)
{
Initialize();
if (!_dicData.TryGetValue(tradeId, out var dvol) && tradeId > 0)
{
using (var db = DbContextFactory.GetYLDbContext())
{
_dicData[tradeId] = dvol = db.trade_hedge_vol
.Where(v => v.TradeId == tradeId && v.ValueDate <= _valueDate)
.OrderByDescending(v => v.ValueDate).Select(n => (double?)n.TradeSavedVol).FirstOrDefault();
}
}
if (dvol.HasValue)
{
vol = dvol.Value;
return true;
}
vol = 0;
return false;
}
}
}