Binary Trading AI Engine 6.0.3

Latest

11 August 2026

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

BINARY OPTIONSSTEERINGSETTLEMENTPRACTICE MODERISK LIMITSUSER TIERSAUDIT TRAILSNAPSHOTSCORRELATIONPERFORMANCEDATABASEBUG-FIXES

Binary AI Engine v6.0.3

Release Date: August 11, 2026 Tags: BINARY OPTIONS, STEERING, SETTLEMENT, PRACTICE MODE, RISK LIMITS, USER TIERS, AUDIT TRAIL, SNAPSHOTS, CORRELATION, PERFORMANCE, DATABASE, BUG-FIXES

Overview

6.0.3 began as a performance release and became a correctness one. An adversarial audit of every money engine on the platform read this addon line by line and found the settlement seam handing prices between decisions that were never made for each other — including practice accounts fixing the close that real-money orders settled on, and publishing that price into the chart every trader was watching.

Several repairs change what an engine does to a settled price. A practice settlement can no longer touch the real price series; two steering decisions inside the same expiry minute no longer share a price; a Max Daily Loss of 0 is now enforced rather than skipped; and Allowed Order Types now restricts steering instead of being decorative. The last two change what your engines do tonight with no edit from you — read Upgrade Notes before updating.

The performance work is still here: the once-a-second steering pass no longer grows its database load with the number of traders holding positions. Three admin screens that read your saved records back wrong on MariaDB are corrected. The Ecosystem extension is required, and the AI Market Maker extension for steering. Requires Core v6.6.3.

Update Instructions

pnpm updator

There is no configuration step and no new permission in this release.


Highlights

What the audit found here

This addon was one of fourteen areas swept by an adversarial audit whose brief was not "find bugs" but "for every assertion that is green, what build would make it red?". The binary engine's own test suite was green throughout, and stayed green on a build with the steering arithmetic deleted entirely — because the field the suite read as proof of steering was reconstructed after the fact from whether the engine happened to be running, not from what the settlement had actually done.

That single wrong question was load-bearing. It hid a settlement record that an emergency stop could erase, and it sat next to a price pin that two opposing decisions were quietly sharing. Nearly every repair below sits on the path between "the engine decided this bucket should win" and "this is the price it settled at", which is the only path in the addon that touches customer money. The exceptions are the snapshot rollback and a separate sweep of how this addon reads its own stored records, which put three admin screens right on MariaDB installations.


Upgrade Notes

Check Allowed Order Types on every engine before you update

Allowed Order Types on the engine form was validated, saved, restored by snapshots and drawn as a checkbox group, and nothing at runtime ever read it. It binds from this release. Ticking types other than Rise/Fall still does nothing, because Rise/Fall is the only type the engine has ever been able to steer — but unticking Rise/Fall now means what it says.

  • Open each engine and look at Allowed Order Types. Any engine whose list omits Rise/Fall has been steering it anyway; after this update that engine steers nothing at all, at settlement or on the live price, and its realised win rate will drift to whatever the market gives it.
  • An engine with no list stored at all is unaffected and keeps steering as before — the shipped default already contains Rise/Fall — and so is one whose stored value is unreadable. An empty list, which the engine form refuses to save, now stops steering like any other list with Rise/Fall missing from it.

An engine with Max Daily Loss set to 0 will start refusing win-rate decisions

6.0.2 stopped a cleared field writing a 10,000 budget over a configured 0. The guard that spends that budget still skipped any engine whose limit was 0, so the operator asking for the strictest possible cap — never take a loss to hit the win rate — was the one operator it never applied to. It applies now.

  • If you set Max Daily Loss to 0 deliberately, expect the realised win rate on that engine to sit further from its target than it did yesterday. That is the cap working; the balance sheet is what it protects.
  • A negative Max Daily Loss still disables the guard, unchanged.

Settlement records written before this update can say a steered settlement was fair

The steered/fair marker on each settled position was rebuilt from engine state read after the settlement had already committed. Hitting the emergency stop clears the running engines instantly, so every settlement still finishing at that moment was written down as never steered.

  • Nothing in this release rewrites existing rows. If you audit steering history, treat positions settled in the minutes around an emergency stop as unreliable, in both directions — some are marked fair when they were steered, and a period with steering configured but not actually reached could be marked steered.
  • From this release the marker records what the settlement seam did, so the ledger and the outcome cannot disagree.

