using Qdp.Pricing.Base.Interfaces; namespace YLErp.Modules.CalculationModule { /// /// 计算成功以后的结果 /// public class TradeValueResult { public TradeValueResult() { Succeeded = true; } public TradeValueResult(bool succeeded) { Succeeded = succeeded; } public TradeValueResult(IPricingResult result) { if (result != null) { Pv = result.Pv; Delta = result.Delta; Gamma = result.Gamma; Vega = result.Vega; CalendarDayTheta = result.Theta; TradingDayTheta = result.ThetaPnL; Rho = result.Rho; DeltaCash = result.DeltaCash; GammaCash = result.GammaCash; VegaCash = result.VegaCash; Vol = result.PricingVol; DDeltaDVol = result.DDeltaDvol; DDeltaDt = result.DDeltaDt; DVegaDVol = result.DVegaDvol; DVegaDt = result.DVegaDt; StoppingTime = result.StoppingTime; SA_Delta = result.SA_Delta; TimeValue = result.TimeValue; Succeeded = result.Succeeded; ErrorMessage = result.ErrorMessage; PricingT = result.PricingT; } else { Succeeded = false; ErrorMessage = "空的IPricingResult对象传入"; } } public string UnderlyingCode { get; set; } public double Pv { get => pv; set => pv = value.Normalize(); } public double NPv { get => npv; set => npv = value.Normalize(); } /// /// 根据某些机构财务需要,将期权单价保留两位小数之后,再乘以份额得到的总Pv值 /// public double RoundedPv { get => roundedPv; set => roundedPv = value.Normalize(); } public double NRoundedPv { get => nRoundedPv; set => nRoundedPv = value.Normalize(); } public TradeValueResultExtend ExtendInfo { get; set; } = new TradeValueResultExtend(); public double Delta { get => delta; set => delta = value.Normalize(); } /// /// 计算申万跨式组合预付金时会用到 /// internal double DeltaMax { get => deltaMax; set => deltaMax = value.Normalize(); } /// /// 亚式Delta /// public double SA_Delta { get => sA_Delta; set => sA_Delta = value.Normalize(); } /// /// 时间价值 /// public double TimeValue { get => timeValue; set => timeValue = value.Normalize(); } public double Gamma { get => gamma; set => gamma = value.Normalize(); } private double _vega; public double Vega { get { return _vega; } set { var temp = value.Normalize(); if (temp != 0 && VegaCash.Normalize() == 0) { VegaCash = SpotPrice.Normalize() * temp; } _vega = temp; } } public double Rho { get => rho; set => rho = value.Normalize(); } public double Vol { get => vol; set => vol = value.Normalize(); } public double DeltaCash { get => deltaCash; set => deltaCash = value.Normalize(); } public double GammaCash { get => gammaCash; set => gammaCash = value.Normalize(); } public double VegaCash { get => vegaCash; set => vegaCash = value.Normalize(); } public double DDeltaDVol { get => dDeltaDVol; set => dDeltaDVol = value.Normalize(); } public double DDeltaDt { get => dDeltaDt; set => dDeltaDt = value.Normalize(); } public double DVegaDVol { get => dVegaDVol; set => dVegaDVol = value.Normalize(); } public double DVegaDt { get => dVegaDt; set => dVegaDt = value.Normalize(); } public double StoppingTime { get => stoppingTime; set => stoppingTime = value.Normalize(); } /// /// 日历日Theta /// public double CalendarDayTheta { get => calendarDayTheta; set => calendarDayTheta = value.Normalize(); } /// /// 交易日Theta /// public double TradingDayTheta { get => tradingDayTheta; set => tradingDayTheta = value.Normalize(); } public double Theta { get { return BLL.valuedateBLL.SystemDate?.ThetaType != "日历日Theta" ? TradingDayTheta : CalendarDayTheta; } } //---------------------------------------- // 多标的期权 //---------------------------------------- public string UnderlyingCode2 { get; set; } public double? Delta2 { get => delta2; set => delta2 = value.Normalize(); } public double? Gamma2 { get => gamma2; set => gamma2 = value.Normalize(); } public double? Vega2 { get => vega2; set => vega2 = value.Normalize(); } public double? DeltaCash2 { get => deltaCash2; set => deltaCash2 = value.Normalize(); } public double? GammaCash2 { get => gammaCash2; set => gammaCash2 = value.Normalize(); } public double? ThetaCash2 { get => thetaCash2; set => thetaCash2 = value.Normalize(); } public double CrossGamma { get => crossGamma; set => crossGamma = value.Normalize(); } public double CrossVogga { get => crossVogga; set => crossVogga = value.Normalize(); } public double CorrVega { get => corrVega; set => corrVega = value.Normalize(); } /// /// 报价 卖 /// public double TradePriceAsk { get => tradePriceAsk; set => tradePriceAsk = value.Normalize(); } /// /// 单价四舍五入后的TradePriceAsk /// public double RoundedTradePriceAsk { get => roundedTradePriceAsk; set => roundedTradePriceAsk = value.Normalize(); } /// /// 买 /// public double TradePriceBid { get => tradePriceBid; set => tradePriceBid = value.Normalize(); } /// /// 单价四舍五入后的TradePriceBid /// public double RoundedTradePriceBid { get => roundedTradePriceBid; set => roundedTradePriceBid = value.Normalize(); } /// /// delta手数 /// public double DeltaInLots { get => deltaInLots; set => deltaInLots = value.Normalize(); } public int? UnderlyingId { get; set; } public double? Strike { get => strike; set => strike = value.Normalize(); } private double? _spotPrice; private double? pricingT; private double? deltaT1; private double? vega4; private double? vega3; private double? gammaCash4; private double? gammaCash3; private double? gamma4; private double? gamma3; private double? deltaCash4; private double? deltaCash3; private double? delta4; private double? delta3; private double? strike; private double deltaInLots; private double roundedTradePriceBid; private double tradePriceBid; private double roundedTradePriceAsk; private double tradePriceAsk; private double corrVega; private double crossVogga; private double crossGamma; private double? gammaCash2; private double? deltaCash2; private double? thetaCash2; private double? thetaCash3; private double? thetaCash4; private double? vega2; private double? gamma2; private double? delta2; private double tradingDayTheta; private double calendarDayTheta; private double stoppingTime; private double dVegaDt; private double dVegaDVol; private double dDeltaDt; private double dDeltaDVol; private double vegaCash; private double gammaCash; private double deltaCash; private double vol; private double rho; private double gamma; private double timeValue; private double sA_Delta; private double deltaMax; private double delta; private double roundedPv; private double nRoundedPv; private double pv; private double npv; public double? SpotPrice { get { return _spotPrice; } set { var temp = value.Normalize(); if (temp != 0 && VegaCash.Normalize() == 0) { VegaCash = Vega.Normalize() * temp; } _spotPrice = value; } } public string UnderlyingCode3 { get; set; } public string UnderlyingCode4 { get; set; } public double? Delta3 { get => delta3; set => delta3 = value.Normalize(); } public double? Delta4 { get => delta4; set => delta4 = value.Normalize(); } public double? DeltaCash3 { get => deltaCash3; set => deltaCash3 = value.Normalize(); } public double? DeltaCash4 { get => deltaCash4; set => deltaCash4 = value.Normalize(); } public double? Gamma3 { get => gamma3; set => gamma3 = value.Normalize(); } public double? Gamma4 { get => gamma4; set => gamma4 = value.Normalize(); } public double? GammaCash3 { get => gammaCash3; set => gammaCash3 = value.Normalize(); } public double? GammaCash4 { get => gammaCash4; set => gammaCash4 = value.Normalize(); } public double? ThetaCash3 { get => thetaCash3; set => thetaCash3 = value.Normalize(); } public double? ThetaCash4 { get => thetaCash4; set => thetaCash4 = value.Normalize(); } public double? Vega3 { get => vega3; set => vega3 = value.Normalize(); } public double? Vega4 { get => vega4; set => vega4 = value.Normalize(); } /// /// T+1日Delta /// public double? DeltaT1 { get => deltaT1; set => deltaT1 = value.Normalize(); } // 第i+1个标的的delta public double GetDelta(int i) { double? result; switch (i) { case 0: result = Delta; break; case 1: result = Delta2; break; case 2: result = Delta3; break; case 3: result = Delta4; break; default: throw new ArgumentException($"不合法的标的索引${i}"); } return double.IsNaN(result ?? 0.0) ? 0.0 : result ?? 0.0; } public double GetGamma(int i) { double? result; switch (i) { case 0: result = Gamma; break; case 1: result = Gamma2; break; case 2: result = Gamma3; break; case 3: result = Gamma4; break; default: throw new ArgumentException($"不合法的标的索引${i}"); } return double.IsNaN(result ?? 0.0) ? 0.0 : result ?? 0.0; } public double GetVega(int i) { double? result; switch (i) { case 0: result = Vega; break; case 1: result = Vega2; break; case 2: result = Vega3; break; case 3: result = Vega4; break; default: throw new ArgumentException($"不合法的标的索引${i}"); } return double.IsNaN(result ?? 0.0) ? 0.0 : result ?? 0.0; } public double GetDeltaCash(int i) { double? result; switch (i) { case 0: result = DeltaCash; break; case 1: result = DeltaCash2; break; case 2: result = DeltaCash3; break; case 3: result = DeltaCash4; break; default: throw new ArgumentException($"不合法的标的索引${i}"); } return double.IsNaN(result ?? 0.0) ? 0.0 : result ?? 0.0; } public double GetGammaCash(int i) { double? result; switch (i) { case 0: result = GammaCash; break; case 1: result = GammaCash2; break; case 2: result = GammaCash3; break; case 3: result = GammaCash4; break; default: throw new ArgumentException($"不合法的标的索引${i}"); } return double.IsNaN(result ?? 0.0) ? 0.0 : result ?? 0.0; } //------------------------------------------ public int TradeId { get; set; } public string BuySell { get; set; } public bool Succeeded { get; set; } public string ErrorMessage { get; set; } /// /// 错误原因 /// internal TradeValueFailReason FailReason { get; set; } /// /// 是否来自手动风险维护 /// internal bool FromManual { get; set; } /// /// 预付金 /// internal double? Margin { get; set; } /// /// 设置错误信息,设置后Succeeded变为false /// /// public TradeValueResult SetError(string errorMessage) { Succeeded = false; ErrorMessage = errorMessage; return this; } public double? PricingT { get => pricingT; set => pricingT = value.Normalize(); } public override string ToString() { return Succeeded ? $"[{TradeId}]{UnderlyingCode},pv:{Pv}" : ErrorMessage; } /// /// 是否敲出 /// public bool IsKnockOut { get; set; } = false; /// /// 敲出收益 /// public double KnockOutPayoff { get; set; } /// /// PV* 如果敲出则为 敲出收益KnockOutPayoff,未敲出 则为PV /// public double PvContainsKnockOut { get; set; } /// /// Delta* 如果敲出则为0 未敲出 则等于Delta /// public double DeltaContainsKnockOut { get; set; } /// /// Gamma* 如果敲出则为0 未敲出 则等于Delta /// public double GammaContainsKnockOut { get; set; } /// /// Theta(轧差) /// public double ThetaNet { get; set; } /// /// Delta_R /// public double? Delta_r { get; set; } public double? Delta_r_1bp { get; set; } public double? Dv01 { get; set; } public double? Gamma_r { get; set; } public double? Gamma_r_1bp { get; set; } public double? Vega_r { get; set; } public double? Vega_r_1bp { get; set; } public double? Vega_1bp { get; set; } } public class TradeValueResultExtend { public double QuotePv { get; set; } public double FloatingWinLoss { get; set; } public double QuoteFloatingWinLoss { get; set; } public double Commission { get; set; } public double QuoteCommission { get; set; } public double AnnualFee { get; set; } public double QuoteAnnualFee { get; set; } public double IM { get; set; } public double QuoteIM { get; set; } public double PFE { get; set; } public double QuotePFE { get; set; } public double RealPnl { get;set; } } public enum TradeValueFailReason { none, /// /// 缺少交易数据 /// missingTrade, /// /// 缺少波动率 /// missingVol } }