152 lines
5.1 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|