If you held engines back because of database load, you have room now

The reads the engine makes on each pass no longer grow with the number of traders holding positions in it. Working out tiers is two queries for the whole pass rather than two per trader, and reading an expiry group is one query rather than one per order. Only the row-by-row updates still scale with the number of orders, and those now run ten at a time — deliberately capped, because those connections are shared with the rest of the platform.

  • If you capped how many engines run at once, or widened your database connection pool, to stop the engine crowding out the rest of the platform, that headroom is worth revisiting.

Changed

Working out which tier a trader is in

  • Changed tier resolution to happen once for the whole steering pass. 6.0.2 stopped the engine asking this question once per order; it still asked once per trader. Two questions about every trader with an open position — read the tier table, then total that trader's whole settled history — twice a second, nearly all of them re-asking the same question about the same person. It now reads the tier table once and totals every trader in one grouped query. The tier each trader is placed in is unchanged, including the rule that a manually assigned tier is never derived from volume.

Recording the positions being steered

  • Changed the engine to read an expiry group's positions in one query and write the new ones in one insert. It previously looked up each order's position row and wrote it individually on every tick, so a group of forty orders issued eighty queries per tick for the whole lead-up to expiry. Positions already open still update row by row, because each takes different values, though ten at a time now rather than one after another.

The checks that decide whether a settlement may be steered

  • Changed the three gates in front of a steered settlement — is this market ecosystem-backed, does the matching ecosystem market exist, is its market maker running — to read only the single column each one tests. The market maker record is thirty-two columns wide and was being loaded whole for every settled order, decoding a stored configuration blob that none of the three gates looks at. The verdicts are unchanged, and they are still evaluated in the same order.

Fixed

A practice settlement could set the price real-money orders settled on

Practice and live positions are analysed separately and steered toward different targets — practice users are usually steered to win — so one symbol and one expiry minute genuinely hold two opposite decisions. The engine kept only one price per symbol and minute, so whichever settled first fixed the close for the other. A practice order could therefore decide the price a bucket of real-money orders settled at, in the direction that made its own holder win. Worse, the practice settlement then published that steered close as the real close of that minute: the candle every live trader was looking at moved because a demo account expired, and the AI market maker was told that was the market's last price.

  • Fixed by keeping the practice and real books apart at settlement, and by stopping a practice settlement writing to the shared price series at all. A demo order still settles on its own steered price.
  • A practice settlement can now differ slightly from the candle the practice user sees. That is deliberate: the alternative was letting an account trading no money move the market for everyone.

Two steering decisions in the same minute settled on each other's price

The engine decides per exact expiry moment, but the price series has one close per minute, so two buckets expiring at 09:15:05 and 09:15:40 shared a single pinned close — and they routinely point opposite ways, one told to let its traders win and the next told to let its traders lose. Whichever settled first fixed the number, and the second bucket's orders were then handed a price steered against the decision recorded for them: the win-rate controller says these users should win, and the settlement pays them a loss. No audit row explained it, because the decision on file was the right one.

  • Fixed by attaching the decision to the pinned price, so an order is only ever handed a close published for its own decision. An order that finds the other decision's price settles fairly on the real close, which is what every other refusal in the settlement path already does.
  • Fixed the same crossover across processes. The shared close authority records a price and no decision, so agreement is now read from its direction: a price pushed up cannot have come from a decision to push down.

An engine could steer an order type you had switched off

Allowed Order Types had no runtime consumer anywhere. An operator who unticked Rise/Fall to confine an engine to other products had said "steer nothing here", and the engine went on steering the one type they had explicitly disallowed — both at settlement and on the per-tick nudge that moves the real ecosystem price the whole market trades against.

  • Fixed by reading the setting at both steering seams. It can only ever narrow: the shipped default and any list naming Rise/Fall behave exactly as before, and an unreadable value falls through to the previous behaviour rather than silently switching steering off. Widening the engine to steer the other four types is settlement arithmetic that does not exist yet, which is why ticking them changes nothing.

Max Daily Loss of 0 was the one value the guard ignored

