Skip to content

Commit 3ffed25

Browse files
mgronckijenkins
authored andcommitted
QPR-12130 clean up
1 parent b7d832f commit 3ffed25

3 files changed

Lines changed: 22 additions & 14 deletions

File tree

OREData/ored/portfolio/commodityposition.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,24 @@ void CommodityPosition::build(const boost::shared_ptr<ore::data::EngineFactory>&
6565
ConventionsBasedFutureExpiry feCalc(*convention);
6666
Date expiry = Settings::instance().evaluationDate();
6767
Size nOffset = u.futureMonthOffset() == Null<Size>() ? 0 : u.futureMonthOffset();
68-
if (u.futureExpiryDate().empty()) {
68+
if (!u.futureContractMonth().empty()) {
69+
QL_REQUIRE(u.futureContractMonth().size() == 7,
70+
"FutureContractMonth has invalid format, please use Mon-YYYY, where 'Mon' is a 3 letter "
71+
"month abbreviation.");
72+
auto month = parseMonth(u.futureContractMonth().substr(0, 3));
73+
auto year = parseInteger(u.futureContractMonth().substr(3, 4));
74+
Date contractDate(1, month, year);
75+
expiry = feCalc.expiryDate(contractDate, nOffset, false);
76+
} else if (!u.futureExpiryDate().empty()) {
77+
expiry = parseDate(u.futureExpiryDate());
78+
expiry = feCalc.nextExpiry(true,expiry, nOffset, false);
79+
} else {
6980
if (u.deliveryRollDays() != Null<Size>()) {
70-
auto cal = u.deliveryRollCalendar().empty() ? convention->calendar() : parseCalendar(u.deliveryRollCalendar());
81+
auto cal = u.deliveryRollCalendar().empty() ? convention->calendar()
82+
: parseCalendar(u.deliveryRollCalendar());
7183
expiry = cal.advance(expiry, u.deliveryRollDays() * Days, convention->businessDayConvention());
7284
}
73-
7485
expiry = feCalc.nextExpiry(true, expiry, nOffset);
75-
} else if (u.futureExpiryDate().size() == 7) {
76-
// parse MONTHYYYY (e.g. NOV2023) format into date
77-
auto month = parseMonth(u.futureExpiryDate().substr(0, 3));
78-
auto year = parseInteger(u.futureExpiryDate().substr(3, 4));
79-
Date contractDate(1, month, year);
80-
expiry = feCalc.expiryDate(contractDate, nOffset, false);
81-
} else {
82-
Date contractDate = parseDate(u.futureExpiryDate());
83-
expiry = feCalc.expiryDate(contractDate, nOffset, false);
8486
}
8587
index = index->clone(expiry, pts);
8688
}

OREData/ored/portfolio/underlying.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ void CommodityUnderlying::fromXML(XMLNode* node) {
134134
deliveryRollCalendar_ = XMLUtils::getChildValue(node, "DeliveryRollCalendar", false);
135135
isBasic_ = false;
136136
futureExpiryDate_ = XMLUtils::getChildValue(node, "FutureExpiryDate", false);
137+
futureContractMonth_ = XMLUtils::getChildValue(node, "FutureContractMonth", false);
138+
QL_REQUIRE(futureExpiryDate_.empty() || futureContractMonth_.empty(),
139+
"Only futureExpiryDate or futureContractMonth are allowed not both");
137140
} else {
138141
QL_FAIL("Need either a Name or Underlying node for CommodityUnderlying.");
139142
}
@@ -156,6 +159,8 @@ XMLNode* CommodityUnderlying::toXML(XMLDocument& doc) {
156159
XMLUtils::addChild(doc, node, "DeliveryRollCalendar", deliveryRollCalendar_);
157160
if (!futureExpiryDate_.empty())
158161
XMLUtils::addChild(doc, node, "FutureExpiryDate", futureExpiryDate_);
162+
if (!futureContractMonth_.empty())
163+
XMLUtils::addChild(doc, node, "FutureContractMonth", futureContractMonth_);
159164
}
160165
return node;
161166
}

OREData/ored/portfolio/underlying.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ class CommodityUnderlying : public Underlying {
140140
QuantLib::Size futureMonthOffset() const { return futureMonthOffset_; }
141141
QuantLib::Size deliveryRollDays() const { return deliveryRollDays_; }
142142
const std::string& deliveryRollCalendar() const { return deliveryRollCalendar_; }
143-
const std::string& futureExpiryDate() const { return futureExpiryDate_; }
144-
143+
const std::string& futureContractMonth() const { return futureContractMonth_; }
144+
const std::string& futureExpiryDate() const { return futureExpiryDate_; }
145145
//! \name Serialisation
146146
//@{
147147
void fromXML(XMLNode* node) override;
@@ -153,6 +153,7 @@ class CommodityUnderlying : public Underlying {
153153
QuantLib::Size futureMonthOffset_ = QuantLib::Null<QuantLib::Size>();
154154
QuantLib::Size deliveryRollDays_ = QuantLib::Null<QuantLib::Size>();
155155
std::string deliveryRollCalendar_;
156+
std::string futureContractMonth_;
156157
std::string futureExpiryDate_;
157158
};
158159

0 commit comments

Comments
 (0)