Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

Last look is a liquidity provider’s final opportunity to accept or reject an electronic foreign-exchange trade request at the price it quoted. A short Python simulation can illustrate how a request sits in a hold window while prices move, and how a separate validity check can affect the final decision. The example below is educational: its timing, prices, and thresholds are assumptions, not a broker’s production policy or an industry standard.

What is last look in FX?

A client requests a trade against a streamed quote. During the last-look window, the liquidity provider checks the request and then accepts or rejects it. Under Principle 17 of the FX Global Code, last look is intended for validity checks and/or price checks—not other purposes.

A validity check concerns whether the request is operationally appropriate and whether sufficient credit is available. A price check asks whether the requested price remains consistent with the current price available to the client. The GFXC’s 2021 report explains the guidance alongside Principle 17 and emphasizes fair, effective handling and ex-ante disclosure.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Why was my FX trade rejected?

A rejection can follow a failed validity check, a failed price check, or both, depending on the process disclosed by the liquidity provider. While the request is pending, the client does not yet know whether it will execute and may bear market risk if it is rejected. A changed price in a simple model can illustrate that uncertainty, but it cannot establish why a real provider rejected a particular request.

In a theoretical paper, the authors model the window as an option to reject after prices move. That option can limit a liquidity provider’s losses on stale quotes, while the rejection rule also affects traders who are not latency arbitrageurs. This is an economic model, not empirical proof of any provider’s present-day behavior: Foreign exchange markets with Last Look.

Model one request before running many

Represent a request with its quoted price and submission time. Let a reference price evolve during a configurable hold window. At the end, run a validity check separately from a price check, and record a distinct reason for each rejection. The code below uses a simple absolute price tolerance; it is an illustrative modeling choice, not a prescribed FX convention.

Save this as last_look.py and run it with Python 3. It uses only the standard library and a fixed random seed so the sample run is reproducible.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
import random

random.seed(7)

# Assumptions for this toy example, not market-wide settings.
HOLD_SECONDS = 0.20
TOLERANCE = 0.00015
PRICE_STEP_SECONDS = 0.05


def simulate_request(quoted_price, current_price, valid=True):
    """Return the final outcome and the simulated end-of-window price."""
    steps = round(HOLD_SECONDS / PRICE_STEP_SECONDS)
    price = current_price

    for _ in range(steps):
        # Assumed random movement; not calibrated to market data.
        price += random.choice((-1, 1)) * random.uniform(0.00001, 0.00008)

    if not valid:
        return "rejected", "validity_check_failed", price
    if abs(price - quoted_price) > TOLERANCE:
        return "rejected", "price_check_failed", price
    return "accepted", "accepted", price


if __name__ == "__main__":
    quoted = 1.10000
    outcome, reason, end_price = simulate_request(quoted, quoted)
    print(f"quoted={quoted:.5f} end={end_price:.5f}")
    print(f"outcome={outcome} reason={reason}")

The loop advances the reference price in assumed increments until the hold window ends. The model then checks validity first, so a failed validity flag receives the reason validity_check_failed; only a valid request reaches the price check. Change HOLD_SECONDS, TOLERANCE, or the simulated movement range to explore different toy policies. A longer hold leaves a request pending longer; a tighter tolerance makes price-check rejection more likely under these assumptions.

Extend it to compare hypothetical policies

For repeated trials, use the same seeded random stream and explicitly report the number of requests and assumptions. Keep price movement and validity outcomes separate so a rejection count does not obscure its cause. For example, a trial loop can count accepted, price_check_failed, and validity_check_failed separately.

Policy comparisons are meaningful only relative to the toy model. You can compare hold duration, tolerance, and validity outcomes, but should not label the results as expected rejection rates or provider performance. A few dozen lines cannot reproduce venue protocols, credit relationships, market-data quality, or a particular broker’s execution policy.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Why disclosure matters

The GFXC’s 2021 guidance recommends fair and effective processing, better ex-ante disclosure, and information that allows clients to evaluate how trade requests are handled. Its 18 August 2021 release also encourages standardized disclosure sheets and client access to information about trading practices. The FX Global Code is a principles-based industry code; the sources cited here do not establish identical legal obligations across jurisdictions.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Guy Debelle, then GFXC Chair, 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.” (GFXC release, 18 August 2021.)

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.