from __future__ import annotations from datetime import datetime, timezone from typing import Any, Dict, List MARKET_SESSIONS: Dict[str, Dict[str, Any]] = { "NYSE/NASDAQ": {"tz": "US/Eastern", "open": (9, 30), "close": (16, 0), "days": range(5)}, "London (LSE)": {"tz": "Europe/London", "open": (8, 0), "close": (16, 30), "days": range(5)}, "Frankfurt (DAX)": {"tz": "Europe/Berlin", "open": (9, 0), "close": (17, 30), "days": range(5)}, "Tokyo (TSE)": {"tz": "Asia/Tokyo", "open": (9, 0), "close": (15, 30), "days": range(5)}, "Hong Kong (HKEX)": {"tz": "Asia/Hong_Kong", "open": (9, 30), "close": (16, 0), "days": range(5)}, "Shanghai (SSE)": {"tz": "Asia/Shanghai", "open": (9, 30), "close": (15, 0), "days": range(5)}, "Ho Chi Minh (HOSE)": {"tz": "Asia/Ho_Chi_Minh", "open": (9, 0), "close": (15, 0), "days": range(5)}, "Forex (24/5)": {"always_open": True, "days": range(5), "note": "Closes Sat-Sun UTC"}, "Crypto (24/7)": {"always_open": True, "note": "Never closes"}, } def market_status_now() -> List[Dict[str, Any]]: try: import pytz except ImportError: return [ {"market": market_name, "status": "unknown", "note": "pytz not installed"} for market_name in MARKET_SESSIONS ] results: List[Dict[str, Any]] = [] utc_now = datetime.now(timezone.utc) for name, info in MARKET_SESSIONS.items(): if info.get("always_open"): day_ok = utc_now.weekday() in info.get("days", range(7)) results.append( { "market": name, "status": "open" if day_ok else "closed", "note": info.get("note", ""), } ) continue try: timezone_info = pytz.timezone(info["tz"]) local_time = utc_now.astimezone(timezone_info) open_hour, open_minute = info["open"] close_hour, close_minute = info["close"] is_day = local_time.weekday() in info["days"] is_hours = (local_time.hour, local_time.minute) >= (open_hour, open_minute) and ( local_time.hour, local_time.minute, ) < (close_hour, close_minute) results.append( { "market": name, "status": "open" if (is_day and is_hours) else "closed", "local_time": local_time.strftime("%H:%M"), "opens_at": f"{open_hour:02d}:{open_minute:02d}", "closes_at": f"{close_hour:02d}:{close_minute:02d}", } ) except Exception as ex: results.append({"market": name, "status": "unknown", "error": str(ex)}) return results