using Microsoft.Extensions.DependencyInjection; using YieldChain.Commons; using YLErp.Cache; using YLErp.Modules.CalculationModule; using static YLErp.ConsGlobal; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// 场内实时持仓运行 /// class ExchangePositionRunner : InnerRunnerBase { readonly static IYLCache ylCache; static ExchangePositionRunner() { ylCache = YLServiceLocator.ServiceProvider.GetService(); } public override string ToString() { return "场内持仓"; } /// /// 对冲持仓计算结果 /// public ExchangePositionCalcResult Result { get; private set; } /// /// 执行任务 /// public override void StartTask(InnerRunTaskData taskData) { if (!taskData.IsReady) { return; } if (IsRunning) { lock (this) { if (IsRunning) { //120秒的超时时间 if (IsTimeOut(120)) { CancelTask(5000); } else { return; } } } } else { lock (this) { //3秒的频次控制 if (IsRunning || !IsTimeOut(3)) { return; } } } AppManager.SetSysInfo("场内实时持仓API-计算开始", "开始"); InnerStartTask(() => { //获取所有未结算过的对冲交易 var newTrades = taskData.TradeDataSource.GetExchangeTrades() ?? Enumerable.Empty(); //昨日持仓信息 var lastEodPositions = taskData.DataProvider.YdEodPositionDataProvider.GetExchangeTradePositionList("持仓").ToArray(); var resultItems = new ExchangePositionCalcService(taskData.ValueDate, new ExchangeTradeCommissionCalc()) .Calculate(newTrades, lastEodPositions, taskData.DataProvider.ExchangeOptionPriceProvider); //如果结果的开始时间大于当前任务的开始时间则丢失计算结果 var result = GetResult(); if (result == null || result.StartTime < StartTime) { result = new ExchangePositionCalcResult(StartTime) { Items = resultItems, ValueDate = taskData.ValueDate, LastDate = taskData.PreSettleDate }; SaveResult(result); AppManager.SetSysInfo("场内实时持仓API-计算完成", "耗时" + (DateTime.Now - StartTime).TotalSeconds.ToString("F") + "ms"); } }).ContinueWith(t => { if (t.Exception != null) { LogFactory.GetLogger("实时风险").Error(t.Exception, $"[场内实时持仓API]计算出错"); } else { LogFactory.GetLogger("实时风险").Debug($"[场内实时持仓API]计算完成"); } InnerCompleteTask(); }); } private const string ExchangePositionCalcResultRedisKey = "ExchangePosition"; /// /// 将结果保存 /// private void SaveResult(ExchangePositionCalcResult result) { if (ylCache.CacheEnable()) { ylCache.StringSet($"{ExchangePositionCalcResultRedisKey}", result); } else { Result = result; } } /// /// 查询结果 /// /// public ExchangePositionCalcResult GetResult() { if (ylCache.CacheEnable()) { return ylCache.StringGet($"{ExchangePositionCalcResultRedisKey}"); } else { return Result; } } } }