The daily-loss guard reverts a forced outcome that would push the period past the configured cap. It tested for a cap above zero, so 0 — the strictest setting the form accepts, and the one 6.0.2 went out of its way to make reachable — was read as no cap at all and skipped. The same guard was also applied to practice buckets, which have no real money to count: the engine reports zero practice profit, so the test collapsed from "do not let the period go into the red" into "do not let this one bucket lose". On an engine with a tight live cap that was already true of most practice buckets, and enforcing 0 would have made it true of nearly all of them.

  • Fixed the guard to treat 0 as a configured limit. At 0 it now means exactly what the form implies — do not go into the red to hit the win rate. A negative value still disables it.
  • Fixed Practice Target Win Rate and Practice Win Rate Variance going inert on engines with a tight live budget. The guard now measures real money only, so the practice targets reach the outcome again. The two settings were never related.

The settlement ledger disagreed with what the settlement did

Whether a position had been steered was rebuilt at reconciliation time from live engine state — is an engine resident, is it active, is it paused — read one round trip after the settlement had already committed. Both directions were wrong. The emergency stop clears the running engines instantly, so every settlement still in flight found nothing and was recorded as never steered: in a steered group of twelve, only the order that published the price kept its record and the other eleven were written down as fair. In the other direction, an engine that was running and had made a decision was recorded as having steered even where the settlement had not touched the price at all.

  • Fixed by taking the marker from what the settlement seam actually did — it already records either the steer or the reason it refused — and falling back to the old reconstruction only for a settlement this process never handled.

The daily-loss budget could be measured against losses that were never counted

Recording a settlement against the engine's books had exactly one driver: a fire-and-forget step scheduled after the settlement transaction committed, with no retry and nothing sweeping for what it missed. A restart during a deploy, with a batch of settlements in flight, left the wallets credited and the engine's books never told. That is not a lost statistic: those books are the number Max Daily Loss is measured against, so a dropped record un-bound the cap for the rest of the period. In the other direction, nothing stopped the same settlement being recorded twice, double-counting platform profit into the same budget.

  • Added a catch-up sweep that runs about once a minute, finds settled orders whose bookkeeping never landed and records them, logging how many it recovered and that the budget was understated until it did.
  • Fixed the double count by having a settlement claim its position row as it writes the outcome, so a sweep racing a late recording loses harmlessly instead of crediting the counters twice.

One engine's tier bonuses were applied to another engine's traders

Tier win-rate bonuses were held in a single table shared by every engine, and loading one engine's tiers wiped the rest. Whichever engine the scheduler happened to load last owned the bonuses for all of them, so an engine with no tier rows of its own could shift its target win rate by a bonus configured on a different market — a number that moves whether a bucket is steered to win or lose, on a market no one had entered it for.

  • Fixed by keeping each engine's tier bonuses under its own engine. An engine now applies the platform-wide tier bonuses plus any tier rows entered on it, and never another engine's.

Rolling back a snapshot could reconfigure a different engine

The rollback route confirmed the engine in the address existed and then restored whatever engine the snapshot itself belonged to. Pointing it at another engine's snapshot restored that engine's entire configuration — steering band, win-rate target, simulation mode, exposure and daily-loss limits — filed the rollback in that engine's audit trail, and then reloaded the engine you were looking at, which nothing had changed. Two engines misreported at once: one silently reconfigured, the other reported as rolled back while still running its old settings.

  • Fixed by refusing a snapshot that does not belong to the engine named in the request.

The correlation console, cohort comparison and snapshot figures were wrong on MariaDB

The platform runs on MySQL and on MariaDB, and the two hand back a stored structured record differently: MySQL returns the record, MariaDB returns the text it was written as. Three places in this addon read one without allowing for the text, so the same screen was right on one installation and quietly wrong on the next, with no difference in configuration between them.

  • Fixed the price-correlation console ignoring what you saved. On a MariaDB install the provider and the deviation threshold were stored correctly and then read back as the shipped defaults — Binance and CoinGecko at 2% — so the console showed 2% again after you had saved 5%, and the monitor raised its alerts against that default rather than your threshold. Correlation alerts already on file from such an install were raised at 2% whatever the console displayed; from this release the saved provider and threshold are the ones used.
  • Fixed cohort comparison measuring the wrong people. A cohort defined by signup date matched every user on the platform, and one defined by deposit size or by trade count matched nobody at all, so the win rate, volume and platform profit put side by side were never the cohort's. Creating a cohort was unaffected; only comparing them read the stored definition back.
  • Fixed the orders, wins and losses under a snapshot's performance at capture showing as dashes on a snapshot that had recorded them. The engine settings a rollback would restore, and the tier roster beside them, were always displayed correctly.