Last look is a liquidity provider’s final opportunity to accept or reject an electronic foreign-exchange (FX) trade request at the price it quoted. A small Python simulation can make the hold window visible: the request waits, a reference price changes, and the provider applies separate price and validity checks before deciding. The code below is an educational model—not a broker implementation, backtest, or statement of any provider’s current rejection policy.
What is last look in FX?
In an electronic FX market, a client may submit a request to trade against a streamed quote. With last look, the liquidity provider holds that request briefly while performing checks, then accepts or rejects it. The FX Global Code’s Principle 17 describes last look as a risk-control mechanism for validity and/or price checks, not a general-purpose option to decide whether a trade is desirable.
As an Amazon Associate I earn from qualifying purchases.
Validity check
A validity check concerns whether the request is operationally appropriate and whether sufficient credit is available. A simulation can represent this as a separate pass-or-fail condition; it should not conflate a credit or operational failure with a price movement.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Price check
A price check asks whether the requested price remains consistent with the current price available to the client. The cited guidance does not prescribe a universal tolerance or hold duration. Those values depend on the disclosed process and should be explicit parameters in any toy model. The FX Global Code sets out the principles; the GFXC’s 2021 report on last look explains the guidance in more detail.
#1 Best Overall
Why was my FX trade rejected?
A rejection can follow a failed validity check, a failed price check, or both, depending on the provider’s disclosed process. During the hold, the market may move; if the provider’s price-check rule finds the request price no longer consistent with the price available to the client, the request may be rejected. A client therefore faces uncertainty while the request is pending and may bear market risk if it is not executed.
A theoretical academic model treats the hold as an option to reject after prices move. Such an option can limit a liquidity provider’s exposure to stale quotes, but rejection rules also affect traders who are not latency arbitrageurs. This is an economic model, not empirical proof of current broker practices: “Foreign exchange markets with Last Look,” Mathematics and Financial Economics (2018).
Rank #2
A transparent toy model of the hold window
This example uses a seeded random walk to produce a repeatable sequence of hypothetical reference prices. The client submits a buy request at the initial reference price. The simulation advances the reference price during the hold, checks validity separately, then compares the request price with the final reference price. Its chosen hold, tolerance, step size, and credit flag are illustrative inputs—not market standards or evidence about a provider.
PC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchimport random
random.seed(7)
request_price = 1.1000
hold_steps = 5
max_deviation = 0.0002
step_size = 0.0001
credit_available = True
reference_price = request_price
print(f"request: buy at {request_price:.4f}")
for step in range(1, hold_steps + 1):
reference_price += random.choice((-step_size, step_size))
print(f"step {step}: reference={reference_price:.4f}")
if not credit_available:
accepted, reason = False, "validity_check_failed"
elif abs(reference_price - request_price) > max_deviation:
accepted, reason = False, "price_check_failed"
else:
accepted, reason = True, "accepted"
print(f"result: {'accepted' if accepted else 'rejected'} ({reason})")
The five steps stand in for elapsed time; there is no real clock, venue connection, market feed, or broker protocol. The threshold compares the request price with the last simulated reference price, and the validity branch uses a single hypothetical credit flag. Run the code as written to see one reproducible lifecycle. Change hold_steps, max_deviation, or credit_available to explore how the toy decision changes.
How to compare simulated policies without overstating them
For repeated trials, retain the same price-generation assumptions and vary one policy parameter at a time. Report the number of simulated requests, accepted and rejected counts, and each rejection reason. This makes the comparison interpretable; it does not turn the exercise into a backtest or a forecast of real rejection rates.
- Hold duration: more simulated steps allow more price movement before the decision and keep the request pending longer.
- Price tolerance: a smaller permitted deviation will reject more requests in this model when the reference price moves outside that limit.
- Validity outcome: track operational or credit failures separately from price-check failures.
- Client and provider outcomes: report fill and rejection counts. If you add an exposure measure, define exactly what it measures and label it hypothetical; the short example does not calculate one.
- Transparency: record the parameters and reason for each decision so the simulated policy can be inspected.
These are useful educational comparison dimensions, not a GFXC scoring system. Fifty lines of Python cannot represent venue protocols, credit relationships, market-data quality, or a particular provider’s execution policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Why disclosure matters
The GFXC’s 2021 guidance is principles-focused, not prescriptive. It recommends fair and effective processing, better ex-ante disclosures, and information that allows clients to evaluate how trade requests are handled. A separate GFXC release says last look is intended for price and validity checks only, and encourages standardized disclosure sheets and client access to information about trading practices.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errorsIn that 18 August 2021 release, GFXC Chair Guy Debelle said: “Liquidity consumers should then use this information to evaluate their execution, ask questions of their liquidity provider’s last look process, and evaluate whether to trade with liquidity providers that are using last look.” Read the GFXC release.
Best Value
The FX Global Code is a voluntary code of good practice, not a statute; this article does not establish identical legal obligations across jurisdictions. A simulation can help explain the mechanics, but a client evaluating a real relationship needs the provider’s disclosures and information about its own request handling.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




