Forex & Multi-Asset Trading 6.0.4
Latest11 August 2026
This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.
Forex & Multi-Asset Trading v6.0.4
Release Date: August 11, 2026 Tags: PROVIDERS, MARKET DATA, A-BOOK, EXECUTION, CTRADER, REMOVAL, RISK, QUOTES, WITHDRAWALS, DEPOSITS, PRECISION, ORDERS, ADMIN, PERFORMANCE, SWAPS, RECONCILIATION, DATABASE
Overview
cTrader has been removed from the product. Spotware refused our Open API application, so the credentials the integration is built on cannot be issued — not to us, and not to you through us. Both halves are gone: the market-data feed added in 6.0.2 and the A-book execution bridge that shipped in 6.0.1. The adapters are deleted, so if cTrader is your active price feed, your desk stops quoting when you update — configure a replacement provider before you update, and close any open cTrader hedge at the broker directly.
The second thing to plan for is on the risk side. A price feed that went quiet did not stop the platform valuing accounts against its last print, so stop-outs fired, withdrawals were released and fresh exposure was admitted at a price the desk itself would not have traded at. Marking now refuses a quote the engine has already flagged as halted, which means an account holding a position on a stalled symbol freezes until quoting resumes. Read the Upgrade Notes before you update.
Requires Core v6.6.3.
Update Instructions
Standard update. One seeder runs and removes the cTrader rows.
The market-data provider row is deleted outright. The execution venue row is deleted only when nothing references it; if any position, order or deal still points at it, the row is kept, switched off and retitled cTrader Open API (retired) so your history still resolves its venue. Routing rules and alerts targeting cTrader are removed in both cases — a rule pointing at a venue with no adapter can only produce failed routing.
APP_CTRADER_CLIENT_ID, APP_CTRADER_CLIENT_SECRET, APP_CTRADER_REFRESH_TOKEN, APP_CTRADER_ACCOUNT_ID and APP_CTRADER_ENVIRONMENT are no longer read by anything. Delete them from .env at your convenience; leaving them does no harm.
Upgrade Notes
Accounts now stop trading and stop paying out while a symbol is not quoting
Until this release the freeze that was supposed to protect an account from unreliable numbers only triggered when a price was missing, and a price is never missing once it has arrived — the engine keeps the last one it received for ever. So an account holding a position on a dead feed kept being valued, stopped out and paid out at a price that had stopped moving. That is closed, and the closure is the behaviour change: an account with an open position on a symbol the engine has flagged as halted now refuses stop-outs, withdrawals and margin-increasing orders until quoting resumes, and the terminal shows Pricing paused on that account while it does.
- Expect this to fire during ordinary provider hiccups, not only during outages. The threshold is
fxTradingQuoteStaleSecondsFx(10 seconds by default) andfxTradingQuoteStaleSecondsStocks(30 seconds); on a feed that stutters, raise them rather than accepting valuations you cannot trust. - An account with no open positions is never frozen, and deposits are not blocked by this at all. Placing an order on a symbol that is not quoting was already refused before this release and still is — what changed is the valuation of accounts that already hold a position.
- If you know of a provider outage in your recent history, re-check the stop-outs and the approved withdrawals that fall inside it. Both were computed from a price that had stopped updating, and neither is corrected retroactively by this release.
- Weekends are not affected. A market that is closed is marked at its last print, exactly as before, because freezing every account over every weekend would be a worse fault than the one being fixed.
Your price feed may be the one that was removed
cTrader was the recommended provider from 6.0.2 onward, and the only one whose live feed was free, so it is the likeliest active provider on any install set up since. When its row is deleted, an install that was quoting from it has no active provider at all. The seeder logs a warning naming this condition when it deletes an active cTrader row, but it cannot pick a replacement for you — that is a purchasing decision. The break is abrupt on purpose: an adapter that cannot authenticate is not a degraded feed, it is an absent one, and leaving the row in place would have left an entry in the admin an operator can still switch on, which fails at the first quote rather than at the click.
- Open Admin → Forex → Providers before updating and note which provider is active. If it is cTrader, obtain and configure a replacement credential first.
- Budget for a paid plan on whichever provider you move to. Every remaining provider paywalls its WebSocket, and the terminal cannot price a tradable instrument without one — a free key on any of them will verify, render a price once, and then refuse every order.
Open cTrader hedges can no longer be closed from the platform
The A-book bridge is deleted, so nothing in this release can submit, close, reconcile or read a position at cTrader. The venue entry that Update Instructions describes is kept wherever your history still points at it, but it is a label and nothing more — it cannot execute, close or reconcile anything.
- Close any open hedge at a cTrader broker in the broker's own terminal.
- Expect no change to your client-side positions. They continue to run as B-book; what is gone is the mirrored leg's automation, which means the hedge no longer moves when the client position does.
The symbol mappings cTrader wrote are cleared
Instruments linked to cTrader symbols through Import Catalog carried a stored mapping keyed to it. That key is stripped from every instrument, and mappings for your other providers are untouched.
- Nothing to do, unless cTrader was the only provider an instrument was ever linked to — in which case re-import that instrument against your new provider before you enable it again.
An API client that repeats an order reference now gets a refusal
The per-order reference a client sends to make a retry safe is unique across the whole platform, not per trader. A client that generates them from its own counter rather than as a random value will now be refused with a conflict where it previously received a success — and that success was another trader's order. Anything using random references is unaffected.
- If you publish API access, tell integrators to send a globally unique value and to retry with a fresh one on a conflict.
Changed
cTrader as a market-data provider
- Removed the cTrader Open API price feed, its trendbar chart history, and its provider card from Admin → Forex → Providers.
- Removed the OAuth connection flow: the Connect cTrader account button, the redirect-URI panel, and the callback page that completed the grant.
- Removed
APP_CTRADER_CLIENT_ID,APP_CTRADER_CLIENT_SECRET,APP_CTRADER_REFRESH_TOKEN,APP_CTRADER_ACCOUNT_IDandAPP_CTRADER_ENVIRONMENTfrom everything that read them.
cTrader as an A-book execution venue
- Removed the cTrader execution bridge, its venue card on the Execution dashboard, and its entry in the routing-rule venue list.
- Removed the venue's setup notes, credential hints and the per-venue slippage caveat that documented what it did not enforce.
Twelve Data is now the recommended provider
The recommendation had to move somewhere, and Twelve Data is the only remaining vendor that serves forex, equities, indices and crypto from a single key — the coverage a multi-asset catalog needs.
- Changed the provider comparison to lead with Twelve Data and mark it recommended.
- Changed the guidance around cost to state the position plainly: none of the four remaining providers stream on a free tier, so a streaming-enabled plan is now a prerequisite for trading rather than an upgrade. Confirm which asset classes your plan actually covers before you activate it — coverage is per-entitlement on most of them.
The A-book layer documents two venues
- Changed the A-book documentation and the admin copy from three venues to two: OANDA v20 and MetaApi (MT4/MT5). OANDA remains the one to start with — synchronous fills and a replayable ledger are what the reconciler is built around.
Overnight swap and rollover charging
The hourly rollover run fetched the trading account behind each open position one position at a time. A steady tick paid nothing for it, because a position already charged for that day short-circuits before the lookup — but the first tick after the 17:00 New York cutoff paid one lookup per open position, and the first tick after an outage paid one for every position on every day it was catching up on.
- Changed the run to read every account referenced by an open position once per tick, in batches, rather than once per position and cutoff. A desk with two thousand open positions working through a full seven-day backfill was issuing about fourteen thousand account lookups; it now issues a handful. What is charged, and to whom, is identical — the charge itself is still written under its own row lock.
The financing alert on an A-book venue
Each time a venue's ledger replays, the reconciler compares what the broker charged in financing against what your customers were charged in swap for the same day, and raises an alert when the difference passes the threshold on that venue. To make the comparison it first listed every position ever routed to that venue — a list that only grows, rebuilt in full each time financing lands.
- Changed the comparison to list only the positions that could carry a swap in the days being compared: those still open, and those closed no earlier than a day before the window. A swap only exists for a position that was open when the rollover ran, so the shorter list holds the same positions the long one contributed. The threshold, the alert and the figures it reports are unchanged.
The unresolved-order watchdog
The engine re-checks orders rejected on a broker timeout — the ones where the platform never learned whether the hedge actually filled at the venue — on a sweep that runs at half each venue's order timeout, every 7.5 seconds on the shipped default. It read every externally rejected order from the last twenty-four hours and then discarded, in the application, all but the timeout rejections.
- Changed the sweep to ask the database for timeout rejections only. Each candidate is still examined in full before the watchdog acts on it; what stopped is loading the rejections it was always going to throw away, on a loop that runs eight times a minute for every venue you have configured.
Fixed
An account was valued at a price its feed had stopped sending
The engine keeps the last quote it received for a symbol and never discards it, so when a provider stalled, the price the platform marked positions at simply stopped moving while the real market carried on. Nothing flagged the account as unreliable, because from the inside a twenty-minute-old price and a one-second-old price look the same. The whole desk ran on it: an account was stopped out against a quote that no longer existed, a trader could withdraw "free margin" the gap had already consumed, and new exposure was admitted at a price the platform's own order path would have refused to fill at. The same hole sat in the currency conversion used to express a position's floating profit in the account's currency — a Japanese-yen account holding a dollar-quoted position was valued through a cross rate that had itself gone quiet.
- Fixed marking so that a quote is only used to value money while the engine considers the symbol to be quoting. An account holding a position on a halted symbol is now reported as unreliable and every path that could move money on it — stop-out, withdrawal, new or triggered order — holds off instead of acting. A closed market still marks at its last print, so nothing freezes over a weekend.
- Fixed the conversion leg the same way, so a dead cross rate freezes the account rather than valuing it. Reporting paths that only read rates — admin risk totals and the swap rollover — deliberately keep accepting an older rate, because refusing one there would skip a charge rather than protect anyone.
A wallet transfer and a trading account could move different amounts
A deposit or withdrawal between a wallet and a trading account settles on two ledgers, and only one of them rounded to the currency's precision. The wallet leg moved the rounded figure, the trading-account leg moved whatever was typed — so a deposit of 10.004 USD took 10.00 out of the wallet and put 10.004 into the trading account, leaving four tenths of a cent in the trading ledger with nothing behind it. The rounding is to the nearest unit, so 10.006 fell the other way and the same fraction was destroyed instead. Nothing rejected either of them, and every over-precise transfer drifted the two ledgers again. A withdrawal drifted on the same terms: the trading account was debited the over-precise figure while the wallet was credited the rounded one on approval, so the customer was left short a fraction of a unit, or paid one that came from nowhere, according to which way the rounding fell.
- Fixed both routes to settle the amount to the account currency's precision, once, before anything is checked or debited, and to move that same figure on both legs. The remainder below the smallest unit stays in the wallet rather than being created or destroyed; an amount that is entirely below the smallest unit is now refused with a message that says so instead of transferring nothing and crediting a fraction.
- Fixed the withdrawal ceiling to be quoted on the same grid as the amount, so a refusal can no longer name a maximum that is not itself a payable amount — no withdrawal that was accepted before is refused now — and the operator log records the figure that actually moved rather than the one that was requested.
One trader's order could be answered with another trader's
The reference a client attaches to an order so that a retry cannot place it twice is unique across the entire platform, not per trader — but it was looked up without asking whose it was. Two clients numbering their requests sequentially rather than randomly were enough: the second trader's order was never placed, and the response they got back described the first trader's order, including the position it had opened. Both traders were told everything was fine.
- Fixed all three placement paths — pending orders, internal fills and externally routed orders — to refuse a reference that belongs to somebody else with a conflict the client can retry, instead of replaying a stranger's trade as the caller's own.
The order ticket's estimates were labelled in the wrong currency
Estimated margin, spread cost and the projected profit and loss on a stop-loss or take-profit are all computed from the instrument's price, so they come out in the instrument's quote currency. Every one of them was displayed with the account's currency beside it. On EUR/JPY at 165.00 with 1:100 leverage on a US-dollar account, the ticket announced an estimated margin of "165,000.00 USD" for a position that would actually reserve about 1,100 USD — a hundred and fifty times over — and a non-dollar account is one of the two shipped defaults.
- Fixed the ticket to label those three estimates with the currency the figures are genuinely in. The terminal holds no exchange rates of its own, so it cannot convert them into the account currency; showing the true unit stops the number being a misstatement, and converting it properly is a change to the pricing engine rather than the screen.
- Applies to the estimates only. The margin actually reserved and the profit and loss actually booked are converted by the engine, the commission is charged exactly as the instrument group configures it, and none of the three change here.
- The estimated commission sits in the same block and now carries that same code, and for it the code is wrong on a cross-currency instrument: the per-lot commission is charged straight to the account balance with no conversion, so the figure is already in the account's currency. The amount is right, the unit beside it is not, and correcting it is a separate change.
- The code is read off the symbol, so on an instrument whose base ticker is not three characters — most stock and index CFDs — it can show as a fragment of the symbol rather than as a currency, and on a symbol too short to carry a quote code at all the account's currency is shown as before. The figures themselves, and every amount charged, are unaffected.