Live pipeline · forward test running Macro FX / fundamental 28 FX pairs Daily · free data

Royal FX — Macro FX
Asset Screener

A faithful, keyless re-implementation of the Royal Trader “FX Asset Screener” spreadsheet: forecast-surprise + long-term scoring across 9 heatmaps and 28 pairs, with COT, central-bank probabilities, retail sentiment and seasonality — now running as a live daily pipeline with a forward test.

Spreadsheet parity validated · live forward test in progress (44.8% WR)
2,847
Forward-test signal outcomes
52 dated entries · 44.8% win rate
9 + 28
Heatmaps + pairs
Daily scoring engine, exact ODS formulas
−6 / −9
US FSS / LTS parity
Bearish — reproduces the ODS spreadsheet exactly
0
Paid subscriptions
FRED, ForexFactory, CFTC, rateprobability, Myfxbook, frankfurter

Verdict

The scoring engine exactly reproduces the original spreadsheet (US heatmap FSS −6 / LTS −9, FRED blocks, CFTC COT row, seasonality tables), and the full pipeline is live with 4 daily/weekly cron jobs feeding Obsidian + Notion.

The forward test (2,847 signal outcomes, 44.8% win rate) is the honest measure of whether the screener predicts anything — the site shows it live. The screener is a decision-support tool, not a mechanical entry: it ranks currencies by macro surprise + positioning, which the user then layers with their own trade plan.

What the screener does

Forecast Surprise Score (FSS)

Compares actual economic releases (FRED) against forecasts (ForexFactory): positive surprise = score for the currency. US block validated: GDP 1.50/2.10, UR 4.10/4.20, NFP −23k.

Long Term Score (LTS)

Trend/level-based scoring over longer windows — US LTS −9 (bearish) reproduces the ODS exactly.

Positioning & flow inputs

CFTC COT (large-spec net positions, EUR −72,447 validated), CB rate probabilities (rateprobability.com), retail sentiment (Myfxbook), 10Y seasonality (frankfurter/ECB).

Pair Total Score

Currency strength per pair → pair-level Total Score (additive component subset implemented; the remaining spreadsheet component awaits its source data per FORMULA_NOTES §4).

Live status & forward test

ComponentStatusEvidence
Scoring engineValidatedUS heatmap FSS −6 (Bearish), LTS −9 (Bearish) matches ODS
FRED collectorLivekeyless fredgraph.csv; GDP/UR/NFP match ODS
ForexFactory calendarLiveactual/forecast/previous per release, country-filtered
CFTC COTLiveEUR FX net −72,447 on 2026-07-28 matches ODS COT History
CB probabilities / retail sentimentLiveweb_extract → markdown → parse (06:00 / 06:05 cron)
History + forward testLive52 dated entries · 2,847 outcomes · 44.8% WR
PipelineLive9 heatmaps + 28 pairs + COT + history + forward test daily (06:20 Sydney)

How it was built

Reverse-engineering

The spreadsheet formulas were reconstructed into engine/heatmap_scorer.py + currency_strength.py, then validated cell-by-cell against the ODS (FORMULA_NOTES.md).

Free data only

FRED (keyless), ForexFactory (scrape), CFTC PRE Socrata API (keyless), rateprobability.com + Myfxbook (rendered fetch → markdown parse), frankfurter.app (ECB).

Delivery

Dated JSON/MD per day in data/, static SPA in site/ (Cloudflare Pages-ready), Obsidian vault push, Notion 'FX Screener Log' DB (15 rows/day), 4 cron jobs.

Honesty

The forward test is published as it runs — WON/LOST/OPEN per signal, no cherry-picking. Currently 44.8% WR over 2,847 outcomes.

Run it yourself

pip install -r requirements.txt
python3 pipeline/run_daily.py   # full daily run, no API keys
cd site && python3 -m http.server 8799   # preview dashboard
# optional web_extract inputs (CB probs / retail sentiment)
python3 pipeline/run_daily.py --cb-file data/raw/rateprobability_2026-09-03.md \
  --retail-file data/raw/myfxbook_2026-09-03.md