using Qdp.Pricing.Base.Enums; using YLErp.Configuration; namespace YLErp.Modules.TradeModule.OrderModule { partial class TradeAbstractService { /// /// 雪球期权生成交易摘要 /// private static IEnumerable<(string text, string value)> GenerateTradeAbstract_snowball(trade td, InnerWrap wrap) { if (td is null) { throw new ArgumentNullException(nameof(td)); } if (wrap is null) { throw new ArgumentNullException(nameof(wrap)); } var snowball = td.trade_snowball; if (snowball == null) { throw new ServiceException("雪球期权扩展信息不存在,无法生成交易摘要"); } //专业版雪球 if (snowball.PrepaymentUsed) { return GenerateTradeAbstract_specialsnowball(td, wrap); } td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio; var list = new List<(string, string)> { ("交易编号", td.TradeNumber), ("成交日期", td.TradeDate.OtcFormatDate()), ("买卖方向", td.ClientName), ("#", td.BuySell == "买入" ? "卖出" : "买入"), ("标的代码", td.UnderlyingCode), }; if (wrap.UnderlyingInstrumentType == "Stock") { list.Add(("标的名称", wrap.UnderlyingName)); } list.Add(("期权类型", "雪球 " + td.OptionType)); list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : ""))); if (td.TradeType != "自定义交易" && (td.TradeType != "亚式期权" || td.trade_asian_option.StrikeType != "Floating") && td.TradeType != "雪球期权") { list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : ""))); } if (!wrap.IsUsePremiumRate) { list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString))); } if (PS.Config.Is方顿) { list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元")); } if (PS.Config.Company != CompanyEnum.厦门象屿 && !PS.Config.Is润和) { list.AddRange(new[] { ("名义本金", OtcFormatExtensions.OtcFormat(td.StockEqvNotionalToShow, OtcFormatFlag.StockEqvNotional)) }); } if (!snowball.IsInitialKnockedIn) { list.Add(("敲入价格", wrap.strikeFmt(snowball.KIBarrier) + (PS.Config.Is浙期 ? " 元" : ""))); } else { list.Add(("初始敲入", "是")); } list.Add(("敲出价格", wrap.strikeFmt(snowball.KOBarrier) + (PS.Config.Is浙期 ? " 元" : ""))); switch (snowball.KIPayoffType) { case KIPayoffTypeEnum.None: break; case KIPayoffTypeEnum.ToCallOption: case KIPayoffTypeEnum.ToPutOption: list.Add(("执行价格一", wrap.strikeFmt(snowball.SpreadStrikeAtMaturity1))); break; case KIPayoffTypeEnum.ToCallSpreadOption: case KIPayoffTypeEnum.ToPutSpreadOption: list.Add(("执行价格一", wrap.strikeFmt(snowball.SpreadStrikeAtMaturity))); list.Add(("执行价格二", wrap.strikeFmt(snowball.SpreadStrikeAtMaturity1))); break; default: break; } var kiObsInfo = "每日观察"; if (!string.IsNullOrWhiteSpace(snowball.ObservationDates)) { kiObsInfo = snowball.ObservationDates; } switch (snowball.KOPayoffType) { case KOPayoffTypeEnum.ToOption: list.Add(("敲出执行价1", wrap.strikeFmt(snowball.SpreadStrikeAtKO1) + (PS.Config.Is浙期 ? " 元" : ""))); break; case KOPayoffTypeEnum.ToSpreadOption: list.Add(("敲出执行价1", wrap.strikeFmt(snowball.SpreadStrikeAtKO1) + (PS.Config.Is浙期 ? " 元" : ""))); list.Add(("敲出执行价2", wrap.strikeFmt(snowball.SpreadStrikeAtKO) + (PS.Config.Is浙期 ? " 元" : ""))); break; case KOPayoffTypeEnum.Rebate: list.Add(("敲出票息", snowball.KORebate.OtcFormatPercent())); break; default: kiObsInfo = ""; break; } list.Add(("未敲入未敲出收益率", snowball.Coupon.OtcFormat(OtcFormatFlag.percent))); list.Add(("票息年化", snowball.IsFixedCoupon ? "否" : "是")); if (!string.IsNullOrWhiteSpace(kiObsInfo) && !snowball.IsInitialKnockedIn) { list.Add(("敲入观察日期", kiObsInfo)); } var koInfo = ""; if (!string.IsNullOrWhiteSpace(snowball.KOObservationDates)) { var KOObservationDates = QdpModule.QdpHelper.ParseAutocallCustomizedInfo(snowball.KOObservationDates); for (var i = 0; i < KOObservationDates.Item1.Length; i++) { var splitStr = ", "; if (i == KOObservationDates.Item1.Length - 1) { splitStr = ""; } var couponInfo = PS.Config.Is浙期 ? ":" + KOObservationDates.Item3[i].OtcFormat(OtcFormatFlag.percent) + splitStr : splitStr; koInfo += KOObservationDates.Item1[i].DateTime.ToString("yyyy-MM-dd") + couponInfo; } } list.Add(("到期日期", td.ExerciseDate.OtcFormatDate())); list.Add(("敲出观察日期", koInfo)); return list; } /// /// 专业版雪球期权生成交易摘要 /// private static IEnumerable<(string text, string value)> GenerateTradeAbstract_specialsnowball(trade td, InnerWrap wrap) { if (td is null) { throw new ArgumentNullException(nameof(td)); } if (wrap is null) { throw new ArgumentNullException(nameof(wrap)); } var snowball = td.trade_snowball; if (snowball == null) { throw new ServiceException("雪球期权扩展信息不存在,无法生成交易摘要"); } td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio; var list = new List<(string, string)> { ("交易编号", td.TradeNumber), ("成交日期", td.TradeDate.OtcFormatDate()), ("买卖方向", td.ClientName), ("#", td.BuySell == "买入" ? "卖出" : "买入"), ("标的代码", td.UnderlyingCode), }; if (wrap.UnderlyingInstrumentType == "Stock") { list.Add(("标的名称", wrap.UnderlyingName)); } list.Add(("期权类型", "雪球 " + td.OptionType)); list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : ""))); if (!wrap.IsUsePremiumRate) { list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString))); } if (PS.Config.Is方顿) { list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元")); } if (PS.Config.Company != CompanyEnum.厦门象屿 && !PS.Config.Is润和) { list.AddRange(new[] { ("名义本金", OtcFormatExtensions.OtcFormat(td.StockEqvNotionalToShow, OtcFormatFlag.StockEqvNotional)) }); } list.Add(("预付金比例", snowball.PrepaymentRatio.OtcFormatFlex(2, percent: true))); //list.Add(("预付金返息率", snowball.PrepaymentInterestRate.OtcFormatFlex(2, percent: true))); list.Add(("预付金折现率", snowball.PrepaymentConvertCashRate.OtcFormatFlex(2, percent: true))); if (snowball.IsInitialKnockedIn) { list.Add(("初始敲入", "是")); } else { list.Add(("敲入价格", wrap.strikeFmt(snowball.KIBarrier) + (PS.Config.Is浙期 ? " 元" : ""))); list.Add(("敲入观察设置", snowball.KIObservationType == KIObservationType.OnlyEndDate ? "仅到期日观察" : "每日观察")); } list.Add(("敲入执行价格", wrap.strikeFmt(snowball.SpreadStrikeAtMaturity1) + (PS.Config.Is浙期 ? " 元" : ""))); list.Add(("敲入参与率", snowball.KIParticipationRate.OtcFormatFlex(2, percent: true))); list.Add(("保本比率", snowball.PrincipalProtectionRate.OtcFormatFlex(2, percent: true))); list.Add(("首日是否计息", snowball.CouponIncludeStartDate == true ? "是" : "否")); list.Add(("终日是否计息", snowball.CouponIncludeEndDate == true ? "是" : "否")); var couponDayCount = "非年化"; switch (snowball.CouponDayCount) { case nameof(DayCount.Act365): couponDayCount = "按365日年化"; break; case nameof(DayCount.Act360): couponDayCount = "按360日年化"; break; case nameof(DayCount.Monthly): couponDayCount = "按月年化"; break; } list.Add(("计息年化方式", couponDayCount)); list.Add(("票息率", snowball.KORebate.OtcFormatFlex(2, percent: true))); list.Add(("红利票息", snowball.Coupon.OtcFormatFlex(2, percent: true))); list.Add(("增强参与率", snowball.EnhancedParticipationRate.OtcFormatFlex(2, percent: true))); list.Add(("敲出价格", wrap.strikeFmt(snowball.KOBarrier) + (PS.Config.Is浙期 ? " 元" : ""))); var koInfo = ""; if (!string.IsNullOrWhiteSpace(snowball.KOObservationDates)) { var KOObservationDates = QdpModule.QdpHelper.ParseAutocallCustomizedInfo(snowball.KOObservationDates); if (KOObservationDates != null && KOObservationDates.Item1.Length > 0) { for (var i = 0; i < KOObservationDates.Item1.Length; i++) { var splitStr = ", "; if (i == KOObservationDates.Item1.Length - 1) { splitStr = ""; } var couponInfo = PS.Config.Is浙期 ? ":" + KOObservationDates.Item3?[i].OtcFormat(OtcFormatFlag.percent) + splitStr : splitStr; koInfo += KOObservationDates.Item1[i].DateTime.ToString("yyyy-MM-dd") + couponInfo; } } } list.Add(("到期日期", td.ExerciseDate.OtcFormatDate())); list.Add(("敲出观察日期", koInfo)); return list; } } }