PREVIEW — every figure on this site is a layout placeholder from the design mock, not a measurement. Nothing here has been measured yet.
data to 25.09.2026
SponsoredVisit FxPro

Spread by hour of day

A broker quotes its best daytime number. This is all twenty-four hours, sampled every second for a month — including the rollover window, where the spread on every account in this table multiplies.

EUR/USD · 27.08–25.09 · hourly mean of 1 s samples

00061218
3.02 pips thin liquidity 21:00–24:00 UTC
FxPro · 0.55 avg Tickmill · 0.28 avg

Every hour, as measured

Hour, UTC FxPro Tickmill Diff.
00:000.520.30+0.22
01:000.460.26+0.20
02:000.420.22+0.20
03:000.400.20+0.20
04:000.400.20+0.20
05:000.380.18+0.20
06:000.360.16+0.20
07:000.300.10+0.20
08:000.260.07+0.19
09:000.250.06+0.19
10:000.250.06+0.19
11:000.260.07+0.19
12:000.240.06+0.18
13:000.220.05+0.17
14:000.220.05+0.17
15:000.240.06+0.18
16:000.280.08+0.20
17:000.340.12+0.22
18:000.400.16+0.24
19:000.460.20+0.26
20:000.580.30+0.28
21:001.951.20+0.75
22:002.701.65+1.05
23:001.400.80+0.60

Difference is FxPro minus Tickmill: positive means we are wider that hour.

Go to FxPro

We earn a commission if you open an account through this link. It does not change the numbers above — the method is published and our losses are printed.

What an hourly series costs to produce, and why it exists

A single average spread is the figure every broker publishes and the least useful number in the business. It is an average over hours that behave nothing alike: the London–New York overlap, when half the world's volume is in the market, and the rollover minutes, when almost none of it is. Averaging those together produces a number that is true and tells you nothing about the hour you actually trade in.

Producing the table above means holding a connection open to every broker's platform continuously, storing each quote raw with the server's own timestamp, converting to pips at the symbol's own scale, and aggregating by the hour the sample falls in — after the server clock has been reconciled with UTC. There is no polling interval to miss a tick between and no chart being read: the figures come out of the same store that feeds every other number on this site.

AccountDay mean, 07–16 UTCRollover mean, 21–24 UTCRatio
TickmillRaw · MT50.061.2218.9×
FxProRaw+ · MT50.252.028.1×

Hourly means of 1 s samples · 27.08–25.09 · our own accounts · the ratio, not the average, is what decides whether an overnight strategy survives

The three ways an hourly table goes wrong

The clock. Server time is not UTC, and the offset moves with the broker's own daylight-saving switch rather than ours. Measured per start, bounded, and guarded by tick freshness — the guard that caught a frozen Friday quote arriving stamped as Saturday, because the age of a stale quote lands on a round hour roughly once an hour and sailed through a whole-hour sanity check.

The units. A pip is 0.0001 on most pairs and 0.01 on yen crosses, and one feed sends every quote as an integer scaled by a fixed power of ten regardless of how many digits the symbol quotes. Both of those produced plausible, entirely wrong tables in our first fortnight — one off by a factor of a thousand, one making a yen pair a hundred pips wide. The conversion is now checked against known answers before it runs, and a symbol whose declared pip position disagrees with ours is skipped rather than published.

The feed. A series can be a simulator. The audit for that tests continuity over the whole population of observations, not a sample, and a series that fails it is not published — the broker is not ranked rather than ranked on fiction.

All three are written out at length in the methodology, including what each one cost us. They are here because the hours are where a comparison site is easiest to fool, and where a reader has no way to check without being told how the sausage was made.

Every account, day against rollover

The chart above takes two accounts hour by hour. This table takes all 10 on the two figures that matter most: the mean spread over the whole window, and the mean during the rollover window when liquidity is thinnest. The ratio between them is the honest measure of how much an account degrades when the market gets thin.

AccountMean spread, pips21:00–24:00 UTC, pipsRatio
TickmillRaw · MT50.281.224.4×
IC MarketsRaw Spread · MT50.291.404.8×
EightcapRaw · MT50.311.555.0×
ThinkMarketsThinkZero · MT50.331.805.5×
AxiPro · MT50.451.954.3×
FXTMAdvantage · MT50.552.304.2×
FxProRaw+ · MT50.552.023.6×
OctaFXStandard · MT51.302.902.2×
AvaTradeStandard · MT51.352.601.9×
FBSStandard · MT51.553.202.1×

1 s bid/ask samples on our own accounts · 27.08–25.09 · sorted by mean spread, so the tightest quote is at the top

Two things stand out and neither is visible in a spread comparison. ThinkMarkets degrades the most — 5.5 times its own average in the rollover window — while AvaTrade holds up best at 1.9 times. And the accounts with the tightest daytime spreads are not the ones that hold up best: a raw account quoting 0.3 pips in the London session can quote several pips at 22:00, which is a much larger proportional change than a wider commission-free account suffers.

If you trade only in the London or New York sessions, the first column is the one that concerns you. If any part of your strategy touches the hours either side of midnight UTC — holding through the roll, trading the Asian open, running anything automated that does not know what time it is — the second column is the one that will take your money, and it is the column brokers do not publish.

How a pip is computed, and the three ways it goes wrong

