We started where most discretionary-to-systematic traders start: with a setup-quality score. Then five years of data told us the score was pointing the wrong way.
The uncomfortable finding
Our strategy placed limit orders at areas of interest (AOIs) — price levels touched repeatedly — and graded each setup A through D using the usual ingredients: trend alignment, ADX momentum, an RSI-zone check, a logistic "trigger probability," and proximity to the level.
Then we backtested five years (2021–2026), ten major and minor FX pairs, ~20,000 filled limit trades, and found something we didn't want to find: the grade was anti-predictive. The better a setup scored, the worse it did. Average realized R ran backwards — A-grades ≈ +0.03R, B ≈ +0.05R, C ≈ +0.25R. Filtering for "high quality" was systematically removing our best trades.
Why quality scores fail at limit entries
The cause was mechanical. Every ingredient that raised a setup's grade — strong trend, high ADX, high probability, price hugging the level — describes a market that is trending hard and extended. A limit order into that fills on a shallow pullback the trend then steamrolls. The best-looking setups were a tag, not a test.
What mattered was something the score never measured: how price arrived at the zone. A limit entry is a bet on a reaction, and reactions are more reliable when price has stretched away from value and is snapping back — not when it's grinding along.
VZD: a one-line definition
The absolute distance between price and the area of interest, divided by Average True Range. It answers one question: how far, in units of current volatility, has price displaced from the zone it's reacting to? The volatility normalization is the point — a VZD of 0.30 means the same thing on gold, on EUR/CHF, and across every session and regime.
Does it rank edge out of sample?
A relationship that only exists in-sample is worthless. Every result below holds out the last 30% of the timeline from any tuning. Sort trades into VZD quartiles and average realized R:
Out of sample, the rank correlation between VZD and realized R stays positive (Spearman +0.058) and the top-decile-minus-bottom-decile spread is +0.239R — knowing a trade's VZD separates outcomes by ~¼R on data the rule never saw. Modest coefficients, but monotonic, mechanism-grounded, and stable — and they compound over volume.
The part that earns the word "validated": it beat four challengers
One indicator that ranks edge OOS is interesting. One that does so while four plausible competitors fail is a moat. We ran an adversarial lab — three "approach character" indicators (computed only from bars before the signal, no lookahead) plus the legacy grade — and asked each to do what VZD does:
| Challenger | Idea | Out-of-sample verdict |
|---|---|---|
| Kaufman efficiency | straight-line vs choppy arrival | rejected (≈ 0, regime-dependent) |
| Pullback depth | Fibonacci "golden-zone retest" | rejected — wrong sign |
| Momentum slope | price decelerating into zone | too weak to gate |
| A/B/C setup grade | multi-factor quality score | anti-predictive |
| VZD | volatility-normalized displacement | survives — monotonic, OOS-stable |
The Fibonacci-style pullback idea is the one most traders expect to work — "buy the golden-zone retest." In five years of out-of-sample data it didn't; it was marginally inverted. Intuition is not edge.
What it's worth in practice
Used as an entry gate, VZD roughly triples per-trade expectancy. Ungated, the filled-limit edge is ≈ +0.077R/trade. Gate to VZD ≥ 0.30 and it rises to ≈ +0.18R avg (59.3% win, OOS +0.13R — verified across 5 years, 9 pairs, no lookahead). Tighten to VZD ≥ 0.45 and you trade volume for quality: fewer signals, ≈ +0.27R avg, OOS +0.21R, with materially lower drawdown — 44.9R max vs 59.4R.
The same indicator is a dial — looser for more trades and a thinner edge, tighter for rare, high-conviction, low-drawdown ones. With evaluation accounts now removing time limits, the tight setting fits unusually well: when there's no clock, the optimal play is fewer, higher-conviction, lower-drawdown trades.
Live proof: 72.22% win on a real FTMO Free Trial
The five-year backtest is one thing. Here's what happened when we ran this on a live FTMO Free Trial — 18 trades, +$4,283 (+4.2%), worst day −0.6%, profit factor 5.25. Every trade is documented with timestamps, pair, and outcome.
Read the FTMO case study →See it on your own account — free for 14 days
Don't take our word for any of it. Run zEAge on a free 14-day FTMO Free Trial demo — the trial license lasts exactly as long as the demo. Watch real fills on real prices, judge it yourself, then decide. No card, no risk, nothing to take on faith.
Start the free 14-day trial →Don't trust us — run it yourself
One command, zero dependencies
We published an anonymized sample of the real trades (VZD + realized R only) and a pure-Python script. No pandas, no setup — regenerate the ladder and the out-of-sample stats on your own machine, or point it at your own trade log.
$ python vzd_reproduce.py
⬇ vzd_reproduce.py ⬇ vzd_sample.csv (19,908 trades)The takeaway
The most useful thing we learned wasn't the indicator — it was the reframe. For reaction-based entries, stop scoring the level and start measuring the arrival. A one-line, volatility-normalized distance carried more out-of-sample information than a five-factor quality score, a momentum-efficiency ratio, and a Fibonacci rule combined. Simple, mechanistic, and survivable beat complex and intuitive — which is, more often than the literature admits, how real edges look.
- Ten FX majors/minors, 2021–2026, ~20k filled limit trades. No equities, crypto, or thin instruments tested.
- Modeled fills and spread; real slippage will differ.
- Drawdown figures elsewhere in our work are flat-1R, single-stream — a volatility flag, not a literal account path.
- Per-trade edge is modest; returns come from consistency and volume, not home runs.
- Nothing here is financial advice or a performance guarantee. Past results, including out-of-sample, do not guarantee future returns. A live, third-party-verified track record is in progress and will be linked when it exists.