136 lines
4.4 KiB
C#
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
|
|
}
|
|
}
|