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