Adding an Economic Calendar Risk Layer to My SM0DTE Bot

On Friday, August 22, 2025, I had one of those trading days that every systematic trader dreads.
I lost 3x my intended risk on a single trade, not because the strategy was broken, but because of something I should have anticipated: Fed Chair Powell spoke at 10:00 AM EST during the Jackson Hole Symposium. The market moved aggressively, spreads blew out, and my stop execution slipped.

That was the wake-up call to add a new risk management layer to my SM0DTE bot.


The Problem

My SM0DTE bot is designed to take a single entry at 9:33 AM, just after the market opens.
The strategy works well under normal conditions, but I realized it was vulnerable to macro events that can create outsized volatility, especially when they occur shortly after the open.

Up until this point, the bot had no awareness of the economic calendar. It would enter trades blindly, even on days with NFP, CPI, Powell speeches, or FOMC announcements.


The Solution

I created a new events pipeline that scrapes monthly calendar dumps (from ForexFactory.com), converts them into a structured events.json, and classifies events into severity tiers:

  • 🚨 Tier 1 (T1): Always skip the whole day.
    Examples: Fed Chair Powell Speaks, FOMC Statement, NFP, CPI, Core PCE.

  • ⚠️ Tier 2 (T2): Skip if the event happens after the open and before 2 PM.
    Examples: ISM PMIs, Retail Sales, JOLTS, Unemployment Claims.

  • ℹ️ Tier 3 (T3): Log only, never block trades.
    Examples: Flash PMIs, UoM Inflation Expectations.

This classification allowed me to design a simple pre-check at bot startup:

  • If T1 → skip the day.
  • If T2 in the morning window (post-open but before 14:00) → skip the entry.
  • If T3 → just log.

Implementation

I extended my utils folder with two new components:

  1. event_parser.py: Converts monthly .txt calendar dumps into structured JSON.
    • Deduplicates entries.
    • Tags each event with severity (T1, T2, T3).
    • Supports --dry-run for validation.
  2. event_utils.py: Provides the runtime logic.
    • Loads today’s events from events.json.
    • Applies the tiered rules at 09:33 (my bot’s fixed entry time).
    • Returns a decision: proceed, skip_entry, or skip_day.

At startup, the bot now logs and notifies me of today’s events and the decision.
This means no more blind entries on days like August 22 when Powell speaks.


Key Takeaway

The lesson here: strategy edge isn’t just about signals and entries.
Risk management includes knowing when not to play. For systematic intraday strategies, adding an economic calendar awareness layer can be the difference between consistency and costly surprises.


Next Steps

I plan to eventually swap out the manual events.json with a live API (Finnhub, Trading Economics, or FMP), but for now, this static approach already hardens the bot significantly.

On August 23, I pushed this enhancement live — one day too late for the Powell debacle, but early enough to protect me going forward.