Coverage Report

Created: 2026-01-25 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/quantlib/ql/time/calendars/hongkong.cpp
Line
Count
Source
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) 2007, 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
 <https://www.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/hongkong.hpp>
22
#include <ql/errors.hpp>
23
24
namespace QuantLib {
25
26
0
    HongKong::HongKong(Market m) {
27
        // all calendar instances share the same implementation instance
28
0
        static ext::shared_ptr<Calendar::Impl> impl(new HongKong::HkexImpl);
29
0
        switch (m) {
30
0
          case HKEx:
31
0
            impl_ = impl;
32
0
            break;
33
0
          default:
34
0
            QL_FAIL("unknown market");
35
0
        }
36
0
    }
37
38
0
    bool HongKong::HkexImpl::isBusinessDay(const Date& date) const {
39
0
        Weekday w = date.weekday();
40
0
        Day d = date.dayOfMonth(), dd = date.dayOfYear();
41
0
        Month m = date.month();
42
0
        Year y = date.year();
43
0
        Day em = easterMonday(y);
44
45
0
        if (isWeekend(w)
46
            // New Year's Day
47
0
            || ((d == 1 || ((d == 2) && w == Monday))
48
0
                && m == January)
49
            // Good Friday
50
0
            || (dd == em-3)
51
            // Easter Monday
52
0
            || (dd == em)
53
            // Labor Day
54
0
            || ((d == 1 || ((d == 2) && w == Monday)) && m == May)
55
            // SAR Establishment Day
56
0
            || ((d == 1 || ((d == 2) && w == Monday)) && m == July)
57
            // National Day
58
0
            || ((d == 1 || ((d == 2) && w == Monday))
59
0
                && m == October)
60
            // Christmas Day
61
0
            || (d == 25 && m == December)
62
            // Boxing Day
63
0
            || (d == 26 && m == December)
64
0
            )
65
0
            return false;
66
67
0
        if (y == 2004) {
68
0
            if (// Lunar New Year
69
0
                ((d==22 || d==23 || d==24) && m == January)
70
                // Ching Ming Festival
71
0
                || (d == 5 && m == April)
72
                // Buddha's birthday
73
0
                || (d == 26 && m == May)
74
                // Tuen Ng festival
75
0
                || (d == 22 && m == June)
76
                // Mid-autumn festival
77
0
                || (d == 29 && m == September)
78
                // Chung Yeung
79
0
                || (d == 22 && m == October))
80
0
                return false;
81
0
        }
82
83
0
        if (y == 2005) {
84
0
            if (// Lunar New Year
85
0
                ((d==9 || d==10 || d==11) && m == February)
86
                // Ching Ming Festival
87
0
                || (d == 5 && m == April)
88
                // Buddha's birthday
89
0
                || (d == 16 && m == May)
90
                // Tuen Ng festival
91
0
                || (d == 11 && m == June)
92
                // Mid-autumn festival
93
0
                || (d == 19 && m == September)
94
                // Chung Yeung festival
95
0
                || (d == 11 && m == October))
96
0
            return false;
97
0
        }
98
99
0
        if (y == 2006) {
100
0
            if (// Lunar New Year
101
0
                ((d >= 28 && d <= 31) && m == January)
102
                // Ching Ming Festival
103
0
                || (d == 5 && m == April)
104
                // Buddha's birthday
105
0
                || (d == 5 && m == May)
106
                // Tuen Ng festival
107
0
                || (d == 31 && m == May)
108
                // Mid-autumn festival
109
0
                || (d == 7 && m == October)
110
                // Chung Yeung festival
111
0
                || (d == 30 && m == October))
112
0
            return false;
113
0
        }
114
115
0
        if (y == 2007) {
116
0
            if (// Lunar New Year
117
0
                ((d >= 17 && d <= 20) && m == February)
118
                // Ching Ming Festival
119
0
                || (d == 5 && m == April)
120
                // Buddha's birthday
121
0
                || (d == 24 && m == May)
122
                // Tuen Ng festival
123
0
                || (d == 19 && m == June)
124
                // Mid-autumn festival
125
0
                || (d == 26 && m == September)
126
                // Chung Yeung festival
127
0
                || (d == 19 && m == October))
128
0
            return false;
129
0
        }
130
131
0
        if (y == 2008) {
132
0
            if (// Lunar New Year
133
0
                ((d >= 7 && d <= 9) && m == February)
134
                // Ching Ming Festival
135
0
                || (d == 4 && m == April)
136
                // Buddha's birthday
137
0
                || (d == 12 && m == May)
138
                // Tuen Ng festival
139
0
                || (d == 9 && m == June)
140
                // Mid-autumn festival
141
0
                || (d == 15 && m == September)
142
                // Chung Yeung festival
143
0
                || (d == 7 && m == October))
144
0
            return false;
145
0
        }
146
147
0
        if (y == 2009) {
148
0
            if (// Lunar New Year
149
0
                ((d >= 26 && d <= 28) && m == January)
150
                // Ching Ming Festival
151
0
                || (d == 4 && m == April)
152
                // Buddha's birthday
153
0
                || (d == 2 && m == May)
154
                // Tuen Ng festival
155
0
                || (d == 28 && m == May)
156
                // Mid-autumn festival
157
0
                || (d == 3 && m == October)
158
                // Chung Yeung festival
159
0
                || (d == 26 && m == October))
160
0
            return false;
161
0
        }
162
163
0
        if (y == 2010) {
164
0
            if (// Lunar New Year
165
0
                ((d == 15 || d == 16) && m == February)
166
                // Ching Ming Festival
167
0
                || (d == 6 && m == April)
168
                // Buddha's birthday
169
0
                || (d == 21 && m == May)
170
                // Tuen Ng festival
171
0
                || (d == 16 && m == June)
172
                // Mid-autumn festival
173
0
                || (d == 23 && m == September))
174
0
            return false;
175
0
        }
176
177
0
        if (y == 2011) {
178
0
            if (// Lunar New Year
179
0
                ((d == 3 || d == 4) && m == February)
180
                // Ching Ming Festival
181
0
                || (d == 5 && m == April)
182
                // Buddha's birthday
183
0
                || (d == 10 && m == May)
184
                // Tuen Ng festival
185
0
                || (d == 6 && m == June)
186
                // Mid-autumn festival
187
0
                || (d == 13 && m == September)
188
                // Chung Yeung festival
189
0
                || (d == 5 && m == October)
190
                // Second day after Christmas
191
0
                || (d == 27 && m == December))
192
0
            return false;
193
0
        }
194
195
0
        if (y == 2012) {
196
0
            if (// Lunar New Year
197
0
                (d >= 23 && d <= 25 && m == January)
198
                // Ching Ming Festival
199
0
                || (d == 4 && m == April)
200
                // Buddha's birthday
201
0
                || (d == 10 && m == May)
202
                // Mid-autumn festival
203
0
                || (d == 1 && m == October)
204
                // Chung Yeung festival
205
0
                || (d == 23 && m == October))
206
0
            return false;
207
0
        }
208
209
0
        if (y == 2013) {
210
0
            if (// Lunar New Year
211
0
                (d >= 11 && d <= 13 && m == February)
212
                // Ching Ming Festival
213
0
                || (d == 4 && m == April)
214
                // Buddha's birthday
215
0
                || (d == 17 && m == May)
216
                // Tuen Ng festival
217
0
                || (d == 12 && m == June)
218
                // Mid-autumn festival
219
0
                || (d == 20 && m == September)
220
                // Chung Yeung festival
221
0
                || (d == 14 && m == October))
222
0
            return false;
223
0
        }
224
225
0
        if (y == 2014) {
226
0
            if (// Lunar New Year
227
0
                ((d == 31 && m == January) || (d <= 3 && m == February))
228
                // Buddha's birthday
229
0
                || (d == 6 && m == May)
230
                // Tuen Ng festival
231
0
                || (d == 2 && m == June)
232
                // Mid-autumn festival
233
0
                || (d == 9 && m == September)
234
                // Chung Yeung festival
235
0
                || (d == 2 && m == October))
236
0
            return false;
237
0
        }
238
239
0
        if (y == 2015) {
240
0
            if (// Lunar New Year
241
0
                ((d == 19 && m == February) || (d == 20 && m == February))
242
                // The day following Easter Monday
243
0
                || (d == 7 && m == April)
244
                // Buddha's birthday
245
0
                || (d == 25 && m == May)
246
                // Tuen Ng festival
247
0
                || (d == 20 && m == June)
248
                // The 70th anniversary day of the victory of the Chinese 
249
                // people's war of resistance against Japanese aggression
250
0
                || (d == 3 && m == September)
251
                // Mid-autumn festival
252
0
                || (d == 28 && m == September)
253
                // Chung Yeung festival
254
0
                || (d == 21 && m == October))
255
0
                return false;
256
0
        }
257
258
0
        if (y == 2016) {
259
0
            if (// Lunar New Year
260
0
                ((d >= 8 && d <= 10) && m == February)
261
                // Ching Ming Festival
262
0
                || (d == 4 && m == April)
263
                // Tuen Ng festival
264
0
                || (d == 9 && m == June)
265
                // Mid-autumn festival
266
0
                || (d == 16 && m == September)
267
                // Chung Yeung festival
268
0
                || (d == 10 && m == October)
269
                // Second day after Christmas
270
0
                || (d == 27 && m == December))
271
0
                return false;
272
0
        }
273
274
0
        if (y == 2017) {
275
0
            if (// Lunar New Year
276
0
                ((d == 30 || d == 31) && m == January)
277
                // Ching Ming Festival
278
0
                || (d == 4 && m == April)
279
                // Buddha's birthday
280
0
                || (d == 3 && m == May)
281
                // Tuen Ng festival
282
0
                || (d == 30 && m == May)
283
                // Mid-autumn festival
284
0
                || (d == 5 && m == October))
285
0
                return false;
286
0
        }
287
288
0
        if (y == 2018) {
289
0
            if (// Lunar New Year
290
0
                ((d == 16 && m == February) || (d == 19 && m == February))
291
                // Ching Ming Festival
292
0
                || (d == 5 && m == April)
293
                // Buddha's birthday
294
0
                || (d == 22 && m == May)
295
                // Tuen Ng festival
296
0
                || (d == 18 && m == June)
297
                // Mid-autumn festival
298
0
                || (d == 25 && m == September)
299
                // Chung Yeung festival
300
0
                || (d == 17 && m == October))
301
0
                return false;
302
0
        }
303
304
0
        if (y == 2019) {
305
0
           if (// Lunar New Year
306
0
               ((d >= 5 && d <= 7) && m == February)
307
               // Ching Ming Festival
308
0
               || (d == 5 && m == April)
309
               // Tuen Ng festival
310
0
               || (d == 7 && m == June)
311
               // Chung Yeung festival
312
0
               || (d == 7 && m == October))
313
0
               return false;
314
0
        }
315
316
0
        if (y == 2020) {
317
0
           if (// Lunar New Year
318
0
               ((d == 27 || d == 28) && m == January)
319
               // Ching Ming Festival
320
0
               || (d == 4 && m == April)
321
               // Buddha's birthday
322
0
               || (d == 30 && m == April)
323
               // Tuen Ng festival
324
0
               || (d == 25 && m == June)
325
               // Mid-autumn festival
326
0
               || (d == 2 && m == October)
327
               // Chung Yeung festival
328
0
               || (d == 26 && m == October))
329
0
               return false;
330
0
        }
331
332
        // data from https://www.hkex.com.hk/-/media/hkex-market/services/circulars-and-notices/participant-and-members-circulars/sehk/2020/ce_sehk_ct_038_2020.pdf
333
0
        if (y == 2021)
334
0
        {
335
0
            if (// Lunar New Year
336
0
                ((d == 12 || d == 15) && m == February)
337
                // Ching Ming Festival
338
0
                || (d == 5 && m == April)
339
                // Buddha's birthday
340
0
                || (d == 19 && m == May)
341
                // Tuen Ng festival
342
0
                || (d == 14 && m == June)
343
                // Mid-autumn festival
344
0
                || (d == 22 && m == September)
345
                // Chung Yeung festival
346
0
                || (d == 14 && m == October))
347
0
                return false;
348
0
        }
349
350
        // data from https://www.hkex.com.hk/-/media/HKEX-Market/Services/Circulars-and-Notices/Participant-and-Members-Circulars/SEHK/2021/ce_SEHK_CT_082_2021.pdf
351
0
        if (y == 2022)
352
0
        {
353
0
            if (// Lunar New Year
354
0
                ((d >= 1 && d <= 3) && m == February)
355
                // Ching Ming Festival
356
0
                || (d == 5 && m == April)
357
                // Buddha's birthday
358
0
                || (d == 9 && m == May)
359
                // Tuen Ng festival
360
0
                || (d == 3 && m == June)
361
                // Mid-autumn festival
362
0
                || (d == 12 && m == September)
363
                // Chung Yeung festival
364
0
                || (d == 4 && m == October))
365
0
                return false;
366
0
        }
367
368
        // data from https://www.hkex.com.hk/-/media/HKEX-Market/Services/Circulars-and-Notices/Participant-and-Members-Circulars/SEHK/2022/ce_SEHK_CT_058_2022.pdf
369
0
        if (y == 2023)
370
0
        {
371
0
            if (// Lunar New Year
372
0
                ((d >= 23 && d <= 25) && m == January)
373
                // Ching Ming Festival
374
0
                || (d == 5 && m == April)
375
                // Buddha's birthday
376
0
                || (d == 26 && m == May)
377
                // Tuen Ng festival
378
0
                || (d == 22 && m == June)
379
                // Chung Yeung festival
380
0
                || (d == 23 && m == October))
381
0
                return false;
382
0
        }
383
384
        // data from https://www.hkex.com.hk/-/media/HKEX-Market/Services/Circulars-and-Notices/Participant-and-Members-Circulars/SEHK/2023/ce_SEHK_CT_079_2023.pdf
385
0
        if (y == 2024) {
386
0
            if (// Lunar New Year
387
0
                ((d == 12 || d == 13) && m == February)
388
                // Ching Ming Festival
389
0
                || (d == 4 && m == April)
390
                // Buddha's birthday
391
0
                || (d == 15 && m == May)
392
                // Tuen Ng festival
393
0
                || (d == 10 && m == June)
394
                // Mid-autumn festival
395
0
                || (d == 18 && m == September)
396
                // Chung Yeung festival
397
0
                || (d == 11 && m == October))
398
0
                return false;
399
0
        }
400
401
        // data from https://www.hkex.com.hk/-/media/HKEX-Market/Services/Circulars-and-Notices/Participant-and-Members-Circulars/SEHK/2024/ce_SEHK_CT_063_2024.pdf
402
0
        if (y == 2025) {
403
0
            if (// Lunar New Year
404
0
                ((d >= 29 && d <= 31) && m == January)
405
                // Ching Ming Festival
406
0
                || (d == 4 && m == April)
407
                // Buddha's birthday
408
0
                || (d == 5 && m == May)
409
                // Mid-autumn festival
410
0
                || (d == 7 && m == October)
411
                // Chung Yeung festival
412
0
                || (d == 29 && m == October))
413
0
                return false;
414
0
        }
415
416
0
        return true;
417
0
    }
418
419
}