using YLErp.Abstract;
using YLErp.Abstract.DataProviders;
using YLErp.Enums;
using YLErp.Modules.CalculationModule;
using YLErp.Modules.CalculationModule.Abstract;
using YLErp.Modules.TradeRiskCalcModule.Abstract;
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
{
///
/// 实时风险计算上下文
///
public class TradeRiskCalcContext : ITradeRiskCalcContext, IErrorHandler
{
readonly TradeRiskCalcDataProvider _dataProvider;
public TradeRiskCalcContext(string volType, bool isEodCalc, DateTime valueDate, DateTime preSettleDate, TradeRiskCalcDataProvider dataProvider)
{
VolType = volType;
IsEodCalc = isEodCalc;
ValueDate = valueDate;
PreSettleDate = preSettleDate;
//todo:多交易日历
PreValueDate = QdpModule.QdpCalendarHelper.GetNonHolidayDefore(valueDate.AddDays(-1));
_dataProvider = CalcCheckHelper.CheckOptionCalcDataProvider(dataProvider);
}
#region-----ITradeRiskCalcContext-----
///
/// 估值日期
///
public DateTime ValueDate { get; }
///
/// 上个交易日(场外交易计算用这个)
///
public DateTime PreValueDate { get; }
///
/// 上个结算日(在场外交易风险计算时这个用不上)
///
public DateTime PreSettleDate { get; }
///
/// 波动率类型
///
public string VolType { get; }
public bool IsEodCalc { get; }
///
/// 是否处于价格试算模式
///
public bool TrialCalclMode { get; set; }
///
/// 期权价值计算数据接口
///
public IOptionCalcDataProvider OptionCalcDataProvider => _dataProvider;
///
/// 上个交易日结算价接口
///
public IEodPriceProvider YdEodPriceProvider => _dataProvider.YdClosePriceProvider;
///
/// 上日交易历史数据接口
///
public ITradeHisDataProvider YdTradeHisDataProvider => _dataProvider.YdTradeHisDataProvider;
///
/// 上日持仓数据接口
///
public ITradeRiskEodPositionDataProvider YdEodPositionDataProvider => _dataProvider.YdEodPositionDataProvider;
///
/// 根据期权价值计算上下文生成对冲损益计算上下文
///
public IHedgePnlCalcContext CreateHedgePnlCalcContext(IOtcTradeValueCalcContext optionValueCaclContext)
{
return new TradeRiskHedgePnlCalcContext(optionValueCaclContext, new ExchangeTradeCommissionCalc()
, _dataProvider.ExchangeOptionPriceProvider)
{
ExchangeOptionPriceUseFlag = TrialCalclMode ? ExchangeOptionPriceUseFlag.TrialCalclMode : ExchangeOptionPriceUseFlag.SetExOptionPrice
};
}
///
/// 获取交易出入金
///
public IEnumerable GetTrade_Cashes(IEnumerable tradeIds)
{
return _dataProvider.GetTrade_Cashes(tradeIds);
}
///
/// 创建场外交易计算上下文
///
public IOtcTradeValueCalcContext CreateOptionValueCalcContext(double sysRiskFreeRate)
{
return new InnerOptionValueCalcContext(VolType, IsEodCalc, ValueDate, sysRiskFreeRate, _dataProvider)
{
AddingVolRate = 0,
ErrorHandler = this,
CalcScenario = CalcScenarioEnum.RealtimeRisk,
CalcDeltaT1 = TradeRiskHelper.IsCalcDeltaT1()
};
}
#endregion
#region----IErrorHandler----
List _errorList;
public bool HasError => _errorList != null && _errorList.Count > 0;
public void AddError(string error)
{
if (_errorList == null)
{
_errorList = new List();
}
_errorList.Add(error);
}
public IEnumerable GetErrors()
{
return _errorList ?? Enumerable.Empty();
}
#endregion
}
}