1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 3 /* 4 Copyright (C) 2004 FIMAT Group 5 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 StatPro Italia srl 6 7 This file is part of QuantLib, a free-software/open-source library 8 for financial quantitative analysts and developers - http://quantlib.org/ 9 10 QuantLib is free software: you can redistribute it and/or modify it 11 under the terms of the QuantLib license. You should have received a 12 copy of the license along with this program; if not, please email 13 <quantlib-dev@lists.sf.net>. The license is also available online at 14 <http://quantlib.org/license.shtml>. 15 16 This program is distributed in the hope that it will be useful, but WITHOUT 17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 18 FOR A PARTICULAR PURPOSE. See the license for more details. 19 */ 20 21 #include <ql/time/calendars/taiwan.hpp> 22 23 namespace QuantLib { 24 Taiwan(Market)25 Taiwan::Taiwan(Market) { 26 // all calendar instances share the same implementation instance 27 static ext::shared_ptr<Calendar::Impl> impl(new Taiwan::TsecImpl); 28 impl_ = impl; 29 } 30 isWeekend(Weekday w) const31 bool Taiwan::TsecImpl::isWeekend(Weekday w) const { 32 return w == Saturday || w == Sunday; 33 } 34 isBusinessDay(const Date & date) const35 bool Taiwan::TsecImpl::isBusinessDay(const Date& date) const { 36 Weekday w = date.weekday(); 37 Day d = date.dayOfMonth(); 38 Month m = date.month(); 39 Year y = date.year(); 40 41 if (isWeekend(w) 42 // New Year's Day 43 || (d == 1 && m == January) 44 // Peace Memorial Day 45 || (d == 28 && m == February) 46 // Labor Day 47 || (d == 1 && m == May) 48 // Double Tenth 49 || (d == 10 && m == October) 50 ) 51 return false; 52 53 if (y == 2002) { 54 // Dragon Boat Festival and Moon Festival fall on Saturday 55 if (// Chinese Lunar New Year 56 (d >= 9 && d <= 17 && m == February) 57 // Tomb Sweeping Day 58 || (d == 5 && m == April) 59 ) 60 return false; 61 } 62 63 if (y == 2003) { 64 // Tomb Sweeping Day falls on Saturday 65 if (// Chinese Lunar New Year 66 ((d >= 31 && m == January) || (d <= 5 && m == February)) 67 // Dragon Boat Festival 68 || (d == 4 && m == June) 69 // Moon Festival 70 || (d == 11 && m == September) 71 ) 72 return false; 73 } 74 75 if (y == 2004) { 76 // Tomb Sweeping Day falls on Sunday 77 if (// Chinese Lunar New Year 78 (d >= 21 && d <= 26 && m == January) 79 // Dragon Boat Festival 80 || (d == 22 && m == June) 81 // Moon Festival 82 || (d == 28 && m == September) 83 ) 84 return false; 85 } 86 87 if (y == 2005) { 88 // Dragon Boat and Moon Festival fall on Saturday or Sunday 89 if (// Chinese Lunar New Year 90 (d >= 6 && d <= 13 && m == February) 91 // Tomb Sweeping Day 92 || (d == 5 && m == April) 93 // make up for Labor Day, not seen in other years 94 || (d == 2 && m == May) 95 ) 96 return false; 97 } 98 99 if (y == 2006) { 100 // Dragon Boat and Moon Festival fall on Saturday or Sunday 101 if (// Chinese Lunar New Year 102 ((d >= 28 && m == January) || (d <= 5 && m == February)) 103 // Tomb Sweeping Day 104 || (d == 5 && m == April) 105 // Dragon Boat Festival 106 || (d == 31 && m == May) 107 // Moon Festival 108 || (d == 6 && m == October) 109 ) 110 return false; 111 } 112 113 if (y == 2007) { 114 if (// Chinese Lunar New Year 115 (d >= 17 && d <= 25 && m == February) 116 // Tomb Sweeping Day 117 || (d == 5 && m == April) 118 // adjusted holidays 119 || (d == 6 && m == April) 120 || (d == 18 && m == June) 121 // Dragon Boat Festival 122 || (d == 19 && m == June) 123 // adjusted holiday 124 || (d == 24 && m == September) 125 // Moon Festival 126 || (d == 25 && m == September) 127 ) 128 return false; 129 } 130 131 if (y == 2008) { 132 if (// Chinese Lunar New Year 133 (d >= 4 && d <= 11 && m == February) 134 // Tomb Sweeping Day 135 || (d == 4 && m == April) 136 ) 137 return false; 138 } 139 140 if (y == 2009) { 141 if (// Public holiday 142 (d == 2 && m == January) 143 // Chinese Lunar New Year 144 || (d >= 24 && m == January) 145 // Tomb Sweeping Day 146 || (d == 4 && m == April) 147 // Dragon Boat Festival 148 || ((d == 28 || d == 29) && m == May) 149 // Moon Festival 150 || (d == 3 && m == October) 151 ) 152 return false; 153 } 154 155 if (y == 2010) { 156 if (// Chinese Lunar New Year 157 (d >= 13 && d <= 21 && m == January) 158 // Tomb Sweeping Day 159 || (d == 5 && m == April) 160 // Dragon Boat Festival 161 || (d == 16 && m == May) 162 // Moon Festival 163 || (d == 22 && m == September) 164 ) 165 return false; 166 } 167 168 if (y == 2011) { 169 if (// Spring Festival 170 (d >= 2 && d <= 7 && m == February) 171 // Children's Day 172 || (d == 4 && m == April) 173 // Tomb Sweeping Day 174 || (d == 5 && m == April) 175 // Labour Day 176 || (d == 2 && m == May) 177 // Dragon Boat Festival 178 || (d == 6 && m == June) 179 // Mid-Autumn Festival 180 || (d == 12 && m == September) 181 ) 182 return false; 183 } 184 185 if (y == 2012) { 186 if (// Spring Festival 187 (d >= 23 && d <= 27 && m == January) 188 // Peace Memorial Day 189 || (d == 27 && m == February) 190 // Children's Day 191 // Tomb Sweeping Day 192 || (d == 4 && m == April) 193 // Labour Day 194 || (d == 1 && m == May) 195 // Dragon Boat Festival 196 || (d == 23 && m == June) 197 // Mid-Autumn Festival 198 || (d == 30 && m == September) 199 // Memorial Day: 200 // Founding of the Republic of China 201 || (d == 31 && m == December) 202 ) 203 return false; 204 } 205 206 if (y == 2013) { 207 if (// Spring Festival 208 (d >= 10 && d <= 15 && m == February) 209 // Children's Day 210 || (d == 4 && m == April) 211 // Tomb Sweeping Day 212 || (d == 5 && m == April) 213 // Labour Day 214 || (d == 1 && m == May) 215 // Dragon Boat Festival 216 || (d == 12 && m == June) 217 // Mid-Autumn Festival 218 || (d >= 19 && d <= 20 && m == September) 219 ) 220 return false; 221 } 222 223 if (y == 2014) { 224 if (// Lunar New Year 225 (d >= 28 && d <= 30 && m == January) 226 // Spring Festival 227 || ((d == 31 && m == January) || (d <= 4 && m == February)) 228 // Children's Day 229 || (d == 4 && m == April) 230 // Tomb Sweeping Day 231 || (d == 5 && m == April) 232 // Dragon Boat Festival 233 || (d == 2 && m == June) 234 // Mid-Autumn Festival 235 || (d == 8 && m == September) 236 ) 237 return false; 238 } 239 240 if (y == 2015) { 241 if (// adjusted holidays 242 (d == 2 && m == January) 243 // Lunar New Year 244 || (d >= 18 && d <= 23 && m == February) 245 // adjusted holidays 246 || (d == 27 && m == February) 247 // adjusted holidays 248 || (d == 3 && m == April) 249 // adjusted holidays 250 || (d == 6 && m == April) 251 // adjusted holidays 252 || (d == 19 && m == June) 253 // adjusted holidays 254 || (d == 28 && m == September) 255 // adjusted holidays 256 || (d == 9 && m == October) 257 ) 258 return false; 259 } 260 261 if (y == 2016) { 262 if (// Lunar New Year 263 (d >= 8 && d <= 12 && m == February) 264 // adjusted holidays 265 || (d == 29 && m == February) 266 // Children's Day 267 || (d == 4 && m == April) 268 // adjusted holidays 269 || (d == 5 && m == April) 270 // adjusted holidays 271 || (d == 2 && m == May) 272 // Dragon Boat Festival 273 || (d == 9 && m == June) 274 // adjusted holidays 275 || (d == 10 && m == June) 276 // Mid-Autumn Festival 277 || (d == 15 && m == September) 278 // adjusted holidays 279 || (d == 16 && m == September) 280 ) 281 return false; 282 } 283 284 if (y == 2017) { 285 if (// adjusted holidays 286 (d == 2 && m == January) 287 // Lunar New Year 288 || ((d >= 27 && m == January) || (d == 1 && m == February)) 289 // adjusted holidays 290 || (d == 27 && m == February) 291 // adjusted holidays 292 || (d == 3 && m == April) 293 // Children's Day 294 || (d == 4 && m == April) 295 // adjusted holidays 296 || (d == 29 && m == May) 297 // Dragon Boat Festival 298 || (d == 30 && m == May) 299 // Mid-Autumn Festival 300 || (d == 4 && m == October) 301 // adjusted holidays 302 || (d == 9 && m == October) 303 ) 304 return false; 305 } 306 307 if (y == 2018) { 308 if (// Lunar New Year 309 (d >= 15 && d <= 20 && m == February) 310 // Children's Day 311 || (d == 4 && m == April) 312 // Tomb Sweeping Day 313 || (d == 5 && m == April) 314 // adjusted holidays 315 || (d == 6 && m == April) 316 // Dragon Boat Festival 317 || (d == 18 && m == June) 318 // Mid-Autumn Festival 319 || (d == 24 && m == September) 320 // adjusted holidays 321 || (d == 31 && m == December) 322 ) 323 return false; 324 } 325 326 if (y == 2019) { 327 if (// Lunar New Year 328 (d >= 4 && d <= 8 && m == February) 329 // adjusted holidays 330 || (d == 1 && m == March) 331 // Children's Day 332 || (d == 4 && m == April) 333 // Tomb Sweeping Day 334 || (d == 5 && m == April) 335 // Dragon Boat Festival 336 || (d == 7 && m == June) 337 // Mid-Autumn Festival 338 || (d == 13 && m == September) 339 // adjusted holidays 340 || (d == 11 && m == October) 341 ) 342 return false; 343 } 344 345 return true; 346 } 347 348 } 349 350