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

136 lines
5.4 KiB
C#

using YLErp.Abstract.DataProviders;
using YLErp.Modules.EodModule;
using YLErp.Modules.TradeRiskCalcModule.Abstract;
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
{
internal class EodPositionDataProvider : ITradeRiskEodPositionDataProvider
{
readonly Dictionary<int, EodTradePositionAndRisk> _pVolOtcTradeDic; //持仓波动率场外交易数据
readonly Dictionary<int, EodTradePositionAndRisk> _hVolOtcTradeDic; //对冲波动率场外交易数据
readonly List<EodTradePosition> _pVolExchTradeList; //持仓波动率场内交易数据
readonly List<EodTradePosition> _hVolExchTradeList; //对冲波动率场内交易数据
public EodPositionDataProvider()
{
_pVolOtcTradeDic = new Dictionary<int, EodTradePositionAndRisk>();
_hVolOtcTradeDic = new Dictionary<int, EodTradePositionAndRisk>();
_pVolExchTradeList = new List<EodTradePosition>();
_hVolExchTradeList = new List<EodTradePosition>();
}
#region----数据初始化----
public EodPositionDataProvider Initialize(DateTime positionDate, IUnderlyingDataProvider underlyingDataProvider)
{
if (underlyingDataProvider is null)
{
throw new ArgumentNullException(nameof(underlyingDataProvider));
}
//初始化持仓波动率日终持仓数据
InitializePositionVolData(positionDate, underlyingDataProvider);
//初始化对冲波动率日终持仓数据
InitializeHedgeVolData(positionDate, underlyingDataProvider);
return this;
}
/// <summary>
/// 初始化对冲波动率日终持仓数据
/// </summary>
private void InitializePositionVolData(DateTime positionDate, IUnderlyingDataProvider underlyingDataProvider)
{
_pVolOtcTradeDic.Clear();
_pVolExchTradeList.Clear();
_pVolExchTradeList.Capacity = 500;
var service = new EodSettlementService(OptUserInfo.SystemUser);
var eodPositions = service.GetEodTradePosition<eod_trade_position, eod_trade_risk>(positionDate);
LogFactory.GetLogger("实时风险").Debug($"获取'{positionDate:yyyy-MM-dd}'持仓波动率结算数据,数据总数:{eodPositions.Count()}");
foreach (var item in eodPositions)
{
if (item.Position.TradeId > 0)
{
_pVolOtcTradeDic[item.Position.TradeId] = item;
}
else if (item.Position.TradeType == "商品期货")
{
var un = underlyingDataProvider.GetUnderlying(item.Position.UnderlyingCode);
if (un == null || un.MaturityDate.HasValue && DateTime.Compare(un.MaturityDate.Value, positionDate) > 0)
{
_pVolExchTradeList.Add(item.Position);
}
}
else
{
_pVolExchTradeList.Add(item.Position);
}
}
_pVolExchTradeList.TrimExcess();
}
/// <summary>
/// 初始化对冲波动率日终持仓数据
/// </summary>
private void InitializeHedgeVolData(DateTime positionDate, IUnderlyingDataProvider underlyingDataProvider)
{
_hVolOtcTradeDic.Clear();
_hVolExchTradeList.Clear();
_hVolExchTradeList.Capacity = 500;
var service = new EodSettlementService(OptUserInfo.SystemUser);
var eodPositions2 = service.GetEodTradePosition<eod_trade_position_hedgevol, eod_trade_risk_hedgevol>(positionDate);
LogFactory.GetLogger("实时风险").Debug($"获取'{positionDate:yyyy-MM-dd}'对冲波动率结算数据,数据总数:{eodPositions2.Count()}");
foreach (var item in eodPositions2)
{
if (item.Position.TradeId > 0)
{
_hVolOtcTradeDic[item.Position.TradeId] = item;
}
else if (item.Position.TradeType == "商品期货")
{
var un = underlyingDataProvider.GetUnderlying(item.Position.UnderlyingCode);
if (un == null || un.MaturityDate.HasValue && DateTime.Compare(un.MaturityDate.Value, positionDate) > 0)
{
_hVolExchTradeList.Add(item.Position);
}
}
else
{
_hVolExchTradeList.Add(item.Position);
}
}
_hVolExchTradeList.TrimExcess();
}
#endregion
/// <summary>
/// 根据交易ID和波动率类型获取场外交易
/// </summary>
/// <param name="tradeId"></param>
/// <param name="volType">对冲|持仓</param>
/// <returns></returns>
public EodTradePositionAndRisk GetOtcTradePositionData(int tradeId, string volType)
{
return (volType == ConsGlobal.VolType.HedgingVol ? _hVolOtcTradeDic : _pVolOtcTradeDic)
.TryGetValue(tradeId, out var item) ? item : null;
}
public IEnumerable<EodTradePosition> GetExchangeTradePositionList(string volType)
{
return volType == ConsGlobal.VolType.HedgingVol && _hVolExchTradeList.Count > 0
? _hVolExchTradeList : _pVolExchTradeList;
}
}
}