Skip to content

Commit d1a62aa

Browse files
Zeyu Shenjenkins
authored andcommitted
Fix Optiontype requirement for non-vanilla payoff; Update regression test; Update doc
1 parent b71bc3c commit d1a62aa

1 file changed

Lines changed: 14 additions & 8 deletions

File tree

OREData/ored/portfolio/genericbarrieroption.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -324,12 +324,6 @@ void GenericBarrierOption::build(const boost::shared_ptr<EngineFactory>& factory
324324
<< transatlanticBarrierType.size());
325325
if (transatlanticBarrierType.size() == 1 && underlyings_.size() > 1) {
326326
transatlanticBarrierType.assign(underlyings_.size(), transatlanticBarrierType[0]);
327-
for (Size i = 0; i < transatlanticBarrierType.size(); i++) {
328-
std::cout << i << ": " << transatlanticBarrierType[i] << std::endl;
329-
}
330-
}
331-
for (Size i = 0; i < transatlanticBarrierType.size(); i++) {
332-
std::cout << i << ": " << transatlanticBarrierType[i] << std::endl;
333327
}
334328
transatlanticBarrierLevel.clear();
335329
if (transatlanticBarrier_.size() == 1) {
@@ -350,7 +344,12 @@ void GenericBarrierOption::build(const boost::shared_ptr<EngineFactory>& factory
350344
}
351345
}
352346
if (transatlanticBarrier_.size() > 1) {
353-
std::cout << "transatlanticBarrier_[1].rebate() = " << transatlanticBarrier_[1].rebate() << std::endl;
347+
for (Size i = 1; i < transatlanticBarrier_.size(); i++) {
348+
QL_REQUIRE(transatlanticBarrier_[i].rebateCurrency().empty() ||
349+
transatlanticBarrier_[i].rebateCurrency() == transatlanticBarrier_[0].rebateCurrency(),
350+
"Rebate currency for transatlantic barriers must be identical or only given in the first "
351+
"transatlantic barrier.");
352+
}
354353
}
355354
transatlanticBarrierRebate = boost::lexical_cast<std::string>(transatlanticBarrier_[0].rebate());
356355
if (!transatlanticBarrier_[0].rebateCurrency().empty())
@@ -364,7 +363,14 @@ void GenericBarrierOption::build(const boost::shared_ptr<EngineFactory>& factory
364363
auto positionType = parsePositionType(optionData_.longShort());
365364
numbers_.emplace_back("Number", "LongShort", positionType == Position::Long ? "1" : "-1");
366365

367-
numbers_.emplace_back("Number", "PutCall", parseOptionType(optionData_.callPut()) == Option::Call ? "1.0" : "-1.0");
366+
if (optionData_.callPut().empty()) {
367+
QL_REQUIRE(optionData_.payoffType() == "CashOrNothing" || optionData_.payoffType() == "AssetOrNothing",
368+
"Payoff type must be vanilla if option type is not givien.");
369+
numbers_.emplace_back("Number", "PutCall", "1.0");
370+
} else {
371+
numbers_.emplace_back("Number", "PutCall",
372+
parseOptionType(optionData_.callPut()) == Option::Call ? "1.0" : "-1.0");
373+
}
368374
numbers_.emplace_back("Number", "Quantity", quantity_.empty() ? "0.0" : quantity_);
369375
if (!strike_.empty())
370376
numbers_.emplace_back("Number", "Strike", strike_);

0 commit comments

Comments
 (0)