using YLErp.Abstract;
using YLErp.Abstract.DataProviders;
using YLErp.BLL;
using YLErp.Enums;
using YLErp.Modules.CalculationModule.Abstract;
using YLErp.Modules.DataProviderModule;
namespace YLErp.Modules.CalculationModule
{
///
/// 持仓风险对冲计算上下文
///
public class HedgePnlCalcContext : IHedgePnlCalcContext
{
#region----属性定义----
///
/// 估值日
///
public DateTime ValueDate { get; }
///
/// 计算场景
///
public CalcScenarioEnum CalcScenario { get; }
///
/// 波动率类型
///
public string VolType { get; }
public bool IsEodCalc { get; }
///
///
///
public IPriceProvider UnderlyingPriceProvider { get; }
///
///
///
public IPriceProvider UnderlyingSettlePriceProvider { get; }
///
/// 场内标的价格提供者
///
public IPriceProvider ExchangeOptionPriceProvider { get; }
///
///
///
public IUnderlyingDataProvider UnderlyingDataProvider { get; protected set; }
///
/// 对冲交易佣金计算接口
///
public IExchangeTradeCommissionCalc CommissionCalc { get; protected set; }
///
/// 错误处理接口
///
public IErrorHandler ErrorHandler { get; set; }
///
///
///
public OptUserInfo OptUser { get; }
///
/// 场内期权价格使用选项(默认SetExOptionPrice)
/// 注意:在计算类中光子将忽略此项并固定为CalcPv
///
public ExchangeOptionPriceUseFlag ExchangeOptionPriceUseFlag { get; set; } = ExchangeOptionPriceUseFlag.SetExOptionPrice;
#endregion
#region----构造函数----
public HedgePnlCalcContext(CalcScenarioEnum calcScenario, DateTime valueDate, string volType, bool isEodCalc
, IPriceProvider underlyingPriceProvider, IPriceProvider underlyingSettlePriceProvider,
IPriceProvider exchangeOptionPriceProvider, OptUserInfo optUser
, IExchangeTradeCommissionCalc commissionCalc = null
, IUnderlyingDataProvider underlyingDataProvider = null)
{
if (string.IsNullOrEmpty(volType))
{
throw new ArgumentException("volType不能为空", nameof(volType));
}
VolType = volType;
IsEodCalc = isEodCalc;
ValueDate = valueDate;
CalcScenario = calcScenario;
OptUser = optUser ?? throw new ArgumentNullException(nameof(optUser));
UnderlyingPriceProvider = underlyingPriceProvider ?? throw new ArgumentNullException(nameof(underlyingPriceProvider));
UnderlyingSettlePriceProvider = underlyingSettlePriceProvider ?? throw new ArgumentNullException(nameof(underlyingPriceProvider));
ExchangeOptionPriceProvider = exchangeOptionPriceProvider ?? throw new ArgumentNullException(nameof(exchangeOptionPriceProvider));
CommissionCalc = commissionCalc ?? new ExchangeTradeCommissionCalc();
UnderlyingDataProvider = underlyingDataProvider ?? new UnderlyingDataProvider();
}
public HedgePnlCalcContext(IOtcTradeValueCalcContext optionCalcContext,
IExchangeTradeCommissionCalc tradeCommissionCalc, IPriceProvider exchangeOptionPriceProvider)
{
if (optionCalcContext is null)
{
throw new ArgumentNullException(nameof(optionCalcContext));
}
CommissionCalc = tradeCommissionCalc ?? throw new ArgumentNullException(nameof(tradeCommissionCalc));
ExchangeOptionPriceProvider = exchangeOptionPriceProvider ?? throw new ArgumentNullException(nameof(exchangeOptionPriceProvider));
var dataProvider = CalcCheckHelper.CheckOptionCalcDataProvider(optionCalcContext.DataProvider);
UnderlyingDataProvider = dataProvider.UnderlyingDataProvider;
UnderlyingPriceProvider = dataProvider.UnderlyingPriceProvider;
UnderlyingSettlePriceProvider = dataProvider.UnderlyingPriceProvider;
VolType = optionCalcContext.VolType;
ValueDate = optionCalcContext.ValueDate;
CalcScenario = optionCalcContext.CalcScenario;
ErrorHandler = optionCalcContext.ErrorHandler;
OptUser = OptUserInfo.SystemUser;
}
#endregion
///
/// 创建期权计算上下文对象
///
public virtual IOtcTradeValueCalcContext CreateOptionCalculateContext()
{
var sysRiskFreeRate = valuedateBLL.RiskFreeRate * 0.01;
var dataProvider = new InnerOptionCalcDataProvider(this);
return new OptionValueCalcContext(VolType, IsEodCalc, ValueDate, sysRiskFreeRate, dataProvider)
{
AddingVolRate = 0,
ErrorHandler = ErrorHandler,
CalcScenario = CalcScenario
};
}
#region----InnerOptionCalcDataProvider----
class InnerOptionCalcDataProvider : IOptionCalcDataProvider
{
public InnerOptionCalcDataProvider(HedgePnlCalcContext context)
{
UnderlyingDataProvider = context.UnderlyingDataProvider;
UnderlyingPriceProvider = context.UnderlyingPriceProvider;
UnderlyingSettlePriceProvider = context.UnderlyingSettlePriceProvider;
VolatilityDataProvider = new VolatilityDataProvider(context.ValueDate);
TradeExtendDataProvider = new TradeExtendDataProvider(context.OptUser);
}
public IPriceProvider UnderlyingPriceProvider { get; }
public IPriceProvider UnderlyingSettlePriceProvider { get; }
public IUnderlyingDataProvider UnderlyingDataProvider { get; }
public ITradeExtendDataProvider TradeExtendDataProvider { get; }
public IVolatilityDataProvider VolatilityDataProvider { get; }
}
#endregion
public HedgePnlCalc GetHedgePnlCalc()
{
return new HedgePnlCalc(this);
}
public MaturityOptionHedgePnlCalc GetOptionHedgePnlCalc()
{
return new MaturityOptionHedgePnlCalc(this);
}
}
}