A spread in pips looks like the simplest number on this site. It is the one that has gone wrong most often, and each time it went wrong the result was entirely plausible — which is exactly what makes a unit error dangerous. A table nobody can sanity-check from the outside has to be sanity-checked from the inside.

The symbol's scale. A pip is 0.0001 on most currency pairs and 0.01 on yen crosses. Deriving that from the symbol's digit count is the obvious approach and our first version did it with an off-by-one exponent, scaling every published spread by a factor of a thousand. The conversion is now validated against known answers on five-digit and three-digit symbols before it is allowed to run, and the broker's own declared pip position is compared with ours — a disagreement skips the symbol rather than publishing it.

The wire's scale. One feed sends every quote as an integer scaled by a fixed power of ten regardless of how many digits the symbol quotes to. Storing the symbol's digit count alongside those integers made a yen pair read a hundred pips wide — a number so large it was obviously wrong, which was lucky. What catches it now is not a rule but a corridor on the result plus a stored live quote in the test suite as a regression.

Two numbers, two units, one record. The execution price returned by an order is a plain decimal; the quotes streaming alongside it are scaled integers. An order probe therefore compares its own fill against the quote stream and records the result as suspect when the two disagree by more than a couple of per cent, rather than printing a slippage figure derived from two different units.

Metals, indices and crypto have no settled pip convention at all, so the conversion refuses them outright instead of quietly applying the currency rule. Their ticks are still collected; only the published conversion is withheld until a convention is fixed deliberately. That is why this site measures EUR/USD and says so, rather than presenting an average across instruments whose units do not agree.

Is the feed even real?

This is the question that changed the shape of the project, and the one almost no comparison site asks. A feed is not obliged to be the market. It can be a simulator emitting a fixed spread, or stepping between two or three values, and from a chart it is indistinguishable from a live quote. We found exactly that on one of our own accounts: across hundreds of thousands of observations, one symbol produced a single spread value and another produced two, with nothing in between. A morning's comparison built on that feed was wrong, and it was already written down before anybody checked.

So every series is audited before any figure from it is published, over the whole population of observations rather than a sample. The obvious test — how many distinct values appear — is the wrong one, and our first attempt used it: a genuine raw feed sits at zero most of the time and would have been condemned by it. The test that works is continuity. A real spread passes through neighbouring values on its way between levels, because the order book thins and thickens; a fixture jumps between levels with nothing in between.

A series that fails is not published at all, and the broker it belongs to is not ranked — including when that broker is the one paying for this site, which has already happened once. We would rather show a table with fewer brokers in it than a table where one column is a simulator, and the audit is the only reason we can tell the difference.

The same discipline applies to readings that turn out to be wrong after publication. They are flagged rather than deleted, every query behind a published figure excludes flagged rows, and the rows stay in the export marked as flagged. Two reasons: a tick cannot be collected again, so discarding one destroys evidence permanently; and a record of what the rig got wrong is worth keeping, because the next fault usually rhymes with the last one.

Why every hour on this site is UTC

Hours here are UTC, never local time and never broker-server time, and the reason is not tidiness. A broker's MetaTrader server typically runs on its own offset — commonly two or three hours from UTC, and it follows its own daylight-saving calendar rather than yours. An hourly table built on server stamps is shifted by that offset while every individual number in it stays entirely believable.

UTC also keeps the sessions where a reader can find them. The London session opens around 07:00 UTC, the New York overlap runs roughly 12:00–16:00, and the rollover window sits at 21:00–24:00 — the same clock positions all year, which is not true of any local time that observes summer time. A strategy that runs on a schedule needs those boundaries to be stable, and so does a table that claims to show what happens at them.

If you trade in a local time zone, the conversion is yours to make and is the only arithmetic this site leaves to the reader — deliberately, because doing it for you would require guessing where you are and which of two daylight-saving calendars you follow, and a wrong guess there puts the rollover window in the middle of your afternoon.

Questions about the hours

Why does the spread widen so much at 21:00 UTC?

That is the daily rollover: the New York session is closing, the Asian session has not opened, and the banks that quote the interbank market step back for a few minutes while positions are rolled to the next value date. Liquidity thins, so the gap between the best bid and the best ask widens on every account we hold. Nothing is wrong with the broker — but a strategy that opens positions in that window is paying several times the advertised spread, and no marketing page mentions it.

Is a zero spread a bug in your collector?

No, and assuming it was cost us a day. On a raw or commission-based account the broker earns from the per-lot commission, so the quoted spread sits at or near zero a great deal of the time. Our first sanity corridor had a lower bound and would have discarded those readings as a units error — throwing away the truth and keeping nothing. The lower bound is gone; the upper bound and the refusal of negative spreads remain, because a negative spread is impossible rather than merely odd.

How can an hourly table be wrong while every number in it looks fine?

By being three hours out of place. A terminal stamps each tick with the broker server's own clock, not UTC, and one broker in this set runs three hours ahead. Mix that into a table by hour of day and the illiquid rollover window lands in the middle of the London session while every individual figure stays perfectly believable. The offset is therefore measured from fresh ticks at every start, bounded to a plausible range, and backed by a freshness guard — a tick must be seconds old after the offset is subtracted or it is not stored.

Why are only some brokers in the hourly table?

An hourly breakdown needs a continuous series from our own account across the whole window, and a series that passed the feed audit. 2 of 10 accounts have that today; the rest carry the aggregate only, with the reason on the axis. A partial series rendered as a full hourly table would look identical to a complete one, which is why we do not render it.