Forex & Multi-Asset Trading 6.0.3

2 August 2026

This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.

RISKMARGINDEALING DESKEXPOSUREHEDGINGADMINDASHBOARDACCURACYPROVENANCEI18NTRANSLATIONSPERMISSIONSUIBUG-FIXES

Forex & Multi-Asset Trading v6.0.3

Release Date: August 2, 2026 Tags: RISK, MARGIN, DEALING DESK, EXPOSURE, HEDGING, ADMIN, DASHBOARD, ACCURACY, PROVENANCE, I18N, TRANSLATIONS, PERMISSIONS, UI, BUG-FIXES

Overview

A correction release for the risk desk, and a rebuild of the screen it lives on.

The risk desk warned about accounts it was not showing, on a desk where nothing was wrong. The at-risk queue printed "More are near their margin call than are listed here" directly above a panel reading "No accounts near margin call." Both were drawn from the same request. One of them was false, and it was the alarming one.

Two different facts were being carried by one flag, and the flag was raised whenever the candidate scan filled its 200-account budget — which on any busy desk it does with perfectly healthy accounts. Any desk with 200 or more accounts in that margin band got the warning permanently, with nothing behind it.

The dashboard itself has been rebuilt onto the standard admin page frame, keeping the risk content that was already its strongest part and adding a book coverage meter, page-level alerts and a provenance rail. The page also had no translations at all, and now carries 100 translatable entries in all 90 language files.

Four things this screen was telling you were wrong — read Upgrade Notes before comparing anything against what you wrote down last week.

Requires Core v6.6.1.

Update Instructions

pnpm updator

No schema change, no new setting and nothing to switch on. The risk dashboard is the only screen that changes, and it changes on its own.

No role gains or loses a screen. Ten permission declarations behind the Forex admin were corrected in this release, but every one of them was corrected back to the key the platform was already enforcing — see Fixed.


Upgrade Notes

The at-risk queue warned about accounts that were not there

One flag was answering two questions. It was set when the candidate scan filled up — and the scan casts a deliberately wide net, taking anything under a 1000% margin level so that an account whose stored figures are up to five minutes stale still gets examined. The list then keeps only what a live recalculation puts under roughly 150%. On a desk with 200 or more accounts between those two numbers, the flag went up while the list came back empty.

  • Changed: the two facts are now reported separately. The queue only says the list may be short when the list itself was actually cut; when the scan was merely bounded it says so plainly — "Scanned the 200 accounts with the lowest margin level; every one of them that is near a call is listed." The scan's bound is stated in the provenance rail at the top of the page, where it belongs, and it is no longer drawn as a warning.
  • What to check: if you have been treating that banner as a signal, stop. It was not one. If you sized a monitoring rota or an intervention around "more accounts are near a call than we can see", re-read the queue after updating — on a healthy desk it will now be silent, and it will only speak when there really are accounts past the cap.
  • Why the answer is trustworthy now: candidates are examined worst margin level first, so every account the cap excluded is healthier than the last one looked at. If that last, healthiest one did not itself qualify, nothing beyond it can. The list can only be short when the scan filled and its healthiest member still made the cut — a question only the server can answer, which is why the screen no longer guesses at it.

"Long Lots" and "Short Lots" were units, not lots

Two columns on the net-exposure table were labelled Lots and carried base units. Only the Net Lots column was ever divided by the contract size.

  • Changed: they now read Long (units) and Short (units). The numbers themselves are unchanged — the label was the defect.
  • What to check: any hedge you sized by reading those two columns. A units figure read as lots overstates the position by the instrument's whole contract size. Net Lots was correct throughout and is untouched.

A symbol nobody could price was drawn as carrying no risk

When the tick engine has no mid for a symbol, its net notional comes back as unknown. The table formatted unknown as $0 — so the one symbol on the book that cannot be valued was rendered identically to a symbol carrying no exposure at all.

  • Changed: it renders as an em dash, is counted, and the count is stated under the exposure summary as "N with no live mid".
  • What to check: any USD exposure total you took off this screen while a symbol was halted or unquoted was understated by whatever that symbol was actually carrying.

The freshness indicator has never worked

The snapshot timestamp arrives as a number and the page was reading it as text. The result was never a valid age, so the indicator printed "Updated — ago" on every render, on every install, since the screen shipped.

  • Changed: it shows a real age, refreshing every second, alongside the snapshot clock time and a live/updating/stale dot. The dot goes amber and says "Stale" when a refresh fails — the old page kept the last good snapshot on screen and gave no indication the clock had stopped.

Added

Book coverage — how much of the open book is the desk's own risk

