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
{
///
/// 日终场内期权风险计算服务
///
public class EodExchangeOptionRiskCalcService : YLBaseService
{
private EodPriceProvider _eodPriceProvider = null;
EodExchangeOptionPriceProvider _eodExchangeOptionProvider;
public EodExchangeOptionRiskCalcService(OptUserInfo userInfo) : base(userInfo)
{
}
public EodExchangeOptionRiskCalcService(YLBaseService baseService) : base(baseService)
{
}
///
/// 取结算日期的场内期权收盘持仓数据并进行风险计算
///
/// EodTradePositionBase
/// 结算日期
/// 波动率类型
/// 数据过滤预测
public IEnumerable CalculateEodRisk(DateTime valueDate, string volType, bool useClosePrice, Expression> predicate = null)
where T : EodTradePosition
{
if (volType is null)
{
throw new ArgumentNullException(nameof(volType));
}
predicate = predicate == null
? PredicateBuilder.Create(p => p.TradeType == "场内期权")
: PredicateBuilder.Create(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);
}
}
}