@@ -57,11 +57,25 @@ using ore::data::XMLUtils;
5757namespace ore {
5858namespace data {
5959using namespace ore ::data;
60+
6061using std::map;
6162
6263
63- void TradeGenerator::setup () {
64- today_ = Settings::instance ().evaluationDate ();
64+ void TradeGenerator::setup (string startDate) {
65+ if (startDate != " " ) {
66+ try {
67+
68+ startDate_ = ore::data::parseDate (startDate);
69+ }
70+
71+ catch (QuantLib::Error e) {
72+ startDate_ = Settings::instance ().evaluationDate ();
73+ }
74+
75+ } else {
76+
77+ startDate_ = Settings::instance ().evaluationDate ();
78+ }
6579 addConventions ();
6680}
6781
@@ -146,7 +160,7 @@ bool TradeGenerator::validateDate(string date) {
146160}
147161
148162void TradeGenerator::buildSwap (string indexId, Real notional, string maturity, Real rate, bool firstLegPays,
149- string start, string tradeId, std::map<string, string> mapPairs ) {
163+ string start, string tradeId) {
150164 QuantLib::ext::shared_ptr<Convention> conv = conventions_.at (indexId);
151165 QuantLib::ext::shared_ptr<IborIndex> iborIndex;
152166 tryParseIborIndex (indexId, iborIndex);
@@ -197,11 +211,13 @@ void TradeGenerator::buildSwap(string indexId, Real notional, string maturity, R
197211}
198212
199213void TradeGenerator::buildSwap (string indexId, Real notional, string maturity, string recIndexId, Real spread,
200- bool firstLegPays, string start, string tradeId, std::map<string, string> mapPairs) {
214+ bool firstLegPays, string start, string tradeId,
215+ std::map<string, string> mapPairs) {
201216 Envelope env = makeEnvelope ();
202217 QuantLib::ext::shared_ptr<Convention> conv = conventions_.at (indexId);
203218 QuantLib::ext::shared_ptr<Convention> recConv = conventions_.at (recIndexId);
204219 string forwardStart = start.empty () ? " 0D" : start;
220+
205221 LegData floatingLeg = buildLeg (conv, notional, maturity, forwardStart, firstLegPays);
206222 LegData recFloatingLeg = buildLeg (recConv, notional, maturity, forwardStart, firstLegPays);
207223 QuantLib::ext::shared_ptr<Swap> trade (
@@ -227,7 +243,7 @@ void TradeGenerator::buildInflationSwap(string inflationIndex, Real notional, st
227243
228244void TradeGenerator::buildFxForward (string payCcy, Real payNotional, string recCcy, Real recNotional, string expiryDate, bool isLong, string tradeId, std::map<string, string> mapPairs) {
229245 Envelope env = makeEnvelope ();
230- expiryDate = to_string (getEndDate (expiryDate, to_string (today_ )));
246+ expiryDate = to_string (getEndDate (expiryDate, to_string (startDate_ )));
231247 QuantLib::ext::shared_ptr<FxForward> trade (QuantLib::ext::make_shared<FxForward> (ore::data::FxForward (
232248 env, expiryDate, recCcy, recNotional, payCcy, payNotional)));
233249 trade->id () = tradeId != " " ? tradeId : to_string (size () + 1 ) + " _" + payCcy + " -" + recCcy + " _FX_FORWARD" ;
@@ -260,7 +276,7 @@ void TradeGenerator::buildFxOption(string payCcy, Real payNotional, string recCc
260276 Envelope env = makeEnvelope ();
261277 string longShort = isLong ? " Long" : " Short" ;
262278 string putCall = isCall ? " Call" : " Put" ;
263- expiryDate = to_string (getEndDate (expiryDate, to_string (today_ )));
279+ expiryDate = to_string (getEndDate (expiryDate, to_string (startDate_ )));
264280 OptionData option (longShort, putCall, " European" , false , vector<string>(1 , to_string (expiryDate)), " Cash" , " " );
265281 QuantLib::ext::shared_ptr<FxOption> trade (
266282 QuantLib::ext::make_shared<FxOption>( ore::data::FxOption (env, option, recCcy, recNotional, payCcy, payNotional)));
@@ -283,7 +299,7 @@ void TradeGenerator::buildCommoditySwap(string commodityId, string maturity, Rea
283299 QuantLib::ext::dynamic_pointer_cast<CommodityCurveConfig>(curveConfigs_->commodityCurveConfig (commodityId));
284300 auto yieldConv = conventions_.at (comConfig->baseYieldCurveId () != " " ? comConfig->baseYieldCurveId ()
285301 : comConfig->conventionsId ());
286- string startDate = to_string (today_ );
302+ string startDate = to_string (startDate_ );
287303 string endDate = getEndDate (maturity, startDate, comConv->advanceCalendar ());
288304 string cal = to_string (comConv->advanceCalendar ());
289305 string convention = to_string (comConv->bdc ());
@@ -318,7 +334,7 @@ void TradeGenerator::buildCommodityOption(string commodityId, Real quantity, str
318334 auto yieldConv = conventions_.at (comConfig->baseYieldCurveId () != " " ? comConfig->baseYieldCurveId ()
319335 : comConfig->conventionsId ());
320336 // string rule = "Forward";
321- string expiryDate = to_string (getEndDate (maturity, to_string (today_ )));
337+ string expiryDate = to_string (getEndDate (maturity, to_string (startDate_ )));
322338 string longShort = isLong ? " Long" : " Short" ;
323339 string putCall = isCall ? " Call" : " Put" ;
324340 string currency = to_string (comConfig->currency ());
@@ -341,7 +357,7 @@ void TradeGenerator::buildCommodityForward(string commodityId, Real quantity, st
341357 QuantLib::ext::shared_ptr<CommodityCurveConfig> comConfig =
342358 QuantLib::ext::dynamic_pointer_cast<CommodityCurveConfig>(curveConfigs_->commodityCurveConfig (commodityId));
343359 string ccy = comConfig->currency ();
344- string expiryDate = to_string (getEndDate (maturity, to_string (today_ )));
360+ string expiryDate = to_string (getEndDate (maturity, to_string (startDate_ )));
345361 Envelope env = makeEnvelope ();
346362 QuantLib::ext::shared_ptr<CommodityForward> trade (QuantLib::ext::make_shared<CommodityForward>( ore::data::CommodityForward (
347363 env, longShort, commodityId, ccy, quantity, expiryDate, strike)));
@@ -392,7 +408,7 @@ void TradeGenerator::buildEquitySwap(string equityCurveId, string returnType, Re
392408 auto forecastIndex = curveConfigs_->yieldCurveConfig (indexName);
393409 string ccy = forecastIndex->currency ();
394410 string fixedFreq;
395- string startDate = to_string (today_ );
411+ string startDate = to_string (startDate_ );
396412 string endDate = getEndDate (maturity, startDate, parseCalendar (ccy));
397413 string fixedDC;
398414 string conv;
@@ -447,7 +463,7 @@ void TradeGenerator::buildEquitySwap(string equityCurveId, string returnType, Re
447463void TradeGenerator::buildEquityOption (string equityCurveId, Real quantity, string maturity, Real strike,
448464 string tradeId, std::map<string, string> mapPairs) {
449465 map<string, string> eqData = fetchEquityRefData (equityCurveId);
450- string expiryDate = to_string (getEndDate (maturity, to_string (today_ )));
466+ string expiryDate = to_string (getEndDate (maturity, to_string (startDate_ )));
451467 string longShort = mapPairs.count (" longShort" ) == 1 ? mapPairs[" longShort" ] : " Long" ;
452468 string putCall = mapPairs.count (" putCall" ) == 1 ? mapPairs[" putCall" ] : " Call" ;
453469 TradeStrike tradeStrike (strike, eqData[" currency" ]);
@@ -464,7 +480,7 @@ void TradeGenerator::buildEquityForward(string equityCurveId, Real quantity, str
464480 string tradeId, std::map<string, string> mapPairs) {
465481 map<string, string> eqData = fetchEquityRefData (equityCurveId);
466482 string longShort = mapPairs.count (" longShort" ) == 1 ? mapPairs[" longShort" ] : " Long" ;
467- string expiryDate = to_string (getEndDate (maturity, to_string (today_ )));
483+ string expiryDate = to_string (getEndDate (maturity, to_string (startDate_ )));
468484 Envelope env = makeEnvelope ();
469485 QuantLib::ext::shared_ptr<EquityForward> trade (QuantLib::ext::make_shared<EquityForward>(ore::data::EquityForward (
470486 env, longShort, EquityUnderlying (equityCurveId), eqData[" currency" ], quantity, expiryDate, strike)));
@@ -485,7 +501,7 @@ LegData TradeGenerator::buildCPILeg(QuantLib::ext::shared_ptr<Convention> conv,
485501 string rule = " " ;
486502 Natural spotDays = 0 ;
487503 string floatFreq = to_string (infSwapConv->observationLag ());
488- auto qlStartDate = today_ + spotDays;
504+ auto qlStartDate = startDate_ + spotDays;
489505 string startDate = to_string (qlStartDate);
490506 string endDate = getEndDate (maturity, startDate, infSwapConv->infCalendar ());
491507
@@ -510,9 +526,8 @@ LegData TradeGenerator::buildOisLeg(QuantLib::ext::shared_ptr<Convention> conv,
510526 string cal = to_string (oisConv->fixedCalendar ());
511527 string rule = to_string (oisConv->rule ());
512528 string floatFreq = to_string (oisIndex->tenor ());
513- Date qlStartDate = today_ + oisConv->spotLag ();
529+ Date qlStartDate = startDate_ + oisConv->spotLag ();
514530 string startDate = getEndDate (start, to_string (qlStartDate), oisConv->fixedCalendar ());
515-
516531 string endDate = getEndDate (maturity, startDate, oisConv->fixedCalendar ());
517532 Natural spotDays = oisConv->spotLag ();
518533 string floatDC = to_string (oisConv->fixedDayCounter ());
@@ -545,7 +560,8 @@ LegData TradeGenerator::buildIborLeg(QuantLib::ext::shared_ptr<Convention> conv,
545560 {
546561 floatFreq = to_string (floatFreqEnum);
547562 }
548- string startDate = getEndDate (start, to_string (today_), iborConv->fixedCalendar ());
563+
564+ string startDate = getEndDate (start, to_string (startDate_), iborConv->fixedCalendar ());
549565 string endDate = getEndDate (maturity, startDate, iborConv->fixedCalendar ());
550566 Natural spotDays = 2 ;
551567 string floatDC = to_string (iborConv->fixedDayCounter ());
0 commit comments