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

152 lines
5.1 KiB
C#

using YLErp.Abstract;
using YLErp.Abstract.DataProviders;
using YLErp.Modules.CalculationModule.Abstract;
using YLErp.Modules.DataProviderModule;
using YLErp.Modules.TradeRiskCalcModule.Abstract;
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
{
/// <summary>
/// 确保数据的可控和可度量
/// </summary>
public partial class TradeRiskCalcDataProvider : IOptionCalcDataProvider
{
readonly TradeExtendDataProvider _tradeExtendDataProvider;
readonly IYcLogger _logger;
DateTime _lastSettlementDate;
EodPriceProvider _ydPriceProvider;
ExchangeOptionPriceProvider _exchangeOptionPriceProvider;
public TradeRiskCalcDataProvider(IPriceProvider priceProvider = null, IYcLogger logger = null)
{
_logger = logger ?? LogFactory.GetLogger("实时风险计算");
_tradeExtendDataProvider = new TradeExtendDataProvider();
UnderlyingDataProvider = new UnderlyingDataProvider();
UnderlyingPriceProvider = priceProvider ?? new TradeRiskCalcPriceProvider();
}
/// <summary>
/// 场内期权市场价格提供者
/// </summary>
public ExchangeOptionPriceProvider ExchangeOptionPriceProvider
{
get
{
return _exchangeOptionPriceProvider ?? (_exchangeOptionPriceProvider = new ExchangeOptionPriceProvider());
}
}
/// <summary>
/// 上个结算日历史交易数据接口
/// </summary>
public ITradeHisDataProvider YdTradeHisDataProvider { get; private set; }
/// <summary>
/// 上个结算日日终价格数据接口
/// </summary>
public IEodPriceProvider YdClosePriceProvider => _ydPriceProvider;
/// <summary>
/// 上日持仓数据接口
/// </summary>
public ITradeRiskEodPositionDataProvider YdEodPositionDataProvider { get; private set; } = new EodPositionDataProvider();
#region ----IOptionCalcDataProvider----
public IUnderlyingDataProvider UnderlyingDataProvider { get; }
public ITradeExtendDataProvider TradeExtendDataProvider => _tradeExtendDataProvider;
public IVolatilityDataProvider VolatilityDataProvider { get; private set; }
public IPriceProvider UnderlyingPriceProvider { get; private set; }
#endregion
#region------初始化数据------
/// <summary>
/// 初始化数据
/// </summary>
public void InitData(DateTime lastSettleDate, IVolatilityDataProvider volatilityProvider)
{
//解决价格不能及时更新的问题
_exchangeOptionPriceProvider = null;
if (UnderlyingPriceProvider is TradeRiskCalcPriceProvider priceProvider)
{
priceProvider.Clear();
}
VolatilityDataProvider = volatilityProvider ?? throw new ArgumentNullException(nameof(volatilityProvider));
if (_lastSettlementDate != lastSettleDate)
{
using (var db = DbContextFactory.GetYLDbContext())
{
//结算价
_ydPriceProvider = new EodPriceProvider(lastSettleDate, isDiviendPrice: true).Initialize();
_logger?.Debug("更新上一结算日结算价,数据总数:" + _ydPriceProvider.Count);
//持仓
YdEodPositionDataProvider = new EodPositionDataProvider()
.Initialize(lastSettleDate, UnderlyingDataProvider);
}
//存留
_lastSettlementDate = lastSettleDate;
YdTradeHisDataProvider = new TradeHisDataProvider(_lastSettlementDate);
}
AsiaOptionProvider.Default.UpdateCache();
}
#endregion
#region--------Others----------
/// <summary>
/// 根据交易ID数组获取对应的入金信息
/// </summary>
public IEnumerable<trade_cash> GetTrade_Cashes(IEnumerable<int> tradeIds)
{
using (var db = DbContextFactory.GetYLDbContext())
{
//在使用时会判断ValidState(猜测是为新增待确认的交易)
return db.trade_cash.Where(t => tradeIds.Contains(t.TradeId) && !t.IsDeleted).ToList();
}
}
#endregion
#region-----Inner Classes------
/// <summary>
/// 日终价格类
/// </summary>
class InnerEodPrice
{
public string UnderlyingCode { get; set; }
public double? ClosePrice { get; set; }
}
#endregion
/// <summary>
/// 克隆此对象并使用方法参数中的价格提供接口
/// </summary>
public TradeRiskCalcDataProvider Clone(IPriceProvider underlyingPriceProvider)
{
var clone = (TradeRiskCalcDataProvider)MemberwiseClone();
clone.UnderlyingPriceProvider = underlyingPriceProvider ?? throw new ArgumentNullException(nameof(underlyingPriceProvider));
return clone;
}
}
}