2222 datetime .datetime (2022 , 9 , 4 , tzinfo = NY_TZ ).date (),
2323 datetime .datetime (2023 , 11 , 23 , tzinfo = NY_TZ ).date (),
2424 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 (),
2535]
2636NYSE_EARLY_HOLIDAYS = [
2737 datetime .datetime (2023 , 7 , 3 , tzinfo = NY_TZ ).date (),
2838 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 (),
2941]
3042
3143FX_METAL_OPEN_CLOSE_TIME = datetime .time (17 , 0 , 0 , tzinfo = NY_TZ )
3547FX_METAL_HOLIDAYS = [
3648 datetime .datetime (2023 , 1 , 1 , tzinfo = NY_TZ ).date (),
3749 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 (),
3852]
3953
4054RATES_OPEN = datetime .time (8 , 0 , 0 , tzinfo = NY_TZ )
@@ -60,7 +74,7 @@ def is_market_open(asset_type: str, dt: datetime.datetime) -> bool:
6074 return False
6175
6276 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 :
6478 return False
6579 # On Friday the market is closed after 5pm
6680 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:
7185 # On Sunday the market is closed before 5pm
7286 if day == 6 and time < FX_METAL_OPEN_CLOSE_TIME :
7387 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
7495
7596 return True
7697
0 commit comments