70 lines
2.8 KiB
C#
70 lines
2.8 KiB
C#
using System.Linq.Expressions;
|
|
using YLErp.BLL.Hedge;
|
|
using YLErp.Modules.CalculationModule;
|
|
using YLErp.Modules.CalculationModule.Abstract;
|
|
using YLErp.Modules.DataProviderModule;
|
|
using YLErp.Modules.EodModule;
|
|
|
|
namespace YLErp.Modules.ExchangeOptionTradeModule
|
|
{
|
|
/// <summary>
|
|
/// 日终场内期权风险计算服务
|
|
/// </summary>
|
|
public class EodExchangeOptionRiskCalcService : YLBaseService
|
|
{
|
|
private EodPriceProvider _eodPriceProvider = null;
|
|
|
|
EodExchangeOptionPriceProvider _eodExchangeOptionProvider;
|
|
|
|
public EodExchangeOptionRiskCalcService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
|
|
}
|
|
|
|
public EodExchangeOptionRiskCalcService(YLBaseService baseService) : base(baseService)
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 取结算日期的场内期权收盘持仓数据并进行风险计算
|
|
/// </summary>
|
|
/// <typeparam name="T">EodTradePositionBase</typeparam>
|
|
/// <param name="valueDate">结算日期</param>
|
|
/// <param name="volType">波动率类型</param>
|
|
/// <param name="predicate">数据过滤预测</param>
|
|
public IEnumerable<HedgePnl> CalculateEodRisk<T>(DateTime valueDate, string volType, bool useClosePrice, Expression<Func<T, bool>> predicate = null)
|
|
where T : EodTradePosition
|
|
{
|
|
if (volType is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(volType));
|
|
}
|
|
|
|
predicate = predicate == null
|
|
? PredicateBuilder.Create<T>(p => p.TradeType == "场内期权")
|
|
: PredicateBuilder.Create<T>(p => p.TradeType == "场内期权").And(predicate);
|
|
|
|
var oldHoldPosition = new EodSettlementService(this).GetEodTradePosition(valueDate, predicate);
|
|
|
|
if (_eodPriceProvider == null || _eodPriceProvider.ValueDate != valueDate)
|
|
{
|
|
_eodPriceProvider = new EodPriceProvider(valueDate);
|
|
_eodExchangeOptionProvider = new EodExchangeOptionPriceProvider(valueDate, useClosePrice);
|
|
}
|
|
|
|
var priceProvider = _eodPriceProvider.GetPriceProvider(useClosePrice ? SettlementTypeEnum.ClosePrice : SettlementTypeEnum.SettlePrice);
|
|
|
|
var context =
|
|
new HedgePnlCalcContext(Enums.CalcScenarioEnum.EodSettlement, valueDate, volType, true, priceProvider
|
|
, _eodPriceProvider.GetPriceProvider(SettlementTypeEnum.SettlePrice), _eodExchangeOptionProvider, OptUser)
|
|
{
|
|
ExchangeOptionPriceUseFlag = PS.Config.ErpElement.ExchangeOptionSettleByPrice
|
|
? ExchangeOptionPriceUseFlag.CalcPv : ExchangeOptionPriceUseFlag.None
|
|
};
|
|
|
|
return new HedgePnlCalc(context).Calculate(null, oldHoldPosition);
|
|
}
|
|
}
|
|
}
|