FX TRACK RECORD
The honest FX hit-rate scorecard
Two separate FX track records, graded two different ways, shown side by side and never blended into one flattering number. Every call was published before its outcome and graded by a fixed public rule. Winners and losers both count.
A percentage appears only once a bucket has at least 20 graded calls; below that it reads “accumulating”, because a hit-rate from a handful of calls is noise, not evidence.
How we grade — and why you can trust it
Every call was published before its outcome was known and graded by a fixed public rule. Hit-rate = hits / (hits + misses); neutral expiries are shown separately, never hidden. Rates appear only once a bucket has at least 20 graded calls. No hypothetical backtests are shown here.
The evidence doctrine, in plain terms
Published before the outcome. Every call here was timestamped and recorded before the market resolved it — not scored after the fact.
Graded by a fixed public rule. The same rule grades winners and losers. We never re-read old commentary to decide, in hindsight, whether a call was “kind of right”.
Nothing hidden. Losers are shown. Neutral (expired) calls are shown on their own line and excluded from the rate — they never quietly inflate or deflate it. A percentage appears only once a bucket has at least 20 graded calls.
No hypothetical backtests. Nothing on this page is a simulation over history. Only real, forward, published calls are counted.
Gaps are shown, not filled. When the machine failed to publish a scheduled window, that window stays empty and is listed below. Writing those calls in afterwards — with the outcome already known — would break the first promise on this list for every other call too.
Windows that were never published (2)
39 scheduled calls across 2 days were never written, and are counted nowhere on this page — not as wins, not as losses, not as neutrals. They are listed so a missing day is not mistaken for a quiet one.
2026-08-25 — 13:45, 21:15 UTC,
26 calls not published.
The database that stores this record reached a monthly usage limit and stopped accepting new entries for about seven hours. Existing entries were unaffected and none were lost. The limit has been raised, and the cause — a query that read the entire record just to display one page of it — has been fixed.
2026-06-11 — 21:15 UTC,
13 calls not published.
Cause not recorded. This gap predates the monitoring that now watches for missed windows, so nothing observed it at the time. It is listed because the record shows it, not because we know why.
Monitor bias
◆41%The scheduled directional bias for the dollar index and 12 major pairs, published twice each weekday (13:45 & 21:15 UTC) and graded by how far price moved in the called direction over the signal's horizon.
67 hits · 98 misses · 820 neutral (expired). Rate counts hits over hits+misses (165 graded); the 820 neutral calls are disclosed, not hidden. 985 resolved in total since 2026-04-17T02:53:46Z.
What this record covers: the figures above are drawn from a substantial share of the calls published on this track. Of the rest, nearly all can never be graded — they were published with no entry price recorded — and the remainder is still awaiting grading.
Data quality: 1663 still open (not yet graded); 1623 excluded — published with no entry price recorded, so no rule can ever grade them (disclosed, never dropped).
Breakdown by conviction — does higher conviction actually win more?
A rate appears only once a bucket reaches 20 graded calls; below that it reads “accumulating”. Small samples mislead — we won’t show them.
Breakdown by pair
How this track is graded
Confirmed if price moved at least the published threshold in the called direction over the horizon; invalidated if it moved that far against; otherwise neutral (expired). Thresholds: 0.3% for G7 & carry pairs and the dollar index, 0.6% for EM-carry & safe-haven.
Every call — winners and losers — is in the public record: the RSS feed
Report watchlist calls
◆24%Structured BUY/SELL watchlist calls published in the daily reports stream, each with a trigger and an invalidation level, graded over a fixed five-trading-day window from publication.
59 hits · 182 misses · 25 neutral (expired). Rate counts hits over hits+misses (241 graded); the 25 neutral calls are disclosed, not hidden. 266 resolved in total since 2026-07-19.
Data quality: 4 still open (not yet graded); 10 excluded — published without a usable trigger/invalidation pair, so no outcome computed from them would mean anything (disclosed, never dropped).
Breakdown by conviction — does higher conviction actually win more?
A rate appears only once a bucket reaches 20 graded calls; below that it reads “accumulating”. Small samples mislead — we won’t show them.
Breakdown by pair
How this track is graded
A hit means price touched the trigger and then closed favourably before ever touching invalidation; invalidated means invalidation was reached first (same-bar ties count against the call); no-trigger means neither happened within five trading days. For the dollar index, whose series carries daily closes only, a touch means a close through the level. Fixed window: 5 trading days. Grading rules v3.
Every call — winners and losers — is in the public record: the daily reports
Every resolved watchlist call
Winners and losers, newest first. Each links to the report it was published in.
Verify this record yourself
You should not have to take our word for it. Both track records are committed to a public git repository, so GitHub timestamps every graded snapshot — a record we cannot silently edit after an outcome is known.
How to check we didn’t edit the record after the fact
1. The report-watchlist calls live in
data/forecast-ledger.json; the monitor-bias record is exported
to data/bias-ledger-snapshot.json. Both are committed to git —
browse their history to see exactly when each call and each graded outcome
was written.
2. Each changed bias snapshot is tagged in git with the SHA-256 of its
canonical rows (tags named bias-snapshot-…). To recompute it:
take the rows array from the snapshot file, serialise it with
sorted keys and no whitespace, and SHA-256 the bytes. It must equal the hash
below and the git tag on that commit.
Current monitor-bias snapshot: 2648 rows · sha256 92ad477d8573f61f5fc7cb05f03d666a98f31dddb613898c7473a3cef571af21
Past results do not predict future results. This is a record of published calls, not a performance guarantee. Educational and decision-support content only. Not financial, investment, or trading advice. Full disclaimer.