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

136 lines
4.4 KiB
C#

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
{
/// <summary>
/// 实时风险计算上下文
/// </summary>
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-----
/// <summary>
/// 估值日期
/// </summary>
public DateTime ValueDate { get; }
/// <summary>
/// 上个交易日(场外交易计算用这个)
/// </summary>
public DateTime PreValueDate { get; }
/// <summary>
/// 上个结算日(在场外交易风险计算时这个用不上)
/// </summary>
public DateTime PreSettleDate { get; }
/// <summary>
/// 波动率类型
/// </summary>
public string VolType { get; }
public bool IsEodCalc { get; }
/// <summary>
/// 是否处于价格试算模式
/// </summary>
public bool TrialCalclMode { get; set; }
/// <summary>
/// 期权价值计算数据接口
/// </summary>
public IOptionCalcDataProvider OptionCalcDataProvider => _dataProvider;
/// <summary>
/// 上个交易日结算价接口
/// </summary>
public IEodPriceProvider YdEodPriceProvider => _dataProvider.YdClosePriceProvider;
/// <summary>
/// 上日交易历史数据接口
/// </summary>
public ITradeHisDataProvider YdTradeHisDataProvider => _dataProvider.YdTradeHisDataProvider;
/// <summary>
/// 上日持仓数据接口
/// </summary>
public ITradeRiskEodPositionDataProvider YdEodPositionDataProvider => _dataProvider.YdEodPositionDataProvider;
/// <summary>
/// 根据期权价值计算上下文生成对冲损益计算上下文
/// </summary>
public IHedgePnlCalcContext CreateHedgePnlCalcContext(IOtcTradeValueCalcContext optionValueCaclContext)
{
return new TradeRiskHedgePnlCalcContext(optionValueCaclContext, new ExchangeTradeCommissionCalc()
, _dataProvider.ExchangeOptionPriceProvider)
{
ExchangeOptionPriceUseFlag = TrialCalclMode ? ExchangeOptionPriceUseFlag.TrialCalclMode : ExchangeOptionPriceUseFlag.SetExOptionPrice
};
}
/// <summary>
/// 获取交易出入金
/// </summary>
public IEnumerable<trade_cash> GetTrade_Cashes(IEnumerable<int> tradeIds)
{
return _dataProvider.GetTrade_Cashes(tradeIds);
}
/// <summary>
/// 创建场外交易计算上下文
/// </summary>
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<string> _errorList;
public bool HasError => _errorList != null && _errorList.Count > 0;
public void AddError(string error)
{
if (_errorList == null)
{
_errorList = new List<string>();
}
_errorList.Add(error);
}
public IEnumerable<string> GetErrors()
{
return _errorList ?? Enumerable.Empty<string>();
}
#endregion
}
}