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

83 lines
2.2 KiB
C#

using YLErp.Modules.CalculationModule;
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
{
/// <summary>
/// 为亚式期权交易获取fixing数据
/// 支持缓存处理提升实时计算性能
/// </summary>
class AsiaOptionProvider
{
DateTime _lastUpTime;
readonly Dictionary<string, string> _cacheDic;
private AsiaOptionProvider()
{
_cacheDic = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
/// <summary>
/// 更新缓存(存留3分钟)
/// </summary>
public void UpdateCache()
{
if (_lastUpTime.AddMinutes(3) < DateTime.Now || _lastUpTime > DateTime.Now)
{
lock (_cacheDic)
{
_cacheDic.Clear();
}
_lastUpTime = DateTime.Now;
}
}
/// <summary>
/// 为亚式期权交易获取fixing数据
/// </summary>
public string GetFixingString(DateTime valueDate, OtcTradeBase otcTrade, trade_asian_option asianOption)
{
if (otcTrade is null)
{
throw new ArgumentNullException(nameof(otcTrade));
}
if (asianOption is null)
{
throw new ArgumentNullException(nameof(asianOption));
}
var startDate = asianOption.AveragingPeriodStartDate ?? otcTrade.TradeDate;
if (!startDate.HasValue)
{
return string.Empty;
}
var cacheKey = $"{otcTrade.UnderlyingCode}^{valueDate:yyMMdd}^{startDate.Value:yyMMdd}";
if (_cacheDic.TryGetValue(cacheKey, out var fixing))
{
return fixing;
}
fixing = AsianOptionFixingService.GetFixingString(valueDate, otcTrade, asianOption);
lock (_cacheDic)
{
_cacheDic[cacheKey] = fixing;
}
return fixing;
}
public static readonly AsiaOptionProvider Default;
static AsiaOptionProvider()
{
Default = new AsiaOptionProvider();
}
}
}