From 531061e6bb0ec404de5631ebc9e88819949688e3 Mon Sep 17 00:00:00 2001 From: Robert Tidball Date: Wed, 8 Jul 2026 18:58:06 +1000 Subject: [PATCH] Add FXMacroData release calendar helper --- .../fxmacrodata_calendar.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 examples/FXMacroData_Calendar/fxmacrodata_calendar.py diff --git a/examples/FXMacroData_Calendar/fxmacrodata_calendar.py b/examples/FXMacroData_Calendar/fxmacrodata_calendar.py new file mode 100644 index 0000000..e976702 --- /dev/null +++ b/examples/FXMacroData_Calendar/fxmacrodata_calendar.py @@ -0,0 +1,35 @@ +"""FXMacroData release-calendar helper for forex backtest examples.""" + +import json +from datetime import date, timedelta +from urllib.parse import urlencode +from urllib.request import urlopen + + +BASE_URL = "https://fxmacrodata.com/api/v1/calendar/{currency}" + + +def fetch_calendar(currency="USD", start_date=None, end_date=None, timeout=20): + today = date.today() + start_date = start_date or today.isoformat() + end_date = end_date or (today + timedelta(days=14)).isoformat() + query = urlencode({"start_date": start_date, "end_date": end_date}) + + with urlopen("{}?{}".format(BASE_URL.format(currency=currency), query), timeout=timeout) as response: + payload = json.load(response) + + return payload.get("data", []) + + +def top_tier_blackout_dates(events): + dates = set() + for event in events: + if event.get("top_tier_for_currency") or event.get("market_tier") == 1: + event_time = event.get("announcement_datetime_utc") or event.get("announcement_datetime_local") + dates.add((event_time or event.get("date", ""))[:10]) + return sorted(item for item in dates if item) + + +if __name__ == "__main__": + events = fetch_calendar(start_date="2026-07-01", end_date="2026-07-20") + print(top_tier_blackout_dates(events))