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
}
}