Skip to content

Commit 25227bb

Browse files
pcaspersjenkins
authored andcommitted
QPR-12014 fixes
1 parent 7accd15 commit 25227bb

7 files changed

Lines changed: 19 additions & 2 deletions

File tree

OREData/ored/portfolio/asianoption.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ void AsianOption::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
8080
npvCurrency_ = delegatingBuilderTrade_->npvCurrency();
8181
additionalData_ = delegatingBuilderTrade_->additionalData();
8282
requiredFixings_ = delegatingBuilderTrade_->requiredFixings();
83+
setSensitivityTemplate(delegatingBuilderTrade_->sensitivityTemplate());
8384

8485
// notional and notional currency are defined in overriden methods!
8586

OREData/ored/portfolio/bondposition.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ void BondPosition::build(const boost::shared_ptr<ore::data::EngineFactory>& engi
108108
additionalData_["isdaBaseProduct"] = string("");
109109
additionalData_["isdaSubProduct"] = string("");
110110
additionalData_["isdaTransaction"] = string("");
111+
112+
setSensitivityTemplate(std::string());
111113
}
112114

113115
void BondPosition::setNpvCurrencyConversion(const std::string& ccy, const Handle<Quote>& conversion) {

OREData/ored/portfolio/capfloor.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,17 @@ void CapFloor::build(const boost::shared_ptr<EngineFactory>& engineFactory) {
217217
// the StrippedCappedFlooredCoupon used to extract the naked options assumes a long floor
218218
// and a short cap while we have documented a collar to be a short floor and long cap
219219
qlInstrument = boost::make_shared<QuantLib::Swap>(legs_, std::vector<bool>{!floors_.empty() && !caps_.empty()});
220-
qlInstrument->setPricingEngine(
221-
boost::make_shared<DiscountingSwapEngine>(engineFactory->market()->discountCurve(legData_.currency())));
220+
if (engineFactory->engineData()->hasProduct("Swap")) {
221+
builder = engineFactory->builder("Swap");
222+
boost::shared_ptr<SwapEngineBuilderBase> swapBuilder =
223+
boost::dynamic_pointer_cast<SwapEngineBuilderBase>(builder);
224+
QL_REQUIRE(swapBuilder, "No Builder found for Swap " << id());
225+
qlInstrument->setPricingEngine(swapBuilder->engine(parseCurrency(legData_.currency())));
226+
setSensitivityTemplate(*swapBuilder);
227+
} else {
228+
qlInstrument->setPricingEngine(
229+
boost::make_shared<DiscountingSwapEngine>(engineFactory->market()->discountCurve(legData_.currency())));
230+
}
222231
maturity_ = CashFlows::maturityDate(legs_.front());
223232
} else if (legData_.legType() == "CMSSpread") {
224233
builder = engineFactory->builder("Swap");

OREData/ored/portfolio/commodityapo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ void CommodityAveragePriceOption::buildStandardOption(const boost::shared_ptr<En
301301
CommodityOption commOption(envelope(), optionData_, name_, currency_, effectiveQuantity, effectiveStrike,
302302
flow->index()->isFuturesIndex(), flow->pricingDate());
303303
commOption.build(engineFactory);
304+
setSensitivityTemplate(commOption.sensitivityTemplate());
304305
instrument_ = commOption.instrument();
305306
maturity_ = commOption.maturity();
306307
}

OREData/ored/portfolio/commoditydigitaloption.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ void CommodityDigitalOption::build(const boost::shared_ptr<EngineFactory>& engin
102102
boost::shared_ptr<Instrument> inst1 = opt1.instrument()->qlInstrument();
103103
boost::shared_ptr<Instrument> inst2 = opt2.instrument()->qlInstrument();
104104

105+
setSensitivityTemplate(opt1.sensitivityTemplate());
106+
105107
boost::shared_ptr<CompositeInstrument> composite = boost::make_shared<CompositeInstrument>();
106108
// add and subtract such that the long call spread and long put spread have positive values
107109
if (optionData_.callPut() == "Call") {

OREData/ored/portfolio/commodityposition.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ void CommodityPosition::build(const boost::shared_ptr<ore::data::EngineFactory>&
107107
auto qlInstr =
108108
boost::make_shared<CommodityPositionInstrumentWrapper>(data_.quantity(), indices_, weights_, fxConversion_);
109109
qlInstr->setPricingEngine(boost::make_shared<CommodityPositionInstrumentWrapperEngine>());
110+
setSensitivityTemplate(std::string());
110111
instrument_ = boost::make_shared<VanillaInstrument>(qlInstr);
111112

112113
// no sensible way to set these members

OREData/ored/portfolio/failedtrade.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void FailedTrade::build(const boost::shared_ptr<EngineFactory>&) {
4242
notional_ = 0.0;
4343
notionalCurrency_ = npvCurrency_ = "USD";
4444
maturity_ = Date::maxDate();
45+
setSensitivityTemplate(std::string());
4546
}
4647

4748
void FailedTrade::setUnderlyingTradeType(const std::string& underlyingTradeType) {

0 commit comments

Comments
 (0)