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

144 lines
4.0 KiB
C#

using YieldChain.Commons;
using YLErp.Abstract.DataProviders;
using YLErp.Models;
namespace YLErp.Modules.DataProviderModule
{
/// <summary>
/// 期权现价提供
/// </summary>
public class ExchangeOptionPriceProvider : IPriceProvider
{
readonly bool _initializeAll;
readonly IDictionary<string, PriceModel> _priceDic;
/// <summary>
///
/// </summary>
/// <param name="initializeAll">是否初始化全部数据</param>
public ExchangeOptionPriceProvider(bool initializeAll = true)
{
_initializeAll = initializeAll;
_priceDic = initializeAll
? InnerDataProvider.Default.GetPriceDic()
: new Dictionary<string, PriceModel>(StringComparer.OrdinalIgnoreCase);
}
/// <summary>
///
/// </summary>
public double GetPrice(string optionCode)
{
return (InnerGetPrice(optionCode)?.Price) ?? 0;
}
/// <summary>
///
/// </summary>
public bool TryGetPrice(string optionCode, out double price)
{
var data = InnerGetPrice(optionCode);
if (data != null)
{
price = data.Price;
return true;
}
price = 0;
return false;
}
/// <summary>
///
/// </summary>
public bool TryGetPriceModel(string optionCode, out PriceModel priceModel)
{
return null != (priceModel = InnerGetPrice(optionCode));
}
private PriceModel InnerGetPrice(string optionCode)
{
if (string.IsNullOrEmpty(optionCode))
{
return null;
}
if (_priceDic.TryGetValue(optionCode, out var data))
{
return data;
}
if (_initializeAll)
{
return null;
}
using var db = DbContextFactory.GetYLDbContext();
data = db.exchange_list_option.Where(n => n.ContractCode == optionCode)
.Select(n => new PriceModel
{
InstrumentCode = n.ContractCode,
Price = n.Price ?? 0,
PriceTime = n.PriceTime
}).FirstOrDefault();
_priceDic[optionCode] = data;
return data;
}
/// <summary>
/// 内部数据提供以保证行情可以及时更新
/// </summary>
class InnerDataProvider
{
readonly ThrottleAction _updateThrottle;
readonly Dictionary<string, PriceModel> _priceDic;
private InnerDataProvider()
{
_updateThrottle = new ThrottleAction(UpdatePrice, 10);
_priceDic = new Dictionary<string, PriceModel>();
}
private void UpdatePrice()
{
using var db = DbContextFactory.GetYLDbContext();
var date = DateTime.Today.AddDays(-10);
var arr = db.exchange_list_option.Where(n => n.MaturityDate > date && n.ContractCode != null)
.Select(n => new PriceModel
{
InstrumentCode = n.ContractCode,
Price = n.Price ?? 0,
PriceTime = n.PriceTime
}).ToArray();
foreach (var item in arr)
{
_priceDic[item.InstrumentCode] = item;
}
}
public IDictionary<string, PriceModel> GetPriceDic()
{
_updateThrottle.Execute();
return new Dictionary<string, PriceModel>(_priceDic);
}
/// <summary>
/// 单例
/// </summary>
public static readonly InnerDataProvider Default;
static InnerDataProvider()
{
Default = new InnerDataProvider();
}
}
}
}