Skip to content

Commit 48e20d8

Browse files
alexchow-acadiajenkins
authored andcommitted
Remove try catch block in ForwardRateAgreement. Make engine builder optional in CapFloor for backward compatibility
1 parent f0758af commit 48e20d8

2 files changed

Lines changed: 15 additions & 12 deletions

File tree

OREData/ored/portfolio/capfloor.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,16 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
111111
// and a short cap while we have documented a collar to be a short floor and long cap
112112
qlInstrument =
113113
boost::make_shared<QuantLib::Swap>(legs_, std::vector<bool>{!floors_.empty() && !caps_.empty()});
114-
builder = engineFactory->builder("Swap");
115-
boost::shared_ptr<SwapEngineBuilderBase> swapBuilder =
116-
boost::dynamic_pointer_cast<SwapEngineBuilderBase>(builder);
117-
QL_REQUIRE(swapBuilder, "No Builder found for Swap " << id());
118-
qlInstrument->setPricingEngine(swapBuilder->engine(parseCurrency(legData_.currency())));
114+
if (engineFactory->engineData()->hasProduct("Swap")) {
115+
builder = engineFactory->builder("Swap");
116+
boost::shared_ptr<SwapEngineBuilderBase> swapBuilder =
117+
boost::dynamic_pointer_cast<SwapEngineBuilderBase>(builder);
118+
QL_REQUIRE(swapBuilder, "No Builder found for Swap " << id());
119+
qlInstrument->setPricingEngine(swapBuilder->engine(parseCurrency(legData_.currency())));
120+
} else {
121+
qlInstrument->setPricingEngine(
122+
boost::make_shared<DiscountingSwapEngine>(engineFactory->market()->discountCurve(legData_.currency())));
123+
}
119124
maturity_ = CashFlows::maturityDate(legs_.front());
120125
} else {
121126
// For the cases where we don't have regular cap / floor support we treat the index approximately as an Ibor

OREData/ored/portfolio/forwardrateagreement.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,14 @@ void ForwardRateAgreement::build(const boost::shared_ptr<EngineFactory>& engineF
4242
new QuantExt::ForwardRateAgreement(startDate, endDate, positionType, strike_, amount_, *index, discountTS));
4343

4444
Currency npvCcy = parseCurrency(currency_);
45-
try {
45+
if (engineFactory->engineData()->hasProduct("ForwardRateAgreement")) {
4646
// engine is optional for FRA instrument
4747
boost::shared_ptr<EngineBuilder> builder = engineFactory->builder("ForwardRateAgreement");
48-
boost::shared_ptr<FraEngineBuilderBase> fraBuilder =
49-
boost::dynamic_pointer_cast<FraEngineBuilderBase>(builder);
50-
if(fraBuilder) {
51-
fra->setPricingEngine(fraBuilder->engine(npvCcy));
52-
}
48+
boost::shared_ptr<FraEngineBuilderBase> fraBuilder =
49+
boost::dynamic_pointer_cast<FraEngineBuilderBase>(builder);
50+
QL_REQUIRE(fraBuilder, "No Builder found for ForwardRateAgreement " << id());
51+
fra->setPricingEngine(fraBuilder->engine(npvCcy));
5352
}
54-
catch (...) {}
5553

5654
instrument_.reset(new VanillaInstrument(fra));
5755
npvCurrency_ = currency_;

0 commit comments

Comments
 (0)