Trading the Invisible Structures of Liquidity

Retail forex has no visible order book, so every liquidity level you trade around is an inference from price behavior, not something you can actually see.


Equity traders get a visible order book. You can watch depth stack up at specific price levels, see resting size on both sides, and form a reasonably direct picture of where liquidity actually sits before price gets there. Retail forex traders get none of that. The spot forex market is decentralized and over-the-counter, which means there is no single, public order book to look at. What you’re actually trading against is an aggregated composite feed built by your broker from whichever liquidity providers they’ve connected to, and the real depth behind any given price level is fundamentally invisible to you.

This isn’t a minor technical footnote. It changes what “liquidity” even means as a concept you can act on, and it means every liquidity-based idea a retail trader uses — support, resistance, stop clusters, absorption — has to be inferred indirectly from how price behaves, because there’s no direct way to observe it.

Why forex liquidity is structurally different from a visible order book

In a centralized limit order book market, resting liquidity is a fact you can query. In OTC forex, what you’re actually looking at through your platform is a synthetic best bid and offer, assembled by your broker from a set of liquidity providers that isn’t disclosed to you and that can change based on time of day, instrument, and your broker’s own commercial relationships. Two brokers can show meaningfully different depth and pricing behavior around the same price level at the same moment, not because the underlying currency is behaving differently, but because they’re drawing from different pools of liquidity providers with different depth at that instant.

This means a “liquidity level” identified on a retail chart isn’t a level where you can confirm real resting size exists. It’s a level where price has, historically, reacted in a way consistent with resting size existing there. That distinction matters because it shifts the entire exercise from observation to inference, and inference is only as good as the model generating it.

Inferring liquidity from price behavior instead of seeing it directly

The closest thing retail traders have to reading depth is watching how price behaves when it reaches a level. A fast, clean push through a price with minimal hesitation suggests thin resting liquidity at that level — there wasn’t much size there to absorb the move. A level where price repeatedly approaches, stalls, and gets rejected suggests the opposite: enough resting orders on one side to repeatedly absorb incoming flow without breaking. This is the mechanism behind what traders call absorption, and it’s a genuinely useful inference, but it’s built entirely from the secondary evidence of price reaction, not from any direct measurement of order size.

Spread behavior offers a second indirect signal. Liquidity providers widen the spread they’re willing to offer when their own confidence in fair value decreases, which tends to happen around news releases, session transitions, or unusually thin trading conditions. A widening spread at a specific level, distinct from the market-wide spread environment at that time, can suggest liquidity providers are themselves uncertain or thin around that price, which is a different and complementary signal to the price-rejection evidence.

Neither of these is direct observation. Both are proxies, and proxies carry error. A price rejection at a level might reflect genuine resting liquidity, or it might just be the tail end of a broader momentum move running out of energy for reasons entirely unrelated to that specific price. Without a visible book, you can’t distinguish these cases with certainty. You can only build a probabilistic model from repeated historical instances and validate whether the inferred levels actually predict future reactions better than chance.

Why this makes overfitting to liquidity levels especially easy

Because liquidity in retail forex is inherently inferred rather than observed, it’s unusually easy to construct a pattern-detection rule that looks like it’s finding real liquidity structure but is actually fitting to the specific historical sequence of price reactions in your backtest window. A rule built around “price rejected this level three times in the training data” is describing something that happened, but it isn’t automatically describing a durable liquidity feature that will keep producing rejections going forward. This is exactly the mechanism behind why the train/test split is the only validation that actually matters here — a liquidity-level rule that performs beautifully in-sample and falls apart out-of-sample is usually a sign the rule captured a specific historical coincidence rather than a genuine, persistent feature of where size rests in that instrument.

The tell is usually in the win rate. A liquidity-reaction strategy reporting a win rate north of 70% in backtesting is far more likely to have curve-fit to a handful of favorable historical reactions than to have found a durably real liquidity structure. A genuinely validated liquidity-based edge, like most pattern-based edges on this site, tends to land in the 52-62% range once it’s tested out of sample and stress-tested against transaction costs, not dramatically above it.

Cost drag hits liquidity-based strategies especially hard

Spread, slippage, and commission matter more for liquidity-reaction strategies than for most other pattern types, because the entire premise of trading near an inferred liquidity level is trading close to a price where resting orders and incoming flow are actively contesting each other. That’s exactly the kind of price action where realized spread tends to be wider and slippage on entries tends to be worse than the average conditions a simpler backtest might assume, since you’re deliberately trying to enter right at the moment of maximum contested activity. A backtest that applies a flat, average spread assumption across all entries will systematically understate the real cost of a liquidity-reaction strategy, because the strategy’s entries are non-randomly clustered exactly where spread tends to widen.

Session timing changes what’s actually invisible

The depth of the invisible liquidity behind any given level isn’t constant across the day, and this connects directly to session structure. During the Asian session, 00:00-08:00 UTC, fewer liquidity providers are actively quoting competitively, which means the composite feed you see is drawing from a thinner and less diverse pool. A liquidity level identified during Asian hours is an inference built on genuinely less underlying depth than the same kind of level identified during the London/New York overlap, 13:00-16:00 UTC, where far more providers are actively contesting price. This is a real reason to scope a liquidity-based strategy’s start_hour and end_hour fields tightly, because the reliability of the underlying inference — not just the volatility environment — changes meaningfully by session.

Session Liquidity provider depth Reliability of inferred levels
Asian (00:00-08:00 UTC) Thin Lower, fewer providers behind each reaction
London (08:00-16:00 UTC) Deep Higher
London/NY overlap (13:00-16:00 UTC) Deepest Highest, most providers actively contesting price

Treating invisible structure with appropriate humility

None of this means liquidity-based trading ideas are unusable, only that they need to be held to a higher evidentiary standard than ideas built on directly observable data, precisely because there’s no way to fall back on direct confirmation when the inference is wrong. A support level in a centralized order book market can, in principle, be checked against visible depth. A liquidity level in retail forex can only be checked against how price has behaved near it before, which means the entire structure is one layer more removed from ground truth than most traders treat it as being. Building and validating strategies around this kind of level requires taking that extra layer of inference seriously rather than pretending the chart is showing you something it structurally cannot show you.