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
{
///
/// 确保数据的可控和可度量
///
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();
}
///
/// 场内期权市场价格提供者
///
public ExchangeOptionPriceProvider ExchangeOptionPriceProvider
{
get
{
return _exchangeOptionPriceProvider ?? (_exchangeOptionPriceProvider = new ExchangeOptionPriceProvider());
}
}
///
/// 上个结算日历史交易数据接口
///
public ITradeHisDataProvider YdTradeHisDataProvider { get; private set; }
///
/// 上个结算日日终价格数据接口
///
public IEodPriceProvider YdClosePriceProvider => _ydPriceProvider;
///
/// 上日持仓数据接口
///
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------初始化数据------
///
/// 初始化数据
///
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----------
///
/// 根据交易ID数组获取对应的入金信息
///
public IEnumerable GetTrade_Cashes(IEnumerable tradeIds)
{
using (var db = DbContextFactory.GetYLDbContext())
{
//在使用时会判断ValidState(猜测是为新增待确认的交易)
return db.trade_cash.Where(t => tradeIds.Contains(t.TradeId) && !t.IsDeleted).ToList();
}
}
#endregion
#region-----Inner Classes------
///
/// 日终价格类
///
class InnerEodPrice
{
public string UnderlyingCode { get; set; }
public double? ClosePrice { get; set; }
}
#endregion
///
/// 克隆此对象并使用方法参数中的价格提供接口
///
public TradeRiskCalcDataProvider Clone(IPriceProvider underlyingPriceProvider)
{
var clone = (TradeRiskCalcDataProvider)MemberwiseClone();
clone.UnderlyingPriceProvider = underlyingPriceProvider ?? throw new ArgumentNullException(nameof(underlyingPriceProvider));
return clone;
}
}
}