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;
}
}
}
}