22
22
datetime .datetime (2022 , 9 , 4 , tzinfo = NY_TZ ).date (),
23
23
datetime .datetime (2023 , 11 , 23 , tzinfo = NY_TZ ).date (),
24
24
datetime .datetime (2023 , 12 , 25 , tzinfo = NY_TZ ).date (),
25
+ datetime .datetime (2024 , 1 , 1 , tzinfo = NY_TZ ).date (),
26
+ datetime .datetime (2024 , 1 , 15 , tzinfo = NY_TZ ).date (),
27
+ datetime .datetime (2024 , 2 , 19 , tzinfo = NY_TZ ).date (),
28
+ datetime .datetime (2024 , 3 , 29 , tzinfo = NY_TZ ).date (),
29
+ datetime .datetime (2024 , 5 , 27 , tzinfo = NY_TZ ).date (),
30
+ datetime .datetime (2024 , 6 , 19 , tzinfo = NY_TZ ).date (),
31
+ datetime .datetime (2024 , 7 , 4 , tzinfo = NY_TZ ).date (),
32
+ datetime .datetime (2024 , 9 , 2 , tzinfo = NY_TZ ).date (),
33
+ datetime .datetime (2024 , 11 , 28 , tzinfo = NY_TZ ).date (),
34
+ datetime .datetime (2024 , 12 , 25 , tzinfo = NY_TZ ).date (),
25
35
]
26
36
NYSE_EARLY_HOLIDAYS = [
27
37
datetime .datetime (2023 , 7 , 3 , tzinfo = NY_TZ ).date (),
28
38
datetime .datetime (2023 , 11 , 24 , tzinfo = NY_TZ ).date (),
39
+ datetime .datetime (2024 , 7 , 3 , tzinfo = NY_TZ ).date (),
40
+ datetime .datetime (2024 , 11 , 29 , tzinfo = NY_TZ ).date (),
29
41
]
30
42
31
43
FX_METAL_OPEN_CLOSE_TIME = datetime .time (17 , 0 , 0 , tzinfo = NY_TZ )
35
47
FX_METAL_HOLIDAYS = [
36
48
datetime .datetime (2023 , 1 , 1 , tzinfo = NY_TZ ).date (),
37
49
datetime .datetime (2023 , 12 , 25 , tzinfo = NY_TZ ).date (),
50
+ datetime .datetime (2024 , 1 , 1 , tzinfo = NY_TZ ).date (),
51
+ datetime .datetime (2024 , 12 , 25 , tzinfo = NY_TZ ).date (),
38
52
]
39
53
40
54
RATES_OPEN = datetime .time (8 , 0 , 0 , tzinfo = NY_TZ )
@@ -60,7 +74,7 @@ def is_market_open(asset_type: str, dt: datetime.datetime) -> bool:
60
74
return False
61
75
62
76
if asset_type in ["fx" , "metal" ]:
63
- if date in FX_METAL_HOLIDAYS :
77
+ if date in FX_METAL_HOLIDAYS and time < FX_METAL_OPEN_CLOSE_TIME :
64
78
return False
65
79
# On Friday the market is closed after 5pm
66
80
if day == 4 and time >= FX_METAL_OPEN_CLOSE_TIME :
@@ -71,6 +85,13 @@ def is_market_open(asset_type: str, dt: datetime.datetime) -> bool:
71
85
# On Sunday the market is closed before 5pm
72
86
if day == 6 and time < FX_METAL_OPEN_CLOSE_TIME :
73
87
return False
88
+ # On Sunday the market is closed after 5pm if the next day is a holiday
89
+ if (
90
+ day == 6
91
+ and time >= FX_METAL_OPEN_CLOSE_TIME
92
+ and (date + datetime .timedelta (days = 1 ) in FX_METAL_HOLIDAYS )
93
+ ):
94
+ return False
74
95
75
96
return True
76
97
0 commit comments