@@ -117,6 +117,7 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
117117 boost::dynamic_pointer_cast<SwapEngineBuilderBase>(builder);
118118 QL_REQUIRE (swapBuilder, " No Builder found for Swap " << id ());
119119 qlInstrument->setPricingEngine (swapBuilder->engine (parseCurrency (legData_.currency ())));
120+ setSensitivityTemplate (*swapBuilder);
120121 } else {
121122 qlInstrument->setPricingEngine (
122123 boost::make_shared<DiscountingSwapEngine>(engineFactory->market ()->discountCurve (legData_.currency ())));
@@ -156,6 +157,7 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
156157 boost::shared_ptr<CapFloorEngineBuilder> capFloorBuilder =
157158 boost::dynamic_pointer_cast<CapFloorEngineBuilder>(builder);
158159 qlInstrument->setPricingEngine (capFloorBuilder->engine (underlyingIndex));
160+ setSensitivityTemplate (*capFloorBuilder);
159161
160162 maturity_ = boost::dynamic_pointer_cast<QuantLib::CapFloor>(qlInstrument)->maturityDate ();
161163 }
@@ -186,8 +188,17 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
186188 // the StrippedCappedFlooredCoupon used to extract the naked options assumes a long floor
187189 // and a short cap while we have documented a collar to be a short floor and long cap
188190 qlInstrument = boost::make_shared<QuantLib::Swap>(legs_, std::vector<bool >{!floors_.empty () && !caps_.empty ()});
189- qlInstrument->setPricingEngine (
190- boost::make_shared<DiscountingSwapEngine>(engineFactory->market ()->discountCurve (legData_.currency ())));
191+ if (engineFactory->engineData ()->hasProduct (" Swap" )) {
192+ builder = engineFactory->builder (" Swap" );
193+ boost::shared_ptr<SwapEngineBuilderBase> swapBuilder =
194+ boost::dynamic_pointer_cast<SwapEngineBuilderBase>(builder);
195+ QL_REQUIRE (swapBuilder, " No Builder found for Swap " << id ());
196+ qlInstrument->setPricingEngine (swapBuilder->engine (parseCurrency (legData_.currency ())));
197+ setSensitivityTemplate (*swapBuilder);
198+ } else {
199+ qlInstrument->setPricingEngine (
200+ boost::make_shared<DiscountingSwapEngine>(engineFactory->market ()->discountCurve (legData_.currency ())));
201+ }
191202 maturity_ = CashFlows::maturityDate (legs_.front ());
192203
193204 } else if (legData_.legType () == " DurationAdjustedCMS" ) {
@@ -227,8 +238,17 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
227238 // the StrippedCappedFlooredCoupon used to extract the naked options assumes a long floor
228239 // and a short cap while we have documented a collar to be a short floor and long cap
229240 qlInstrument = boost::make_shared<QuantLib::Swap>(legs_, std::vector<bool >{!floors_.empty () && !caps_.empty ()});
230- qlInstrument->setPricingEngine (
231- boost::make_shared<DiscountingSwapEngine>(engineFactory->market ()->discountCurve (legData_.currency ())));
241+ if (engineFactory->engineData ()->hasProduct (" Swap" )) {
242+ builder = engineFactory->builder (" Swap" );
243+ boost::shared_ptr<SwapEngineBuilderBase> swapBuilder =
244+ boost::dynamic_pointer_cast<SwapEngineBuilderBase>(builder);
245+ QL_REQUIRE (swapBuilder, " No Builder found for Swap " << id ());
246+ qlInstrument->setPricingEngine (swapBuilder->engine (parseCurrency (legData_.currency ())));
247+ setSensitivityTemplate (*swapBuilder);
248+ } else {
249+ qlInstrument->setPricingEngine (
250+ boost::make_shared<DiscountingSwapEngine>(engineFactory->market ()->discountCurve (legData_.currency ())));
251+ }
232252 maturity_ = CashFlows::maturityDate (legs_.front ());
233253 } else if (legData_.legType () == " CPI" ) {
234254 DLOG (" CPI CapFloor Type " << capFloorType << " ID " << id ());
@@ -345,6 +365,7 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
345365 Option::Call, nominal, startDate, baseCPI, paymentDate, cal, conv, cal, conv, caps_[i], zeroIndex,
346366 observationLag, interpolationMethod);
347367 capfloor->setPricingEngine (capFloorBuilder->engine (underlyingIndex));
368+ setSensitivityTemplate (*capFloorBuilder);
348369 boost::dynamic_pointer_cast<QuantLib::CompositeInstrument>(qlInstrument)->add (capfloor, gearing);
349370 maturity_ = std::max (maturity_, capfloor->payDate ());
350371 }
@@ -356,6 +377,7 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
356377 Option::Put, nominal, startDate, baseCPI, paymentDate, cal, conv, cal, conv, floors_[i], zeroIndex,
357378 observationLag, interpolationMethod);
358379 capfloor->setPricingEngine (capFloorBuilder->engine (underlyingIndex));
380+ setSensitivityTemplate (*capFloorBuilder);
359381 boost::dynamic_pointer_cast<QuantLib::CompositeInstrument>(qlInstrument)->add (capfloor, sign * gearing);
360382 maturity_ = std::max (maturity_, capfloor->payDate ());
361383 }
@@ -419,6 +441,7 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
419441 boost::shared_ptr<YoYCapFloorEngineBuilder> capFloorBuilder =
420442 boost::dynamic_pointer_cast<YoYCapFloorEngineBuilder>(builder);
421443 qlInstrument->setPricingEngine (capFloorBuilder->engine (underlyingIndex));
444+ setSensitivityTemplate (*capFloorBuilder);
422445
423446 // Wrap the QL instrument in a vanilla instrument
424447
0 commit comments