136 lines
5.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|