Above the fold, before any tile is read.

  • Added a two-band meter splitting open exposure into retained (the desk's own B-book risk) and hedged (routed out to a broker), with the USD figure and the share for each.
  • Added weighting by absolute net exposure per routing, not by position count — one account holding 40% of the book would otherwise draw as a hairline beside a hundred dust positions. The internal and external legs of a symbol are measured separately and deliberately, because netting them first hides exactly the exposure the meter exists to show.
  • Added two separately-counted exclusions, each stated with its own cause. A symbol with no live mid cannot be valued at all. A symbol that is quoting normally but whose long and short legs cancel carries no derivable per-unit rate — nothing is wrong with the feed, and calling it unpriced put a price-feed fault on screen where there was a fully offset book. Neither is given a width in the bar, because a band drawn at an invented width is worse than an admitted gap.

Alerts for the two things that need acting on now

  • Added a page-level alert when a symbol carrying exposure has stopped quoting, naming the symbols. Positions on a halted symbol cannot be marked or stopped out until quoting resumes, and this was previously discoverable only as a badge partway down the exposure table.
  • Added a page-level alert when an execution provider is degraded, out of sync or has unresolved incidents, with a button through to the Execution Desk.

A provenance rail

  • Added a band above the title stating, in order: whether the feed is live, updating or stale; how long ago the snapshot was taken and when it refreshes; that client equity and balance are the reconciler's figures rather than a live recalculation; and whether the margin scan hit its 200-candidate bound.

Two new headline tiles

  • Added Accounts Near Stop-Out, with how many of them are already below their margin call, linking through to the account list. It shows an exact count whenever the list is complete, and only reads 200+ when the list genuinely was cut.
  • Added Unresolved Execution Alerts, linking through to the Execution Desk. On a pure B-book install with no execution provider it says so rather than showing a zero.
  • Changed client equity, client balance, accounts with exposure and symbols carrying exposure into a context strip at the foot of the page rather than headline tiles. Nobody acts on the size of the book; they act on what is inside it.

The dashboard speaks other languages

  • Added 100 translatable strings, carried in all 90 language files. The screen previously contained not one translated string — every label, column header, empty state and tooltip was hardcoded English regardless of the operator's language.

Changed

The risk desk is on the standard admin frame

  • Changed the page off its bespoke shell — a gradient hero with floating particles, over blurred translucent panels each with a coloured wash behind it, and two hand-rolled tables — onto the same frame, cards, tables and stat tiles as the rest of the admin.
  • Changed the loading state so the page keeps its own layout while it waits. Headings, column headers, the coverage track and the legend render immediately; only the figures carry placeholders, so nothing moves when the first snapshot lands.
  • Changed the entrance animation down to the summary tiles alone. The two full-body animation wrappers this replaced are gone.

A live desk is no longer amber before you read a number

  • Changed LIVE and DEMO back to neutral chips. A LIVE account in the at-risk queue was painted amber and a LIVE hedge provider was painted green — so on a live-only desk every row was already a warning colour and every hedge account already looked healthy, before a single figure had been read. Amber now means this one, which is what it is for.
  • Changed the external-exposure column off the interaction colour. It was drawn as a link, in a table whose rows do not click anywhere. Emphasis is now the font weight's job.
  • Changed every profit, delta and basis figure to carry an explicit + or , so direction never depends on being able to tell the up colour from the down colour.

The hedged-notional figure now says what it could not weigh

  • Changed the External notional hedged figure to declare the symbols it had to leave out, and why. The figure itself is unchanged — it excluded the same symbols before, silently, behind a tooltip.

Fixed

The at-risk queue contradicted itself on a healthy desk

  • Fixed the truncation warning being raised by the candidate scan filling up rather than by the at-risk list being cut. The scan admits anything under a 1000% margin level and the list keeps only what a live recalculation puts under about 150% — a 6.6x gap — so any desk with 200 or more accounts in between showed "More are near their margin call than are listed here" directly above "No accounts near margin call." See Upgrade Notes.
  • Fixed the same conflation reaching the summary tile, where it would have printed 200+ accounts near stop-out over an empty queue.

Two exposure columns were labelled in the wrong denomination

  • Fixed Long Lots and Short Lots carrying base units. They now read Long (units) and Short (units). Net Lots was always correct. See Upgrade Notes.

An unpriceable symbol was drawn as flat

  • Fixed an unknown net notional formatting as $0, which drew the one symbol on the book nobody can value exactly like a symbol carrying no risk. It now shows an em dash with an explanation, and the count of such symbols is stated. See Upgrade Notes.

The freshness indicator read "Updated — ago" forever

  • Fixed the snapshot timestamp being parsed as text when it arrives as a number, which produced an invalid age on every render. The type declaration said text, which is why no build ever caught it. See Upgrade Notes.

Numbers were formatted by whoever happened to be looking

  • Fixed every figure on the page taking its thousands separator and its clock format from the runtime default — the server's on the first paint, the viewer's browser on the second. The same total came out 50,000 on one and 50.000 on the other, which is a hydration mismatch: the browser throws away the mismatched section and redraws it. Formats are now pinned, and money goes through the platform's own currency formatter.

A licence check blanked the entire Forex admin

  • Fixed the licence gate wrapping the site header, the addon navigation and the footer as well as the page. While the check was in flight — and on any installation where it was slow — the whole screen was a single centred spinner with no way to navigate anywhere. Only the page content waits now; the chrome renders immediately.
  • Fixed the footer riding up the page on short Forex admin screens, because the page body had no height to fill.

Ten permission declarations named a key nothing checks

  • Fixed ten Forex admin screens declaring permissions in an access.forex_trading.* family that no backend route has ever checked and no migration has ever granted to any role. The live gate was never built from them, so nobody's access was affected — but the next routine regeneration would have adopted them, and the failure mode is invisible: the screen redirects and renders its empty state, which reads as "the Forex menu is broken", not as a refusal. Every one is now the key the platform already enforces.