@@ -73,6 +73,10 @@ void BarrierOption::build(const QuantLib::ext::shared_ptr<EngineFactory>& engine
7373 Real rebate = barrier_.rebate () / tradeMultiplier ();
7474 QL_REQUIRE (rebate >= 0 , " rebate must be non-negative" );
7575
76+
77+ // set the maturity
78+ maturity_ = std::max (option_.premiumData ().latestPremiumDate (), payDate);
79+
7680 // fx base
7781 // Payoff
7882 Option::Type type = parseOptionType (option_.callPut ());
@@ -164,12 +168,8 @@ void BarrierOption::build(const QuantLib::ext::shared_ptr<EngineFactory>& engine
164168
165169 // Add additional premium payments
166170 Real bsInd = (positionType == QuantLib::Position::Long ? 1.0 : -1.0 );
167- Date lastPremiumDate =
168- addPremiums (additionalInstruments, additionalMultipliers, bsInd * tradeMultiplier (), option_.premiumData (),
169- -bsInd, tradeCurrency (), engineFactory, engineFactory->configuration (MarketContext::pricing));
170-
171- // set the maturity
172- maturity_ = std::max (lastPremiumDate, payDate);
171+ addPremiums (additionalInstruments, additionalMultipliers, bsInd * tradeMultiplier (), option_.premiumData (), -bsInd,
172+ tradeCurrency (), engineFactory, engineFactory->configuration (MarketContext::pricing));
173173}
174174
175175
@@ -217,19 +217,22 @@ void FxOptionWithBarrier::build(const QuantLib::ext::shared_ptr<ore::data::Engin
217217 additionalData_[" isdaSubProduct" ] = string (" Barrier" );
218218 additionalData_[" isdaTransaction" ] = string (" " );
219219
220- spotQuote_ = ef->market ()->fxSpot (boughtCurrency_ + soldCurrency_);
221- fxIndex_ = ef->market ()->fxIndex (indexFixingName (), ef->configuration (MarketContext::pricing)).currentLink ();
220+ additionalData_[" boughAmount" ] = boughtAmount_;
221+ additionalData_[" boughtCurrency" ] = boughtCurrency_;
222+ additionalData_[" soldAmount" ] = soldAmount_;
223+ additionalData_[" soldCurrency" ] = soldCurrency_;
222224
223- BarrierOption::build (ef);
224-
225225 npvCurrency_ = soldCurrency_; // sold is the domestic
226226 notional_ = soldAmount_;
227227 notionalCurrency_ = soldCurrency_; // sold is the domestic
228228
229- additionalData_[" boughAmount" ] = boughtAmount_;
230- additionalData_[" boughtCurrency" ] = boughtCurrency_;
231- additionalData_[" soldAmount" ] = soldAmount_;
232- additionalData_[" soldCurrency" ] = soldCurrency_;
229+ QuantLib::Date expiryDate = parseDate (option ().exerciseDates ().front ());
230+ maturity_ = std::max (option ().premiumData ().latestPremiumDate (), expiryDate);
231+
232+ spotQuote_ = ef->market ()->fxSpot (boughtCurrency_ + soldCurrency_);
233+ fxIndex_ = ef->market ()->fxIndex (indexFixingName (), ef->configuration (MarketContext::pricing)).currentLink ();
234+
235+ BarrierOption::build (ef);
233236}
234237
235238void FxOptionWithBarrier::additionalFromXml (XMLNode* node) {
@@ -257,9 +260,12 @@ void EquityOptionWithBarrier::build(const QuantLib::ext::shared_ptr<ore::data::E
257260 additionalData_[" isdaSubProduct" ] = string (" Price Return Basic Performance" );
258261 additionalData_[" isdaTransaction" ] = string (" " );
259262
260- eqIndex_ = ef->market ()->equityCurve (equityName ()).currentLink ();
263+ additionalData_[" quantity" ] = quantity_;
264+ additionalData_[" strike" ] = tradeStrike_.value ();
265+ additionalData_[" strikeCurrency" ] = tradeStrike_.currency ();
261266
262- BarrierOption::build (ef);
267+ QuantLib::Date expiryDate = parseDate (option ().exerciseDates ().front ());
268+ maturity_ = std::max (option ().premiumData ().latestPremiumDate (), expiryDate);
263269
264270 if (tradeStrike_.currency ().empty ())
265271 tradeStrike_.setCurrency (currencyStr_);
@@ -271,9 +277,9 @@ void EquityOptionWithBarrier::build(const QuantLib::ext::shared_ptr<ore::data::E
271277 notional_ = tradeStrike_.value () * quantity_;
272278 notionalCurrency_ = parseCurrencyWithMinors (tradeStrike_.currency ()).code ();
273279
274- additionalData_[ " quantity " ] = quantity_ ;
275- additionalData_[ " strike " ] = tradeStrike_. value ();
276- additionalData_[ " strikeCurrency " ] = tradeStrike_. currency ( );
280+ eqIndex_ = ef-> market ()-> equityCurve ( equityName ()). currentLink () ;
281+
282+ BarrierOption::build (ef );
277283}
278284
279285void EquityOptionWithBarrier::additionalFromXml (XMLNode* node) {
0 commit comments