diff --git a/ChangeLog b/ChangeLog index 71c69f4..1f086f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2026-07-23 Maximilian Muecke + + * R/calendars.R, src/calendars.cpp: Add missing market calendars for + Indonesia, Poland, Romania, and Russia + * src/calendars.cpp: Remove an unreachable duplicate Null calendar branch + * src/calendars.cpp: Accept '::' alias spellings for Israel, Japan, + NewZealand, SouthKorea, and UnitedKingdom market calendars + 2026-07-22 Maximilian Muecke * R/implied.R (AmericanOptionImpliedVolatility.default): Assign the diff --git a/R/calendars.R b/R/calendars.R index cf151f4..22f075b 100644 --- a/R/calendars.R +++ b/R/calendars.R @@ -57,6 +57,8 @@ calendars <- c("TARGET", "Iceland", "India", "Indonesia", + "Indonesia/BEJ", + "Indonesia/JSX", "Israel", "Israel/TASE", "Israel/SHIR", @@ -73,8 +75,12 @@ calendars <- c("TARGET", "Norway", "Null", "Poland", + "Poland/WSE", "Romania", + "Romania/Public", + "Romania/BVB", "Russia", + "Russia/MOEX", "SaudiArabia", "Serbia", "Singapore", diff --git a/src/calendars.cpp b/src/calendars.cpp index c4ebef0..1dd8381 100644 --- a/src/calendars.cpp +++ b/src/calendars.cpp @@ -152,20 +152,35 @@ QuantLib::ext::shared_ptr getCalendar(const std::string &cal } else if (calstr == "India") { pcal.reset(new QuantLib::India()); - } else if (calstr == "Indonesia") { - pcal.reset(new QuantLib::Indonesia()); + } else if (calstr == "Indonesia" || + calstr == "Indonesia/IDX" || + calstr == "Indonesia::IDX") { + pcal.reset(new QuantLib::Indonesia(QuantLib::Indonesia::IDX)); + } else if (calstr == "Indonesia/BEJ" || + calstr == "Indonesia::BEJ") { + pcal.reset(new QuantLib::Indonesia(QuantLib::Indonesia::BEJ)); + } else if (calstr == "Indonesia/JSX" || + calstr == "Indonesia::JSX") { + pcal.reset(new QuantLib::Indonesia(QuantLib::Indonesia::JSX)); #if QL_HEX_VERSION <= 0x014201f0 - } else if (calstr == "Israel" || calstr == "Israel/Settlement") { + } else if (calstr == "Israel" || + calstr == "Israel/Settlement" || + calstr == "Israel::Settlement") { pcal.reset(new QuantLib::Israel(QuantLib::Israel::Settlement)); - } else if (calstr == "Israel/TASE") { + } else if (calstr == "Israel/TASE" || + calstr == "Israel::TASE") { pcal.reset(new QuantLib::Israel(QuantLib::Israel::TASE)); #else - } else if (calstr == "Israel" || calstr == "Israel/TASE") { + } else if (calstr == "Israel" || + calstr == "Israel/TASE" || + calstr == "Israel::TASE") { pcal.reset(new QuantLib::Israel(QuantLib::Israel::TASE)); - } else if (calstr == "Israel/SHIR") { + } else if (calstr == "Israel/SHIR" || + calstr == "Israel::SHIR") { pcal.reset(new QuantLib::Israel(QuantLib::Israel::SHIR)); - } else if (calstr == "Israel/Telbor") { + } else if (calstr == "Israel/Telbor" || + calstr == "Israel::Telbor") { pcal.reset(new QuantLib::Israel(QuantLib::Israel::Telbor)); #endif @@ -177,7 +192,9 @@ QuantLib::ext::shared_ptr getCalendar(const std::string &cal calstr == "Italy::Exchange") { pcal.reset(new QuantLib::Italy(QuantLib::Italy::Exchange)); - } else if (calstr == "Japan" || calstr == "Japan/Settlement") { + } else if (calstr == "Japan" || + calstr == "Japan/Settlement" || + calstr == "Japan::Settlement") { pcal.reset(new QuantLib::Japan()); #if QL_HEX_VERSION >= 0x014300f0 @@ -195,9 +212,11 @@ QuantLib::ext::shared_ptr getCalendar(const std::string &cal #if QL_HEX_VERSION >= 0x013700f0 } else if (calstr == "NewZealand" || - calstr == "NewZealand/Wellington") { + calstr == "NewZealand/Wellington" || + calstr == "NewZealand::Wellington") { pcal.reset(new QuantLib::NewZealand(QuantLib::NewZealand::Wellington)); - } else if (calstr == "NewZealand/Auckland") { + } else if (calstr == "NewZealand/Auckland" || + calstr == "NewZealand::Auckland") { pcal.reset(new QuantLib::NewZealand(QuantLib::NewZealand::Auckland)); #else } else if (calstr == "NewZealand") { @@ -217,16 +236,34 @@ QuantLib::ext::shared_ptr getCalendar(const std::string &cal calstr == "NULL") { pcal.reset(new QuantLib::NullCalendar()); +#if QL_HEX_VERSION >= 0x013600f0 + } else if (calstr == "Poland" || + calstr == "Poland/Settlement" || + calstr == "Poland::Settlement") { + pcal.reset(new QuantLib::Poland(QuantLib::Poland::Settlement)); + } else if (calstr == "Poland/WSE" || + calstr == "Poland::WSE") { + pcal.reset(new QuantLib::Poland(QuantLib::Poland::WSE)); +#else } else if (calstr == "Poland") { pcal.reset(new QuantLib::Poland()); +#endif - } else if (calstr == "Romania" || calstr == "Romania/Public") { + } else if (calstr == "Romania" || + calstr == "Romania/Public" || + calstr == "Romania::Public") { pcal.reset(new QuantLib::Romania(QuantLib::Romania::Public)); - } else if (calstr == "Romania/BVB") { + } else if (calstr == "Romania/BVB" || + calstr == "Romania::BVB") { pcal.reset(new QuantLib::Romania(QuantLib::Romania::BVB)); - } else if (calstr == "Russia") { - pcal.reset(new QuantLib::Russia()); + } else if (calstr == "Russia" || + calstr == "Russia/Settlement" || + calstr == "Russia::Settlement") { + pcal.reset(new QuantLib::Russia(QuantLib::Russia::Settlement)); + } else if (calstr == "Russia/MOEX" || + calstr == "Russia::MOEX") { + pcal.reset(new QuantLib::Russia(QuantLib::Russia::MOEX)); } else if (calstr == "SaudiArabia") { pcal.reset(new QuantLib::SaudiArabia()); @@ -250,9 +287,12 @@ QuantLib::ext::shared_ptr getCalendar(const std::string &cal } else if (calstr == "SouthAfrica") { pcal.reset(new QuantLib::SouthAfrica()); - } else if (calstr == "SouthKorea" || calstr == "SouthKorea/Settlement") { + } else if (calstr == "SouthKorea" || + calstr == "SouthKorea/Settlement" || + calstr == "SouthKorea::Settlement") { pcal.reset(new QuantLib::SouthKorea(QuantLib::SouthKorea::Settlement)); - } else if (calstr == "SouthKorea/KRX") { + } else if (calstr == "SouthKorea/KRX" || + calstr == "SouthKorea::KRX") { pcal.reset(new QuantLib::SouthKorea(QuantLib::SouthKorea::KRX)); } else if (calstr == "Sweden") { @@ -273,11 +313,15 @@ QuantLib::ext::shared_ptr getCalendar(const std::string &cal } else if (calstr == "Ukraine") { pcal.reset(new QuantLib::Ukraine()); - } else if (calstr == "UnitedKingdom" || calstr == "UnitedKingdom/Settlement") { + } else if (calstr == "UnitedKingdom" || + calstr == "UnitedKingdom/Settlement" || + calstr == "UnitedKingdom::Settlement") { pcal.reset(new QuantLib::UnitedKingdom(QuantLib::UnitedKingdom::Settlement)); - } else if (calstr == "UnitedKingdom/Exchange") { + } else if (calstr == "UnitedKingdom/Exchange" || + calstr == "UnitedKingdom::Exchange") { pcal.reset(new QuantLib::UnitedKingdom(QuantLib::UnitedKingdom::Exchange)); - } else if (calstr == "UnitedKingdom/Metals") { + } else if (calstr == "UnitedKingdom/Metals" || + calstr == "UnitedKingdom::Metals") { pcal.reset(new QuantLib::UnitedKingdom(QuantLib::UnitedKingdom::Metals)); #if QL_HEX_VERSION >= 0x014300f0 @@ -288,9 +332,6 @@ QuantLib::ext::shared_ptr getCalendar(const std::string &cal } else if (calstr == "WeekendsOnly") { pcal.reset(new QuantLib::WeekendsOnly()); - } else if (calstr == "Null" || calstr == "null" || calstr == "NULL") { - pcal.reset(new QuantLib::NullCalendar()); - } else { throw std::invalid_argument("Calendar " + calstr + " not recognised "); }