BEQI: an open, standardized Broker Execution Quality Index across five dimensions — plus a public benchmark anyone can contribute to.
Ask a retail forex trader how good their broker's execution is and you'll get a feeling, not a number. "Feels fast." "Spreads look tight." "I get slipped on news." The problem is structural: retail brokers don't publish execution-quality data, and the one dataset that would let you compare them — how they actually fill orders — doesn't exist in the open.
So I built a tool to measure it, and made both the method and the benchmark open source. It's called BEQI — the Broker Execution Quality Index — and this post is about why execution quality is measurable at all, the five dimensions it breaks down into, and how you can audit your own broker in about half an hour.
Why spread is a terrible proxy for execution quality
Spread is the number brokers compete on because it's the number you can see. But the cost that actually shows up in your P&L is mostly invisible: how long the broker takes to fill you, whether slippage is symmetric or quietly biased against you, whether the spread you're quoted at the moment of a signal is the spread you actually trade, and how often you get requoted or held. None of that is on the marketing page.
Two brokers with an identical advertised spread can have completely different real execution. The only way to tell them apart is to measure the fills — which requires (a) a standard set of metrics and (b) data you already have: your own trading statements.
The five dimensions of execution quality
BEQI decomposes "execution quality" into five measurable dimensions:
| Dimension | Unit | What it captures |
|---|---|---|
| Matching latency (median) | ms | Time from order send to fill, from statement timestamps |
| Slippage asymmetry | ratio (1.0 = symmetric) | Whether slippage is even, or quietly biased against you |
| Spread widening factor | multiplier | Baseline spread vs. the spread at the moment of your signal |
| Last-look hold time | ms | The delay before an order is accepted or rejected |
| Requote rate | per 100 orders | How often orders are requoted |
Each of these is a place where execution cost hides. Slippage asymmetry is the sneaky one: a broker can show "normal" average slippage while systematically giving you negative slippage on your best fills and neutral on the rest. Spread widening is the other — the charted spread looks fine, but the spread you're actually quoted when you try to trade a move is wider.
Rolling it into one score (carefully)
Each dimension is scored 0–100, then combined into a composite BEQI using a weighted geometric mean:
- Matching latency — 30%
- Slippage asymmetry — 25%
- Spread widening — 20%
- Last-look hold time — 15%
- Requote rate — 10%
The geometric mean is deliberate. With a plain weighted average, a broker could paper over one terrible dimension with strong performance elsewhere. A geometric mean punishes a single very-low sub-score much harder — which is the right behaviour, because one broken dimension (say, brutal slippage asymmetry) can wreck a strategy no matter how good the other four look.
How you audit your own broker
The tool is a CLI. It reads the data you already have and outputs a JSON report:
git clone https://github.com/bjftradinggroup-inc/forex-broker-audit-toolkit
cd forex-broker-audit-toolkit
pip install -r requirements.txt
# HTML statement (most common)
python beqi.py --input statement.htm --output report.json
# CSV log + tick data (enables the spread-widening dimension)
python beqi.py --input trades.csv --tick-data eurusd_ticks.csv --output report.json
# FIX 4.4 log (richest — measures all five dimensions)
python beqi.py --input fix_session.log --output report.json
Input formats:
- HTML statements exported from your trading platform — the easiest, works out of the box.
-
CSV logs with
order_id, send_time, fill_time, requested_price, filled_price, side, volume. - FIX 4.4 logs — the richest source; measures all five dimensions including last-look.
- Tick data (optional) to compute spread widening.
The report gives you the audit period, pairs tested, sample size and confidence, all five dimension scores with their sub-metrics, the composite BEQI, and a tier classification. About 30 minutes end to end.
The part that makes it useful: a public benchmark
A score for your own broker is interesting. A score you can compare is the point. The toolkit ships with a public benchmark — you can submit your report (broker name optional, anonymity is the default) via a form or a PR to the data folder, and over time that builds the open dataset retail forex has never had: standardized execution-quality numbers across brokers, methodology fully in the open.
That's the real ambition here — not another broker "review" site driven by affiliate deals, but a community-run, reproducible benchmark where the methodology is code you can read and criticize.
Methodology critique welcomed
I want to be honest about the limits. Statement timestamps aren't tick-to-trade truth (see the clock-discipline problem — you really want FIX logs for latency). A measured number from one account over one period is a sample, not a verdict. And any composite score compresses information — the sub-metrics matter more than the headline. All of that is why the methodology is open: the fastest way to make a benchmark like this trustworthy is to let people poke holes in it.
Get the code
MIT licensed, Python 3.10+, on GitHub:
→ github.com/bjftradinggroup-inc/forex-broker-audit-toolkit
If you trade retail forex, run it on a statement you already have and see where your broker lands. If you find a flaw in the methodology, open an issue — that's the point.
Educational content, not financial advice. Execution-quality measurements are samples from specific accounts and periods and are not guarantees of future execution or profitability.

Top comments (0)