using CsvHelper; using NPOI.OpenXmlFormats.Dml; using Qdp.Foundation.Implementations; using Qdp.Pricing.Base.Enums; using Qdp.Pricing.Base.Implementations; using Qdp.Pricing.Base.Utilities; using Qdp.Pricing.Ecosystem.Trade.Options; using Qdp.Pricing.Library.Options.Products.Autocall.Phoenix; using Qdp.Pricing.Library.Options.Products.Autocall.Snowball; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using YLErp.Abstract; using YLErp.BLL; using YLErp.BLL.Eod; using YLErp.DBModels; using YLErp.DBModels.Helpers; using YLErp.Model; using YLErp.Models; using YLErp.Modules.CalculationModule.Abstract; using YLErp.Modules.TradeModule; using YLErp.Modules.TradeModule.AccumulatorOptionModule; using YLErp.Modules.TradeModule.KnockOutModule; using YLErp.Modules.TradeModule.KnockOutModule.Dto; using YLErp.QdpModule; namespace YLErp.Modules.CalculationModule { /// /// 交易敲出收益计算服务 /// public class TradeKnockOutPayoffCalcService : ITradeKnockOutPayoffCalcService { private ITradeExtendDataProvider _tradeExtendDataProvider; private DateTime _valueDate; public TradeKnockOutPayoffCalcService(ITradeExtendDataProvider tradeExtendDataProvider, DateTime valueDate) { _tradeExtendDataProvider = tradeExtendDataProvider; _valueDate = valueDate; } /// /// 用于定价页面 敲出收益计算 此时交易未入库 /// /// public TradeKnockOutPayoffCalcService(DateTime valueDate) { this._tradeExtendDataProvider = null; _valueDate = valueDate; } /// /// 获取敲出payoff /// /// /// /// public GetKnockOutPayoffResult GetKnockOutPayoff(trade td,double underlyingPrice) { GetKnockOutPayoffResult result = new GetKnockOutPayoffResult { IsKnockOut = false }; if (td.ExerciseDate < _valueDate) { return result; } ITradeKnockOutService knockOutService = null; switch (td.TradeType) { case "障碍期权": knockOutService = new BarrierOptionTradeKnockOutService(); break; case "二元期权": if ("American".Equals(td.ExerciseMode)) { knockOutService = new AmericanBinaryOptionTradeKnockOutService(); } break; case "双鲨期权": knockOutService = new DoubleSharkTradeKnockOutService(); break; case "凤凰期权": knockOutService = new AutocallTradeKnockOutService(); break; case "雪球期权": knockOutService = new SnowBallTradeKnockOutService(); break; case "累计期权": knockOutService=new AccumulatorTradeKnockOutService(); break; } if(knockOutService != null) { if (this._tradeExtendDataProvider != null) { return knockOutService.GetKnockOutPayoff(td, underlyingPrice, _valueDate, _tradeExtendDataProvider); } else { return knockOutService.GetKnockOutPayoff(td, underlyingPrice, _valueDate); } } return result; } } }