83 lines
2.2 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|