Is my broker's feed honest? How to test it
Asked as: is my broker's feed honest
Honest is a comparison, and retail traders have nothing to compare against. Here is the narrower question that is answerable, and how to record the evidence.
The short answer
As asked, the question has no answer — not from me, and not from anyone who offers you one without your data. Honest is a comparison, and a retail trader has nothing to compare against: no venue-side record, no consolidated reference tape, no counterfactual feed showing what you would have received elsewhere at the same microsecond.
What is answerable is narrower and considerably more useful: does your feed behave consistently with itself, and does its behaviour change when nothing in the market did? That question has five measurable dimensions, and every one of them is computable from a single artifact you can record yourself — a timestamped log of the quotes your own terminal received.
The prerequisite is a baseline. I call establishing one zeroing the feed. Until it exists, every complaint about a fill is an anecdote, and every reassurance is marketing.
WHAT THIS IS — AND WHAT IS NOT PUBLISHED. This article is method, not result. No broker feed has been measured and published by me. There is no dataset behind this page, no hash, no per-broker finding, and none should be inferred from the fact that I describe how one would be produced. The Observatory battery pre-registers its definitions and thresholds before broker #1 is measured, per my methodology; measured portraits publish with their artifacts or not at all. Status: NOT YET PUBLISHED.
The Observable Mechanism
A price feed is a publication process, not a window. Something upstream decides when to emit a quote and what the two sides of it are, and what reaches your terminal is the output of that decision. Everything you can honestly measure about a feed therefore derives from two observable series and nothing else: the arrival times of quotes, and the bid/ask pair carried by each one. Every dimension below is a statistic over those two series.
Why “honest” is the wrong axis
The word smuggles in a reference. To call a feed dishonest is to assert that a truer price existed and was not the one you received. That assertion needs the truer price, and you do not have it. Neither does the retail tool claiming to detect manipulation from your terminal — it has the same one feed you do.
This is not a reason to stop asking. It is a reason to change the question from a level to a structure, and from an accusation to a record. A level question (“is this spread too wide?”) requires a benchmark you lack. A structure question (“does this spread’s behaviour partition into regimes, and where do the boundaries fall?”) requires only your own data and a stated method. Structure questions have answers. Level questions have opinions.
The second move is from anecdote to base rate. The reason a fill feels wrong is that you were watching. You were not watching on the occasions — however many there were — when the same thing happened while you were flat, and nobody counted those. A base rate is what turns “this happened to me” into “this happens at this frequency, and my fill sat here inside that distribution.”
The five dimensions of a feed
Each of these is a property of the two series above. Each has an honest scope and an honest limit.
1. Publication cadence
The distribution of intervals between consecutive quotes. Not the average — the shape, and specifically its floor. A feed that never publishes two quotes closer together than some interval has been sampled somewhere between the market and your screen, and that floor is where the sampling becomes visible.
- Measures: how often you are told anything, and whether the telling is rate-limited.
- Does not establish: that sampling is improper. Aggregation and throttling are ordinary engineering. The floor is a fact about the pipe, not a verdict on it.
2. Two-sided coordination
Whether bid and ask move jointly or independently. Genuinely independent sides produce a spread that breathes; rigidly coordinated sides produce a spread that steps. These are different objects with different execution consequences, and the coordination structure separates them without needing to know which is “correct”.
- Measures: whether the two sides are being published as one decision or two.
- Does not establish: intent, or that a coordinated feed is worse for you.
3. Per-side staleness
The age of each side of the quote at every tick, kept as a distribution rather than collapsed to a mean. Quote staleness that concentrates in particular sessions, or around scheduled events, is structure. Staleness spread evenly across the clock is closer to noise.
- Measures: how old the price you are acting on was, and when age concentrates.
- Does not establish: that a stale side caused a specific fill. Attribution to one order needs the order record, which is the Execution Cost Auditor’s job, not the feed battery’s.
4. Spread regimes
Change-point detection over the spread series, so widening is reported as a regime with a start, an end, and a context — rather than as an anecdote you half-remember from a bad afternoon. A spread regime is the unit that makes “it widened” checkable: a regime has boundaries you can put on a chart and a duration you can count.
- Measures: when the cost of crossing changed, and for how long.
- Does not establish: why. Spread widening driven by genuine liquidity withdrawal and widening applied as policy look identical from one side of the wire.
5. Freeze and rollover behaviour
What the feed does when it stops publishing: how long the gaps run, how often they occur, and where in the session they fall. Contract boundaries and rollover windows are the obvious cases; the interesting cases are the ones that are neither.
- Measures: the intervals during which you were shown nothing.
- Does not establish: that a gap was avoidable, or that the market moved during it.
Zeroing the feed: the method
An instrument that has not been zeroed cannot report a level — only a change. The same is true here, and it is why this is the first step rather than an optional refinement.
Record before you suspect. The log you start after a bad fill is contaminated by the reason you started it. Begin capture on an ordinary week, while you have no grievance, and keep it running.
Log the arrival time, not the quote time. Two timestamps exist: when the quote claims it was made, and when your machine received it. The second is the one you can vouch for. Record both if you can; treat the first as a claim by the publisher, and the second as your evidence.
Cover every session you actually trade, more than once. A sample that contains one London open describes one Tuesday. A sample that contains many describes your feed. The requirement is not a magic number of days; it is that each condition you care about appears often enough for a distribution to exist rather than a data point.
Include the boring conditions. A capture that only ran during volatile hours has measured volatility, not your feed. The quiet hours are the control, and they are the half that anecdote never collects.
Fix your statistics before you look. Decide in advance what you will report — for example, the interval distribution at the 50th, 90th and 99th percentiles, per session — and then report those, including the ones that turn out to be unremarkable. Choosing the statistic after seeing the data is pre-registration run backwards, and it will find you a story every time.
Publish your own null. If your capture shows nothing unusual, that is the result. A method that can only produce indictments is not a method.
The Feed Zero
The artifact those steps produce is what I call the Feed Zero: a recorded, dated baseline of what your feed does under ordinary conditions, computed with statistics you fixed in advance.
It is deliberately unglamorous. It contains no accusation and no verdict. What it contains is the thing every accusation and every verdict silently requires — a reference. Once a Feed Zero exists, three questions that were previously unanswerable become ordinary:
- Did this widening episode fall outside my own baseline, and by how much?
- Has my feed’s cadence floor changed since the platform update?
- Does the staleness I saw during the news print differ from the staleness I see every day at that hour?
None of those are questions about honesty. All of them are questions a trader can act on, and all of them are answerable with data you already have the ability to record. That substitution — a checkable structural question in place of an unanswerable moral one — is the whole of the technique.
What This Does Not Establish (The Limits)
A Feed Zero establishes what YOUR feed did during YOUR capture window, and nothing beyond that.
It does not establish what any other client of the same broker received, because feeds are frequently client-specific. It does not establish intent: every dimension above is compatible with ordinary infrastructure and with deliberate policy, and the wire cannot tell you which. It does not establish that a specific fill was mispriced, because that requires your order record placed against the quote conditions at that instant — a different measurement. It cannot detect what was never published to you; a quote that did not arrive leaves no trace except a gap, and gaps have many causes. And a baseline is not a benchmark: it tells you when your own feed changed, never whether the level it settled at is good. Anyone converting these measurements into a claim about profitability has left the evidence behind.
The comparison you were told you could not have
This page opens by saying honest is a comparison and you have nothing to compare against. On one of the five dimensions, that is no longer true, and the reference publishes with this article.
A locked book is a quote where the ask equals the bid — a zero quoted spread. On a retail platform it looks like a moment of infinite liquidity. It is worth knowing how often it happens on a real exchange book, because that is the number your feed is implicitly claiming to resemble.
I classified every top-of-book row across seventeen exchange-traded roots over one trading day:
- 21,158,845 rows. Zero locked books. Not a low rate — none.
- Four crossed rows in the entire corpus, one each on four commodity roots, all on a session’s first timestamp, each counted and excluded rather than repaired.
- Narrowing to the seven currency futures, the closest exchange-traded relatives of a spot FX pair: 5,063,505 rows, zero locked.
- One root is refused outright rather than scored: its tape carried a header and no quote rows, so it publishes as a named refusal instead of a zero that would read like a measurement.
Against that, the retail comparison. On a decoded spot AUDUSD tick journal from a retail platform, 16,682 of 49,179 ticks — 33.9% — are locked, and none are crossed.
So the answer to how often does a real book show a zero spread is: it does not. And the answer to how often did this retail feed is: about a third of the time.
What that supports and what it does not, stated exactly. It establishes that a zero quoted spread is a property of the retail feed’s construction rather than a property of the market it reports on, because the market it reports on did not produce one in twenty-one million observations. It does not establish intent, it does not establish that any fill was mispriced, and a currency future is a different instrument from a spot pair with its own microstructure. But the direction of the asymmetry is not a close call, and if your platform prints a zero spread you now know what the exchange was doing at the time: not that.
The practical use is narrow and real. A zero spread in your data is a data event, not a market event — so it should be counted and excluded from any cost estimate, not averaged in, because averaging it in makes your measured trading costs look better than they were.
Where the measured version publishes
Nothing above requires Hadal. A trader with a logging script and a month of patience can build a Feed Zero and be better informed than the argument they were about to have.
What I am building is the version that runs the full battery for you against the feed you personally receive, and publishes each dimension with the sample behind it — including the honest null where the sample cannot carry a dimension. That instrument is the Broker Feed Auditor. One dimension of its reference side now publishes, above, with its artifact; the rest publish the same way, with the pre-registered definitions that let a stranger re-derive them.
If you want the battery rather than the script: read what the Broker Feed Auditor measures and, more importantly, the block stating what it does not establish. It is pre-launch and nothing is for sale.
The artifact
SHA256: 9d5523f7ae3388a5617769773c92586e882f44c0f57aa44048514045c5fc240e
Download datasetClaims examined
Claim 01§ claim-03a5eadb
My spread widened right before my stop was hit, so my broker hunted it.
A single widening episode around a single fill is compatible with a targeted intervention and with ordinary liquidity withdrawal, and one observation cannot separate them. What separates them is the base rate: how often your feed widens to that degree when you hold no position at all. Almost nobody records that, which is why the accusation is unfalsifiable in both directions.
Claim 02§ claim-d261507e
You can check your broker by comparing its chart to another broker's chart.
Two charts disagreeing establishes that two feeds differ, which was never in doubt: different liquidity pools, different aggregation, different sampling. It does not identify which feed is closer to anything, because neither is a reference. A cross-broker comparison is only informative once both sides are recorded the same way, at the same resolution, over the same clock.
Each claim above has a permanent address — the § link — whose canonical home is the refutation index, where it carries its variant phrasings and the true proposition stated on its own feet; this article is the evidence behind it. If a claim's text ever changes, it becomes a new claim at a new address, and the old one stops resolving rather than silently meaning something else.
Explore further
Instruments
Research
- Why do my forex orders get rejected?Asked as:
why do my forex orders get rejected
- What is slippage really costing me?Asked as:
what is slippage really costing me
- Why do two data feeds give different backtests?Asked as:
why does my backtest give different results with different data feeds