Last Look Without the Guesswork: How to Audit FX Hold Times, Reject Codes, and LP Behavior
Last look is one of those FX execution topics that’s easy to hand-wave (“LPs do it, everyone does it”)—until clients start complaining about re-quotes, missed fills, or “price changed” rejects during fast markets. For brokers and prop firms, the real issue isn’t whether last look exists; it’s whether you can measure it, attribute it to specific venues/LPs, and manage the commercial and routing impact.
Below is a technical + commercial explainer focused on what actually shows up in logs: hold times, reject codes, and the monitoring stack brokers should have in place.
What “last look” really means in live FX execution
In an STP/A-book flow, you typically send an order (or a quote request) to an LP, and the LP responds with a fill, partial fill, or reject. With last look, the LP effectively has a short decision window to validate the trade against its internal checks—price validity, risk limits, market movement, toxicity, and more.
Operationally, last look often presents as:
- A measurable delay between your outbound order and the LP’s execution report (the “hold time”).
- A higher reject rate in volatile conditions, or for certain client segments.
- Asymmetric behavior: fills when the market moves in the LP’s favor, rejects when it moves against.
Last look is not automatically “bad.” But unmanaged last look is how brokers end up with execution quality that looks fine on average and terrible at the exact moments clients care about.
Hold times: how to measure them (and what “good” looks like)
Hold time is the time between when your bridge/router submits an order to an LP and when you receive the final outcome (fill/reject). You want to measure it per LP, per symbol group, and per session.
A practical measurement approach:
- Timestamp at order send (your side) and at execution report received.
- Break down latency into:
- Internal (platform → bridge → FIX engine)
- Network (to/from LP)
- LP decision time (the “last look” component)
Monitoring tips that catch real issues:
- Track P50 / P90 / P99 hold time, not just averages.
- Segment by market regime (news minutes, session overlaps, rollovers).
- Compare market orders vs limits/stops, and small vs large notional.
What to look for:
- A stable LP usually shows tight distributions (P99 not wildly higher than P50).
- If P99 spikes during specific hours, you may be seeing throttling, risk checks, or venue congestion.
- If hold time increases before reject rates increase, you often have early warning of an LP degrading.
Reject codes: normalize them before you try to “fix” them
Rejects are only actionable if you can categorize them consistently. In practice, brokers see a mix of FIX-level rejects, venue-specific messages, and bridge/platform translations that collapse everything into vague labels.
A broker-friendly reject taxonomy typically includes:
- Price changed / off-market (LP says price is no longer valid)
- No liquidity / insufficient liquidity (size can’t be filled)
- Timeout / no response (connectivity or LP processing delay)
- Invalid order / parameters (min/max size, symbol, trading hours)
- Risk / credit / limits (LP or PoP credit/risk constraints)
Implementation advice:
- Store the raw FIX tags (e.g., ExecType/OrdStatus/Text) alongside your normalized category.
- Keep the original LP/venue message—the free-text field often contains the real clue.
- Version your mapping: when an LP changes wording, your analytics shouldn’t break.
Without normalization, ops teams chase ghosts (“rejects are up”) instead of pinpointing the root cause (“timeouts from LP2 on XAUUSD during London open”).
The execution-quality KPIs brokers should monitor (daily, not monthly)
If you only look at execution quality in end-of-month reports, you’ll miss the patterns that drive churn. A practical monitoring set is small but specific.
Core KPIs (per LP, symbol group, and client segment):
- Fill ratio = fills / total attempts
- Reject rate (overall + by reject category)
- Hold time distribution (P50/P90/P99)
- Slippage (signed and absolute) vs a reference price
- Requote-like behavior (repeated reject-then-fill sequences)
- Partial fill rate (if applicable) and average remainder handling time
Two high-signal “fairness” checks:
- Asymmetry test: compare outcomes when the market moves favorably vs unfavorably for the LP during the hold window.
- Client-segment skew: if one segment (e.g., short-horizon scalpers) sees disproportionately worse outcomes, you need a routing and/or commercial conversation—not just a support script.
For prop firms, add a lens for challenge accounts: execution quality variance can materially change strategy viability and dispute volume.
How to instrument last look monitoring across MT4/MT5, bridge, and FIX
Most brokers have the data—they just don’t join it. Last look monitoring becomes reliable when you can trace a single order across the full chain.
A workable instrumentation blueprint:
- Order ID correlation: ensure you can map platform ticket → bridge order ID → FIX ClOrdID/OrderID.
- Unified time source: sync all components to the same NTP source; otherwise, hold-time analysis is misleading.
- Event logging: store key lifecycle events (created, routed, acknowledged, filled, rejected) with timestamps.
- Reference pricing: capture top-of-book at decision points (send time, receive time) from your market data feed.
Operationally, you want dashboards that answer:
- “Which LP is degrading right now?”
- “Is this a connectivity issue or an LP decision issue?”
- “Is it isolated to XAUUSD / US30 / a single session?”
Brokeret-style best practice is to treat execution telemetry like payments telemetry: real-time alerts, drilldowns, and an audit trail that survives disputes.
Commercial levers: what you can negotiate (and what you can’t)
Some execution behavior is structural to the LP’s model, but brokers still have meaningful levers—especially when they come to the conversation with clean data.
Common commercial/relationship levers:
- Last look window / hold time targets: you may not get “no last look,” but you can negotiate measurable thresholds and escalation paths.
- Symbol-specific terms: majors vs metals vs indices often behave differently; negotiate per-asset expectations.
- Toxicity handling: agree on what happens to flagged flow (routing changes, wider spreads, different streams) rather than silent deterioration.
- Depth and max size transparency: reduce “insufficient liquidity” rejects by aligning order sizing and routing.
What not to do:
- Don’t accept purely qualitative assurances (“execution is fine”) without hold-time and reject breakdowns.
- Don’t route purely on tight spreads; a tighter spread with poor fill quality is often more expensive in client outcomes and support load.
Governance, disclosures, and regulatory considerations
Last look sits at the intersection of execution quality and client fairness. Requirements vary by jurisdiction and client type, so check local regulations and consult compliance counsel where needed.
Practical governance steps brokers adopt:
- Maintain an execution policy that explains how orders are routed, what can cause rejects, and how slippage is handled.
- Keep audit-ready records of execution outcomes and LP performance reviews.
- Define internal thresholds for investigation (e.g., reject rate spikes, P99 hold time breaches, abnormal asymmetry).
- Ensure client-facing teams have accurate language—avoid implying “instant fills” if last look and rejects are part of the model.
For prop firms, clear rules on execution behavior during news and rollovers can reduce disputes and improve trader trust.
The Bottom Line
Last look isn’t a mystery feature—it’s a measurable part of your execution stack. If you track hold times, normalize reject codes, and monitor a small set of execution KPIs daily, you can spot LP degradation early and route flow more intelligently.
The commercial upside is real: better client outcomes, fewer disputes, and stronger leverage in LP/PoP conversations—because you can prove what’s happening.
If you want help instrumenting execution-quality monitoring across your platform, bridge, and liquidity stack, talk to Brokeret: /get-started.