100 lines
2.7 KiB
C#
100 lines
2.7 KiB
C#
namespace YLErp.Modules.VolatilityModule
|
|
{
|
|
/// <summary>
|
|
/// 光证波动率数据提供
|
|
/// </summary>
|
|
public class VarietyVolProvider
|
|
{
|
|
readonly DateTime _valueDate;
|
|
|
|
Dictionary<int, double?> _dicData;
|
|
|
|
public VarietyVolProvider(DateTime valueDate)
|
|
{
|
|
_valueDate = valueDate.Date;
|
|
}
|
|
|
|
private void Initialize()
|
|
{
|
|
if (_dicData != null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
lock (this)
|
|
{
|
|
if (_dicData != null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//只取3个月以内的
|
|
var startDate = _valueDate.AddMonths(-3);
|
|
|
|
using (var db = DbContextFactory.GetYLDbContext())
|
|
{
|
|
var query1 = from a in db.variety_vol
|
|
where a.ValueDate > startDate && a.ValueDate <= _valueDate
|
|
group a by a.VarietyId into g
|
|
select new { VarietyId = g.Key, ValueDate = g.Max(n => n.ValueDate) };
|
|
|
|
var query2 = from a in query1
|
|
join b in db.variety_vol on a equals new { b.VarietyId, b.ValueDate }
|
|
select new { b.VarietyId, b.Vol };
|
|
|
|
_dicData = query2.ToDictionary(n => n.VarietyId, m => (double?)m.Vol);
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool TryGetVol(int varietyId, out double vol)
|
|
{
|
|
vol = 0;
|
|
|
|
if (varietyId < 1)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Initialize();
|
|
|
|
if (!_dicData.TryGetValue(varietyId, out var dvol))
|
|
{
|
|
using (var db = DbContextFactory.GetYLDbContext())
|
|
{
|
|
_dicData[varietyId] = dvol = db.variety_vol
|
|
.Where(v => v.VarietyId == varietyId && v.ValueDate <= _valueDate)
|
|
.OrderByDescending(v => v.ValueDate).Select(n => (double?)n.Vol).FirstOrDefault();
|
|
}
|
|
}
|
|
|
|
if (dvol.HasValue)
|
|
{
|
|
vol = dvol.Value;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public bool TryGetVol(string underlyingCode, out double vol)
|
|
{
|
|
vol = 0;
|
|
|
|
if (string.IsNullOrWhiteSpace(underlyingCode))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
var un = DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingCode);
|
|
|
|
if (un != null)
|
|
{
|
|
return TryGetVol(un.UnderlyingTypeId, out vol);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|