Releases

What's new.

All notable changes to SwiftTrade. Versions follow Semantic Versioning; the single source of the version is the VERSION file (python scripts/set_version.py stamps every package).

Unreleased

Main chart: price scales, Kagi, Point & Figure (3 October 2026)

  • SCALE LIN / LOG / % / 100 (terminal/src/design/chart-scale.js): one projection for everything the price pane draws; logarithmic needs positive prices and falls back to linear otherwise; percent and indexed label the axis relative to the first bar on screen. Axis drags, wheel zoom and panning work in the scale's own space.
  • Kagi and Point & Figure chart types (chart-series.js kagi, pointFigure) with their own renderers, built from bar closes with an ATR-sized step; neither looks ahead. Tests: terminal/tests/chart-scale.test.mjs, browser tests in terminal/e2e/workspace.spec.mjs.

The website on Vercel (3 October 2026)

  • `vercel.json`: the public website can be served alone, as static files, from Vercel (framework "Other", output web-next/out). A push to main deploys it. See DEPLOYMENT.md §11.
  • Static mode (SWIFTTRADE_STATIC_SITE=1, automatic on Vercel): no request goes to /api or /ws; the console, the contact forms and the download page say that they need a SwiftTrade engine instead of showing 404 errors; /terminal/ leads to that notice; legal pages are read from configs/legal/ at build time; canonical URLs use the Vercel production address when NEXT_PUBLIC_SITE_URL is not set; Vercel Web Analytics loads only with the visitor's analytics opt-in.
  • Fixed for every build: Next 16's static export wrote the per-segment prefetch files into nested folders while the router requests them by a flat name, so every link prefetch ended in a 404 (on the engine's static mount too). web-next/scripts/flatten-prefetch.mjs runs after next build and adds the flat names.
  • Git: .gitignore now also excludes installers inside releases/<version>/, the bundled desktop engine (desktop/engine/), the paper bot's data folder and TypeScript's build cache.

Market Canvas: one zoomable market view with semantic zoom (2 October 2026)

  • Market Canvas (window MARKET CANVAS, terminal/src/canvas/, terminal/src/design/market-canvas.jsx): one time × price surface whose content follows the zoom. Five levels chosen from the time one pixel covers: structure (regimes, support / resistance, volume zones, swing structure, events), candles (volume, VWAP, averages, profile), inside the candle (bid × ask clusters, delta / volume / count rows, cumulative delta), single trades, and the L2 book frame by frame. The bar length follows the zoom from one year to one second and can be locked. See docs/MARKET_CANVAS.md.
  • Interaction: drag to pan, wheel to zoom around the cursor, drag the price or time axis to scale, region zoom, ruler, double-click to go one level deeper, keyboard map, context menu, inspection tooltip (market › candle › price row › trade › book), follow / jump to live, split view with a shared crosshair and linked time range, layer dialog with AUTO / ON / OFF per layer and saved templates, drawings (level, trend line, rectangle).
  • Server (services/market_canvas.py, analytics/structure.py, GET /api/canvas/{id}/capabilities | bars | trades | frames | footprint | events | structure): bars of every resolution on one time axis, venue candles fetched once and cached, Binance trade history for older windows (bounded, the unread part reported), recorded L2 frames, footprint per bar with incomplete bars marked partial, order-flow events by time range, market structure.
  • Rendering: the liquidity heatmap is coloured on the GPU (WebGL 2, CPU path without it); trades merge into one dot per screen cell; requests go through an aligned chunk cache. Frame composition measured at 3.5 to 11.3 ms on a 1574 × 768 canvas. Layers without a connected data source (open interest, funding, options, earnings) are listed and not drawn.
  • Bookmap window now opens this engine on the order book: pan and zoom in time and price, colour schemes, two contrast cut-offs, COB and SVP columns, volume dots, the figures strip, and a trading column (size presets, market and join orders, cancel buys / all / sells, flatten, reverse, bracket exits, time in force). The column is disarmed when it opens; orders go through the execution service and its risk engine.
  • Footprint window opens the engine inside the candle; the classic footprint is one click away (CANVAS / CLASSIC).
  • Main chart: drag the price axis and the time axis to scale, drag vertically once scaled, double-click the price axis for auto-fit; the wheel keeps the bar under the cursor when looking back.
  • Workspaces: DAY TRADING, SCALPING, FUTURES · ORDER FLOW, OPTIONS, RESEARCH (24 layout presets).
  • Fixed: a window that was opened after the page had loaded could not be dragged by its title bar.
  • Paper week: scripts/ensure-bitget-paper.ps1 registers a scheduled task that restarts the paper bot when the machine wakes into a new session (it runs while the owner is signed in).
  • Not built: order-book history across restarts and replay controls, WebGPU, AI annotations, the indicator library on the canvas (it has VWAP and two averages; the 66 indicators stay on the main chart).

Open items closed on 2 and 3 October 2026

  • Alerts to a webhook (monitoring/webhooks.py, GET /api/alerts/delivery, POST /api/alerts/delivery/test): off by default. The URL comes from the environment (SWIFTTRADE_ALERT_WEBHOOKS) and its host must be listed in alerts.webhook_hosts; https and public addresses only, no redirects, optional HMAC signature, bounded queue and rate limit. Logs and the status route name the host, never the URL. See docs/OPERATIONS.md.
  • The assistant can describe the book (ai/book_view.py, tools get_portfolio_state and get_risk_state): read from the records the trading engine wrote; fixed SELECT statements; the ai package imports nothing of the trading plane (tested). It cannot change anything.
  • Deflated Sharpe against effective trials (analytics/effective_trials.py): reported next to the strict figure in the robustness report and on a pipeline candidate. The gate is unchanged.
  • Dependency audit (scripts/audit_deps.py, docs/DEPENDENCY_AUDIT.md): 85 Python packages and four JavaScript package folders, no findings after updating Next.js from 16.3.5 to 16.3.6 (a critical advisory in next/og, a code path the static site does not use).
  • Browser tests (terminal/e2e/, npm run e2e, scripts/e2e_server.py): 15 tests in the installed Microsoft Edge against a throwaway server with simulator data and without the project's .env.
  • `.env`: 17 lines of explanatory text without a leading # were turned into comments; the nine variables are unchanged.

Feature registry, originals and a round of closed gaps (2 October 2026)

  • Feature registry (docs/registry/*.reg, scripts/feature_registry.py, scripts/registry_set.py): 969 atomic features in 45 categories, each with source platform, status, layers, implementation, tests, documentation and dependencies. A row is DONE only when its code and its test exist; BLOCKED only with a named missing capability. The generator writes docs/SWIFTTRADE_FEATURE_REGISTRY.md, docs/FEATURE_DEPENDENCIES.md and docs/SWIFTTRADE_EXHAUSTIVE_COMPLETENESS_REPORT.md. Today: 427 done, 199 implemented without an automated test (almost all terminal-only), 96 partial, 177 missing, 58 blocked by data, 12 not applicable.
  • Market Memory (research/market_memory.py, GET /api/research/memory/{id}, window MARKET MEMORY): the past days whose state was nearest to today's, what followed them against the base rate, and a walk-forward record of whether the method ever had skill. On BTC, ETH and SOL it reports no measured skill at 5, 20 and 60 bars, and says so above the analogs. See docs/ORIGINALS.md.
  • Risk Brain (risk/brain.py, GET /api/risk/brain, window RISK BRAIN): account, strategy and execution constraints in one list, most binding first, with separate verdicts for manual orders and automated strategies and an EXPOSURE view by asset class, sector, currency, country and origin. Read-only: the risk engine stays the judge.
  • Scanner (microstructure/scanner.py, GET /api/orderflow/scan, window SCANNER): the model detections of every live market in one list, ranked by how far each went beyond its own trigger, faded by age. MODEL, not a signal.
  • Condition alerts: optional expiry, edit in place (the kind and the instrument stay) and clone (PUT /api/terminal/condition-alerts/{id}, POST .../clone). Schema 12 rebuilds the alert table and keeps its rows. Sound and desktop delivery with a minimum severity.
  • Chart: 66 indicators with a source choice and a search box (new: ribbon, cross markers, rolling regression channel, anchored VWAP with bands, swing levels from confirmed pivots, and 37 more since the first batch); chart types step, line with markers, baseline, HLC area, columns, high-low; legend at the crosshair; bar-close countdown; keyboard navigation; CSV export.
  • Drawings: select, move, reshape by a handle, duplicate and delete a single drawing (drawing-geom.js). A line or a point is picked before the area it lies in.
  • Watchlist: sort by column, traded value (volume × VWAP, comparable across instruments) and spread, CSV export.
  • Workspaces: export to a file and import with validation; an imported file cannot bring unknown windows, bad numbers or reserved object names.
  • Analytics: Treasury curve spreads and butterflies in basis points with history percentile and inversion date (analytics/curve.py); longest winning and losing run in trade metrics and the journal; exposure by currency and country.
  • Tests for code that had none: VWAP and POV algos, monthly bars, movers, the yield-curve route, CSV / Parquet bar import, risk metrics and stress, the Markdown renderer behind the PDF export. New guards: the suite fails when docs/API.md and the routes differ, when SQL is assembled in a place that was not reviewed, and when a route that changes trading state needs only a session.
  • Fixed: stress-window contributions used the wrong rows; a ; in an SQL comment broke the schema rebuild; a pipe inside inline code split table cells in the PDF renderer; the scanner measured liquidity events against the wrong trigger; a workspace file could name a window constructor.
  • Not built: Kagi, Point & Figure, logarithmic scale, drawing styles and locking, order-book replay, webhook delivery, trading hotkeys. Not run: dependency audit and dynamic scan (both need an install).

Workstation: order-flow detections, indicator registry, new chart types, more alert kinds

  • Order-flow model detections (microstructure/detections.py, GET /api/orderflow/{id}/detections, terminal ORDER FLOW → PULSE): iceberg-like refills, large near-touch levels pulled within seconds almost untraded (spoof-like), liquidity pull / stacking, stop-run candidates (break of the recent extreme on a volume burst that comes straight back), persistent liquidity zones and the largest level's share of visible size. Every event is labelled MODEL and carries the numbers that produced it: aggregated L2 and the tape show a pattern, never a participant's intent.
  • The defaults were set against live Binance books, not synthetic ones. Three false-alarm sources were removed on the way: "x times the median level" (a crypto book is full of dust; the yardstick is now the typical largest level), per-level bookkeeping (a quote following the price is not a pull plus a stack; depth is netted) and flicker (a change must hold for three seconds). On ten minutes of BTC/ETH/SOL the stream now carries a handful of events, not hundreds.
  • Activity bars (GET /api/orderflow/{id}/bars?kind=range|tick|volume, chart timeframes RANGE / TICK / VOLUME): bars that close on a price range, a number of prints or a traded volume, built from every recorded print, with buy / sell volume and delta. Without a size one is chosen for about 150 bars and stated.
  • Chart indicator registry (terminal/src/design/indicators.js, chart → ƒx INDICATORS): 24 indicators behind one interface - SMA, EMA, WMA, VWMA, HMA, Bollinger, Keltner, Donchian, Ichimoku, Parabolic SAR, Supertrend, session VWAP, RSI, Stochastic RSI, CCI, Williams %R, ROC, ADX / DI, Aroon, ATR, standard deviation, OBV, MFI, Chaikin Money Flow - each with bounded parameters, on the price pane or in a pane of its own. A new indicator is one register() call; the renderer draws series and knows no single indicator. The JavaScript reproduces the Python definitions used by the strategies and the alerts (tested against a Python-generated reference), so RSI, ATR and ADX agree everywhere.
  • Chart types Renko and Line Break (chart-series.js): series transforms in front of the unchanged renderer, built from bar closes (stated in the chart header), each brick keeping the time and volume of the bars behind it.
  • Alert kinds RSI, MA_CROSS (completed bars only), DELTA (order-flow imbalance), LARGE_PRINT and DETECTION (the model detections above and sweeps). Print and detection alerts keep a cursor: one event never fires the same alert twice. Schema 11 rebuilds the alert table with the longer kind list and keeps existing alerts.
  • Kagi, Point & Figure, logarithmic scale and order-book replay are not built yet; a deeper heatmap needs the venue's diff-depth stream. See docs/obsidian/03 Quant Research/SwiftTrade Feature Matrix.md.

Quant engine: factors, pods and the central allocator

  • Factor engine (quant/factors.py, GET /api/lab/factors, terminal STRATEGIES → FACTORS): cross-sectional z-scores for momentum (12-1), value (minus the 5-year return), trend, low volatility and short-term reversal; each factor's record (rank IC against the next month, t on non-overlapping months), every asset's score today, the adaptive mix and the factor book's exposure. Quality, carry and liquidity need data that does not exist for the universe: they are reported as not available, not approximated.
  • Factor strategies multi_factor (equal factor weights) and adaptive_multi_factor (weights from each factor's walk-forward rank IC with a 21-day embargo, shrunk half-way to equal; model: gbm for a monthly refitted boosted model). Long only, monthly, never levered, scaled down to a 10 % volatility ceiling.
  • Research universe `CRYPTO_2019`: the eleven large coins of September 2019 including the delisted EOS, so that long strategies are not flattered by today's winners. A delisted market stays in a universe up to its last day.
  • Pods (quant/pods.py, swifttrade pods, GET /api/lab/pods, POST /api/lab/pods/rebuild, terminal STRATEGIES → PODS): twelve strategy pods (momentum, mean reversion, statistical arbitrage, trend, factor, macro, event, volatility, cross asset, intraday, swing, position), each with its own stream after costs, statistics, performance per regime, correlation and validation status.
  • Central allocator: capital only for pods that passed every validation gate and that a spot account can execute; equal risk contributions, half budget at −7.5 % drawdown and none at −15 %, half budget for a pod that lost in the current regime, 35 % cap, scaled down to a 10 % volatility target. Capital deployed today: 0 %.
  • Stress regimes CORRELATION_BREAKDOWN and LIQUIDITY_STRESS (regimes/market_state.py): top 5 % of the measure's own last two years and at least twice its normal level. Shown and alerted only; they neither create nor block a trade.
  • Measured (BACKTEST, default parameters fixed in advance, 2020-2026): no strategy passes validation. On the 2019 coins: adaptive multi-factor Sharpe 0.93, hold-out 0.17, deflated Sharpe 0.047; its boosted variant Sharpe 1.53, hold-out 0.00, deflated Sharpe 0.229; mean reversion, pairs trading and PCA statistical arbitrage lose after costs (Sharpe −1.89, −0.30, −0.43). The pods momentum, trend, volatility and cross asset correlate 0.70 to 0.85: four ways of holding the same six markets. Details: docs/QUANT_ENGINE.md.
  • Fixed: a validation pass that depended on the order of evaluation. adaptive_multi_factor passed with a deflated Sharpe of 0.967 while three trials were on record and scores 0.047 against the complete list (0.888 even when the long/short strategies are left out). The trial pool no longer counts a re-run twice.
  • Fixed: the boosted factor model failed while a factor had no record yet (an empty value column).
  • Candidates of older code versions were retired (28, by the pipeline's own rule: evidence belongs to the code that produced it). Among them was the low-volatility risk parity candidate validated on 30 September on the research proxies. Re-registered unchanged, it fails the deflated Sharpe (0.011 at 109 trials) under the rule, introduced on 1 October, that counts every strategy tried on a universe. No candidate is at VALIDATED or beyond.

Day, swing and two-week position engine

  • Multi-timeframe engine (services/mtf.py, configs/mtf.yaml, terminal window STRATEGIES): eight setups on three horizons (day on 15-minute bars, swing and position on daily bars), market state per instrument and universe, evidence per setup, direction, market state and asset class, a news view that can veto but never trigger, an independent risk manager and trade management to the exit. Accepted ideas are shadow trades; no order is sent.
  • Evidence hurdle: at least 30 closed trades, a positive lower confidence bound, t ≥ 3 with trades clustered by entry week, expected value ≥ +0.10 R. Otherwise the answer is NO TRADE.
  • Study (swifttrade mtf study [--final]): walk-forward in six-month steps from July 2021, a hold-out year never loaded during development, cost sensitivity, parameter sensitivity, Monte Carlo on the trades.
  • Measured (BACKTEST, 13 bp per side, 2019-09 → 2026-10): every day setup loses after costs (−0.36 to −0.66 R per trade); swing breakout long is positive in the walk-forward (+0.34 R on 28 selected trades) with t = 2.9, below the hurdle; in the hold-out year the engine selected no trade, and swing breakout long would have made −0.04 R. No horizon has a proven edge. Details: docs/STRATEGIES.md.
  • Endpoints GET /api/mtf, POST /api/mtf/cycle, GET /api/mtf/trades, /api/mtf/decisions, /api/mtf/study, /api/mtf/evidence; schema version 10 (mtf_trades, mtf_decisions).

Spot strategies and stricter multiple-testing control

  • New Quant Lab strategies for spot accounts (long-only, never above 100 % invested, parameters fixed in advance from the literature): trend risk parity (Clare et al. 2016: inverse-volatility shares times a 1/3/6/12-month trend score, the rest in cash) and dual momentum (Antonacci; Keller's 13612W score, top 3 with a positive score). Both are scaled down - never up - to a 10 % volatility ceiling and trade only on their schedule.
  • Measured on the Bitget universe (BACKTEST, 2020-2026, spot execution): trend risk parity Sharpe 1.09, max drawdown −18 %, hold-out Sharpe 1.27; dual momentum Sharpe 0.89, max drawdown −15 %. Both fail the deflated Sharpe (0.85 and 0.64 < 0.95) and are not validated.
  • The deflated Sharpe now counts the trials of every strategy tried on the same universe, not only those of the strategy itself - trying many strategies on the same data is multiple testing too.
  • Backtests and candidates can use a spot execution model (max_gross: 1, long_only: true): console *Account* selector and a *bitget spot* universe preset (Backtest and Pipeline tabs; GET /api/lab/universe → presets).
  • Research log: neither perpetual funding nor the volatility risk premium predicts next-week BTC / ETH / SOL returns (|t| < 1.5, signs changing between halves); no strategy built on them.

Bitget: data, broker and the paper week

  • Bitget market data (public, no key): instruments, daily and intraday candles and a polled top-of-book feed for spot crypto (BTC, ETH, SOL), gold tokens (PAXG, XAUT) and the Reality stock tokens RQQQ (Nasdaq-100 ETF) and RSPY (S&P 500 ETF). swifttrade serve --bitget / swifttrade bot run --bitget.
  • Bitget broker (broker.name: bitget): Unified Trading Account API v3, signed requests, idempotent client order ids, orders with an unknown result looked up instead of re-sent, fees booked exactly once. Demo trading (virtual funds) is the default; production needs broker.live: true and the three live switches. Arming live refuses an API key that can withdraw funds or cannot trade. Connections: *Bitget (demo)* and *Bitget* with the passphrase field.
  • Quant Lab ↔ bot: the new bot strategy lab_portfolio runs a Quant Lab portfolio strategy on the bot's bars and hands over its target weights; sizing.method: strategy_weights keeps them (per-asset cap and gross limit only). The pipeline status travels in every signal's rationale.
  • Paper week: configs/bot.bitget.yaml (equal risk contribution on BTC, ETH, SOL, PAXG, RQQQ, RSPY; paper broker filled against Bitget's live book) and scripts/start-bitget-paper.ps1 (own data folder, live trading impossible in that process). paper.resume_book: true continues the paper book across restarts by replaying the stored fills, so a test that runs for days survives a sleeping laptop. paths.bot_config selects a bot profile.
  • Quant Lab assets SOL, GOLD (PAXG), QQQ (RQQQ) and SPY (RSPY) - the Bitget-tradeable universe.
  • Measured (BACKTEST, UTC-day data 2020-08-31 → 2026-09-29): equal risk contribution Sharpe 1.20, CAGR 11.4 %, volatility 9.4 %, max drawdown −16.4 %; it passes every validation gate except PBO (0.74, limit 0.5) and is therefore not validated. No strategy on this universe passes all gates (on the misaligned 16:00-UTC data PBO read 0.53 - the alignment fix made the verdict clearer, not better).
  • Fixed: markets that trade on weekends lost their weekend in the lab's business-day returns (crypto: 2 of 7 days); the level is now sampled on business days first. The stock tokens, which trade thinly on some weekend days, are sampled the same way (calendar: extended).
  • Fixed: Bitget's own daily candles run 16:00 → 16:00 UTC (midnight UTC+8): crypto was sampled eight hours away from the research data (Binance, UTC days) and the stock tokens' US session was cut in half at noon New York time. Daily bars from Bitget are now UTC days built from 4-hour candles (BTC closes match Binance within 0.4 bp median, 2.2 bp max). The research series carry the new convention in their name (…:1d@utc), so a refresh never appends it to the old history; the old series stay for audit.
  • Fixed: Bitget history pages dropped the candle on every 90-day boundary (found in real data); windows now overlap.
  • Fixed: swifttrade bot run --binance/--bitget set the feed switch after the settings were loaded, so it never took effect; --once also started the bot loop and ran two cycles; bot run gained --no-sim.
  • Fixed: with an order still working, the bot could send a tiny top-up order (0.23 USDT in the first Bitget run) - below the venue's minimum order value. Changes below the no-trade band (working orders included) or below the venue minimum are no longer sent.
  • execution.stop_loss_atr: 0 turns protective stops off for portfolio strategies - only together with require_stop_loss: false; otherwise entries are skipped (fail closed).

Quant Lab strategy pipeline

  • Strategies now move BACKTEST → VALIDATED → PAPER → MONITORED → APPROVED → LIVE CANDIDATE and never skip a stage. Validation gates (walk-forward, positive folds, PBO, deflated Sharpe, final-30 % hold-out, 3× cost + 2-day delay stress, drawdown, history length) are frozen per candidate and fail closed when a metric is missing.
  • Forward shadow track: starts after the newest observation of any asset, records a day only once every series has published it and never rewrites it; checked against the stationary-bootstrap band of the candidate's own backtest. Leaving the band withdraws an approval. Updated daily while a candidate is being tracked.
  • 4-eyes approval by a signed-in person other than the creator and the paper operator; LIVE CANDIDATE is documentation only (no order path). A code change retires the candidate automatically. Every stage change is logged with actor, reason and evidence, and journaled. New console tab *Quant Lab → Pipeline*; API /api/lab/pipeline*.
  • Terminal window STRATEGY LAB (command palette or the wheel, S-LAB): the pipeline with gates, forward track and stage history, portfolio backtests with stress and Monte Carlo, and the research log - the same /api/lab/* data as the web console, inside the desktop app's main interface.
  • Fixed: each robustness run re-recorded all earlier trials, so the deflated Sharpe's trial pool grew with every run. Runs now record only their own trials and identical re-runs count once.

Options ↔ price

  • New analysis of the options market's implied volatility (Deribit DVOL) against BTC / ETH, point in time: same-day spot-vol correlation with its stability, the volatility risk premium against the volatility that followed (Newey-West), and implied volatility as a forecast versus the naive trailing volatility. Discovery tab card, GET /api/lab/options/{BTC|ETH}, an OPTIONS → asset edge in the intelligence graph and in the AI tool get_options_data. Measured: BTC implied volatility rises when the price falls (r −0.27) and averaged 8.5 points above the realised volatility of the next 30 days (HISTORICAL, 2021-2026).
  • Quant Lab tabs are addressable (/lab/#pipeline, #discovery, …) - deep links, and every tab passes the accessibility audit in both themes.
  • The terminal's STRATEGY LAB has a RESEARCH tab: options ↔ price (BTC / ETH) and the event study with its CAR path and placebo band.

Event-study and Monte Carlo charts

  • The event study (GET /api/lab/event-study) also returns the day-by-day path of the mean cumulative abnormal return with its 95 % interval and the 5-95 % band random dates produce (placebo); the Quant Lab draws it, so "is this unusual compared with ordinary days?" is visible at a glance.
  • Monte Carlo shows the fan of simulated paths (median, 25-75 %, 5-95 %) in the web console and in the terminal's STRATEGY LAB, next to the distribution of the horizon return.

Quant Lab optimisers and strategy versions

  • Fixed: the minimum-variance optimiser ignored its per-asset cap in effect (it shrank the book to 50 % and then renormalised, so a 40 % cap became 80 %). Results change honestly: Sharpe 0.38 → 0.35, volatility 1.9 % → 3.4 %, max drawdown −10.6 % → −16.7 % (BACKTEST 1999-2026); regime switching, which uses it, changes too.
  • Minimum variance and maximum diversification solve the long-only problem with exact gradients: 45 s → 2.3 s and 10 s → 2.9 s per 27-year backtest; regime switching 43 s → 2.3 s. Maximum diversification's weights are unchanged.
  • A strategy's version now covers what its numbers depend on (the strategies it calls, the shared maths modules), not only its own class; comments and docstrings do not count. The first new versions retire older pipeline candidates.

Quantitative edges in the intelligence graph

  • The INTEL GRAPH draws STATISTICAL edges: topic → asset event studies (t-test and placebo must agree, Benjamini-Hochberg, at least 20 event days over 3 months) and the asset relations the relationship scan validated. Each edge carries its sample, estimate, interval, q-value, period and Quant Lab experiment; only passing edges are drawn, the rest are counted in the graph footer. API GET /api/lab/edges, POST /api/lab/edges/rebuild; rebuilt weekly. With today's short news history every event-study edge is honestly "insufficient data".

Order-flow heatmap and Bookmap

  • The liquidity heatmaps now use a time axis: columns are as wide as the time a book snapshot was current, trades and candles sit at their own time, and gaps without data stay empty. Before, columns were placed by snapshot count while trades were placed by time, so the two drifted apart whenever snapshots arrived irregularly.
  • The price window follows the whole visible path plus the current book. Before, it was taken from the newest book only, so after a move most of the history (and the price line) was cut off and the panel looked empty on the left.
  • Price labels on "nice" steps without a leading tick that read like a minus sign, a time axis (−30 s … now), legends above the axis; geometry in terminal/src/design/heatmap-geom.js with tests (npm --prefix terminal test).

Quant Lab and the AI gateway (docs/QUANTLAB.md)

  • Cross-asset research data: FRED (Nasdaq, S&P 500, Nikkei, Treasury yields, 3-month bills, Brent, Henry Hub, EUR/GBP/JPY/CHF) and Binance (BTC, ETH), point-in-time with per-series publication delays, versioned datasets, and a quality gate that excludes unusable series with the reason. Treasury returns are ESTIMATED excess returns over bills.
  • Mathematics engine (swifttrade.quant): linear algebra (covariance estimators, PSD repair, eigen, PCA, factor models), calculus (derivatives, gradients, Hessians, integration, parameter sensitivity), probability (fat-tail fits, Bayesian updating), statistics (HAC regression, stationarity, autocorrelation, bootstrap, FDR), time series (AR/ARIMA checked against a naive forecast, cointegration, half-life, Hurst, variance ratio, causal and Markov regimes), portfolio mathematics (risk contributions, optimisers, volatility targeting, neutrality), event studies, scenarios.
  • 18 modular strategies with a common interface and code-hash versions - including a low-volatility cross-asset risk parity engine studied from QuantConnect strategy 233 (own implementation) - and a test that proves none of them can see the future.
  • Portfolio backtester: publication-lagged inputs, drifting weights, per-asset costs, delays, liquidity caps, missing-price handling, leverage limits; walk-forward, CPCV, PBO, deflated Sharpe, IS/OOS rank, cost/delay stress.
  • Validated discovery: relationship, cointegration, seasonality and persistence scans with FDR control, out-of-sample confirmation, cost-aware trading tests and market-close timing (asynchronous "leads" are not called tradeable).
  • Stress & Monte Carlo for backtest portfolios; research memory with strategy versions and every experiment.
  • AI gateway: local Qwen (llama.cpp, Qwen3.8-27B 3-bit with Qwen3-8B fallback), optional remote provider, 17 schema-validated research tools (none can trade), and a check that flags every number in an answer that no tool calculated. Research questions run in the research worker.
  • Console: Quant Lab (/lab/): backtest, robustness, risk & correlation (heatmap, PCA, optimisers, regimes), discovery, AI assistant, research log, data quality.
  • One environment configuration: swifttrade/env.py registry + .env.example in the SwiftTrade groups; .env loading (never the live-trading switch), aliases, off-only feature flags, validation in doctor and at start.

Release hardening (docs/OPERATIONS.md)

  • Order safety: idempotent order submission (Idempotency-Key; a retry never places a second order, a reused key for a different order is refused, a concurrent duplicate gets 409); order-flow controls before the risk engine - orders per minute (global and per origin), trading sessions per asset class (time-zone and DST aware), maximum open positions, per-strategy daily volume on the risk-approved quantity (configs/risk.yaml → orders). The risk engine's own reducing orders are exempt.
  • Kill switch survives restarts: the last level of each mode is restored from the risk-event log at start - a crash or reboot never re-enables trading.
  • Emergency stop (POST /api/risk/emergency-stop, console Risk page with confirmation): HALT, cancel working orders and algos, bot OFF, CRITICAL alert, notification to administrators and traders, audit entry; positions are not closed and the response says so.
  • Watchdog for API, database, market data, live broker, trading engine, intelligence, housekeeping, research worker and resources (GET /api/health/watchdog); the LIVE preflight fails closed on critical infrastructure, and in LIVE only real, fresh market data counts as healthy. Self-healing only for the research worker and the intelligence task; the trading bot is never restarted automatically.
  • Security monitoring: brute force, credential stuffing, privilege escalation, authorization probing, scanning, malformed requests, error bursts, traffic spikes, order floods and repeated broker-credential failures are recorded (security_events), alerted to administrators, and - for the sign-in endpoints only - blocked for 15 minutes.
  • Logging: one rotating JSON-lines file per category (APPLICATION, SECURITY, AUDIT, TRADING, SYSTEM, ANALYTICS) under data/logs/, a request id (X-Request-ID) and user id on every line, and a redaction filter so passwords, tokens, keys and private keys never reach any log. Admin log search (GET /api/admin/logs).
  • Retention job (hourly): security events, idempotency keys, rotated log files; portfolio snapshots are thinned. The audit log, orders, fills, accounts, consent and legal records are never touched.
  • Portfolio history: one snapshot per minute per mode; performance for today / week / month / year / all / custom (equity curve, drawdown, return, realized/unrealized, Sharpe/Sortino from daily returns) and exposure by asset class, sector and origin. Console page *Performance*.
  • Cookie & storage consent: banner with equal-weight *Reject optional* / *Accept all*, settings and withdrawal on /cookies/, choices recorded in consent_records. Website analytics are now opt-in (the server stores nothing without consent: true); functional storage (the dashboard's equity trail) follows the functional category; marketing is not used.
  • Legal records: document versions (content hash), acceptances recorded at registration and on the account page, outdated versions refused (/api/public/legal, /api/me/legal). The software still ships no legal text of its own.
  • Admin console: watchdog, security, trading operations (orders by status, rejections by reason, kill-switch history, broker), log search, retention and consent sections.
  • Database schema 9 (009_release.sql: order_idempotency, security_events, consent_records, legal_acceptances, portfolio_snapshots).

Quant AI - the research plane (docs/QUANTAI.md)

  • A research system with governance: data → validation → point-in-time features → frozen hypothesis cards → one validation protocol → verdict → model registry. It never places orders; its strongest action is VALIDATION.
  • Its own research store (data/research.sqlite) with a hash-chained journal, a persistent job queue that survives restarts, and a research worker that the API server starts as a separate process without broker credentials.
  • Public, keyless research data with licences and point-in-time stamps: Binance spot klines (daily and 30-minute), USD-M funding, premium index and open interest (read only), Deribit DVOL; Coin Metrics community data off by default (non-commercial licence). Content-addressed dataset versions with a validation report; invalid versions are never used.
  • 22 causal features and seven strategy templates grounded in the literature (volatility-targeted trend, regime trend, intraday momentum, order-flow filter, funding crowding, funding carry as research only, MVRV cap).
  • The protocol: vectorised screening with costs, walk-forward, CPCV, PBO, deflated Sharpe over all trials of a family, Hansen's SPA test, doubled/tripled costs, seven real crypto stress windows, parameter stability, Monte-Carlo drawdown, regime split - and 11 gates fixed before any result. The first 16 hypotheses on 2020-2026 data all failed at least one gate.
  • arXiv literature scan (metadata and abstracts) with optional local-model summaries that must quote the abstract verbatim.
  • The QUANT AI terminal window, a Quant AI page in the web console (/quant/, command QAI), /api/qai/*, swifttrade qai … and swifttrade qai-worker; isolation and known-answer tests (noise must fail, a planted edge must be found, no feature may see the future).
  • The bridge to the paper bot: templates F1, F2 and F4 as platform strategies (qai_*) that compute the same vote as research on the bot's bars (tested bar by bar) and are sized by the platform allocator; deploying one needs its card in VALIDATION - a rejected candidate never trades, not even on paper.

Information → market

  • Intelligence events on the price chart: a marker at the time the market could first know each event (colour by direction, square for official sources, a guide line for HIGH impact), a tooltip with source count, confidence and the measured reaction on that instrument, and a click opens the event's relationship graph. GET /api/intel/chart-events/{instrument_id}; toggle and minimum impact in the chart settings.
  • Intel Analytics: price, bucket return and realised volatility of any instrument on the same time grid as news volume, sentiment and new events (PRICE vs NEWS, REALISED VOLATILITY vs SENTIMENT, BUCKET RETURN vs NEW EVENTS), from Binance klines, the recorded tape or daily bars - the source is named on the card. GET /api/intel/market-overlay/{id}.

Research brief

  • Three more sections on every instrument page, each item labelled with its basis: the Quant AI's hypotheses and verdicts for the instrument, the market reactions measured after its recent events (with the direction hit rate and a "reaction is not proof of cause" note), and its place in the book (position, weight against the limit, risk level, VaR/CVaR, drawdown). The summary states how many hypotheses survived the protocol.

Alerts

  • Condition alerts next to price alerts: price move over a window, volume spike against the recent average, realised volatility, and new intelligence events above an impact level. Checked every 5 s on the recorded tape (never on a partial window), fire once or repeat after a cooldown, and go through the same alert stream and audit trail.

Search

  • Ctrl+K also finds countries, cities, seas and regions (opens the intelligence map there), Quant AI hypotheses (opens their report) and condition alerts.

SwiftTrade Workstation - the native desktop product

  • Decision recorded: the desktop product is the native C++23/Qt 6 workstation (ADR 0001); the Electron app continues for 1.x with fixes only.
  • A docking workspace: 21 panel types that open, close, tab, split and tear off into their own windows; several charts, order books and tapes at once; six presets and named workspaces that restore what every panel showed.
  • Light, dark and follow-system themes from the SwiftTrade brand palettes, switchable live; chart colours stay readable in both.
  • Order book (the venue's top-20 depth every 100 ms, grouping, spread, imbalance, stale detection) and time & sales.
  • Global search (Ctrl+K): instruments, panels, commands, strategies, indicators, and from the platform countries, places, topics and news.
  • Connection to the platform: desktop sign-in with PKCE in the browser (the password never enters the workstation), refresh token in the OS credential store; the installer ships the platform engine and the workstation starts it on 127.0.0.1 (or attaches to one already running) and stops it on exit.
  • Native intelligence desk (facts, analysis and speculation kept apart, every source listed), conflict monitor, economic calendar, a Natural Earth world map with located events, clusters and conflict zones, and local price alerts with desktop notifications.
  • Six new strategies: z-score reversion, VWAP deviation reversion, VWAP trend confirmation, opening-range breakout, volatility-regime trend (volatility-targeted) and beta-hedged residual momentum; SMA and ADX options for the moving-average crossover. Twelve strategies in total, each with a transparency sheet and tests.
  • Risk: a correlated-exposure limit (positions whose returns correlate above a threshold count together; hedges net out).
  • Windows installer: per-user, no administrator rights, Qt and MSVC runtimes included, the platform engine as a component; silent install, installed self-check and silent uninstall verified.
  • --smoke-test and --screenshot self-checks (--chart, --timeframe, --theme, --preset); a Qt test suite including an end-to-end desktop sign-in.
  • Charts: drag the price axis to scale prices (the wheel over it too) and the time axis to scale time; A (auto-scale) and L (log) buttons; a hand-scaled axis pans vertically; double-click fits the chart, the price axis returns to auto-scale, a note opens for editing; Alt+R / Alt+A / Alt+L, PgUp/PgDn, Ctrl+arrows. Chart templates: save the type, scale, volume, grid and indicators under a name, apply them to any chart, pick one as the default for new charts. Candles and volume are drawn in a few batched calls and aggregated per pixel column when zoomed out (100 000 bars in a few milliseconds per frame).
  • Market regime: trend (up, down, range, transition, with a 3-bar confirmation) and volatility regime per bar, from ADX/DI, SMA, the efficiency ratio and the rank of realised volatility - causal and explained with the numbers that decided it; as the Market Regime chart indicator and swifttrade-cli regime, which also reports what followed each regime in the history (not a forecast).
  • Settings: where the SwiftTrade platform is - the engine on this computer (with its port), a SwiftTrade server (https) or off - without editing config.json.
  • News on the chart: events the intelligence desk linked to the instrument appear on the bar during which the market could first know them - verification, the desk's directional reading, surprise versus expectation, the market reaction the platform measured and the move on the chart; busy bars group into "+N"; a click opens the dossier.

Quant lab

  • Volatility models: GARCH(1,1) and GJR-GARCH(1,1) by quasi-maximum likelihood with a leverage test (likelihood ratio and BIC), forecast term structure, news-impact curve and conditional volatility (GET /api/quant/garch/{id}).
  • Hierarchical risk parity as an allocator (sizing, walk-forward allocator comparison) and a portfolio view comparing HRP, risk parity, minimum variance and inverse volatility with risk contributions, the cluster-ordered correlation matrix and the out-of-sample comparison (GET /api/quant/portfolio).
  • Probability of backtest overfitting (CSCV) in every walk-forward over a parameter grid, and a lab job that runs a walk-forward over a grid around a strategy's defaults in the background with progress (POST /api/quant/overfitting).
  • Order-flow toxicity: VPIN over equal-volume buckets and the Hawkes branching ratio of trade arrivals, with a likelihood-ratio test against Poisson (GET /api/orderflow/{id}/toxicity; TOXICITY tab in ORDER FLOW).
  • Terminal panel QUANT LAB (volatility, portfolio, overfitting). Every model is tested against data with a known answer.

Market data

  • Google Finance (quote, key statistics, company profile, news, price graph) through the Apify actor johnvc/google-finance-api - there is no official Google Finance API. Fetched only on demand, cached, and capped per day (fails closed at the cap); the token is read from APIFY_API_TOKEN and sent only in a header; simulated instruments are never mapped to real listings. Terminal panel GOOGLE FINANCE. Labelled as third-party, delayed and informational.

Intelligence: OSINT sources, graph, timeline and analytics

  • New public sources, each checked against its robots.txt: US Treasury OFAC and UK OFSI sanctions notices, Bank of Canada, Reserve Bank of Australia and Bank of Japan releases, US EIA (Today in Energy, press), UN press, ReliefWeb disasters, UK NCSC advisories, US NGA maritime navigational warnings, DefiLlama crypto exploits, ransomware.live group claims (victim names only; leak sites are never fetched or linked), and GDELT queries for protests, elections, sanctions, commodities, shipping, aviation, company events and cyber incidents. Media and social feeds ship switched off until the operator has checked their terms; sources whose robots.txt disallows automated access are listed and not used.
  • Data feeds that publish records instead of articles (json_api with templates, sort, records: true) give every record its own link, and records are never merged into one event however alike their templated headlines are.
  • The intelligence graph (GET /api/intel/graph; terminal panel INTEL GRAPH, workstation panel Intel graph, Ctrl+Shift+G): Event -> Source -> Entity -> Asset / sector -> Market reaction, for the top events of a window or one event with its chronology. Places and companies the reporting names, the topic rule that fired, a country's currency, the reviewed topic -> market reference mapping (dashed, "not a forecast") and the reactions the platform measured; every edge says why it exists. Wheel zoom and drag in graph and timeline.
  • Intelligence analytics (GET /api/intel/analytics; terminal panel INTEL ANALYTICS, workstation panel Intel analytics; both side by side in the new Intel analysis workspace of the workstation and the terminal): news volume, sentiment, event frequency by topic, impact, measured market reaction, volatility before and after events, reaction by event type, impact score against abnormal return, and the most active sources, per time bucket and filterable by topic or asset.

Terminal

  • Footprint chart zoom: the wheel sets how many bars are in view (zooming out loads up to 500 bars of history), the price axis or Ctrl/Alt+wheel the price range, Shift+wheel scrolls back, dragging pans, double-click resets. Zooming the price in on AUTO rows asks for finer rows (down to one tick) - real traded volume at each finer price. Row size can be fixed (1-100 ticks); far out, each row becomes one net-flow cell. The server coarsens a request that would exceed the footprint's cell budget and says so.

Signed releases

  • One command on the release machine, scripts\release\release.ps1: prerequisites and certificate check, version, platform tests, front ends, engine, workstation build and ctest, signed packaging, signature verification, a secret scan of the package, silent install with installed signatures and self-check, silent uninstall, and publication with --require-signed. A report and a log per step stay in workstation\build\release-out\<version>.
  • Code signing (docs/CODE_SIGNING.md): SwiftTrade's own binaries, the uninstaller and the installer are Authenticode-signed (SHA-256, RFC 3161 timestamp) with a certificate from the Windows certificate store (USB token, cloud HSM), a .pfx kept outside the repository (password DPAPI-encrypted for the Windows user) or a signtool /dlib service. The certificate never reaches the repository, CMake or the logs.
  • The installer carries version and publisher information; the ZIP now holds exactly the installer's components (it used to include QtKeychain's development files), and the example plugin is in both.
  • The download page lists the workstation and the 1.x app side by side; publishing one keeps the other.

Platform

  • GET /api/intel/events?reactions=true adds the market reactions measured after each event.

Fixed

  • After an update the browser (and the desktop app's window) could keep showing the previous terminal: the pages were served without a Cache-Control header, so an old index.html pointing at the previous build was reused. HTML is now revalidated on every load (no-cache + ETag) and hashed asset files are cached as immutable.
  • The paper bot sent orders for instruments without a live quote right after start (the risk engine rejected each one and raised an alert per order); it now waits for the first quote and logs one WAITING_FOR_QUOTES event per cycle.
  • The ADF test in pairs/stat-arb strategies asks statsmodels for its tuple result explicitly (statsmodels 0.16 changes the default return type).
  • Charts: the volume pane followed the logarithmic price scale; the toolbar's Log and chart-type controls did not follow the chart's own menu; drawing-tool buttons stayed pressed after the drawing was placed; a text note always read "note"; the Fit tooltip promised a double-click that did nothing.
  • Charts of long ranges ended in the past: Binance history now pages through the venue's 1000-bar limit.
  • The bar that is still forming was marked closed (backtests and stored history could use it); it is now incomplete until its period ends, for Binance and Alpaca.
  • The data-status badge showed DISCONNECTED while data was streaming (reference sources and unconfigured providers were counted as streams, and every message marked every provider fresh).
  • Geotagging: a US state or other province is no longer placed at a small town of the same name ("Florida" went to Uruguay); big cities still win ("New York").
  • The platform engine no longer creates a folder inside its read-only installation.
  • Terminal: after the window had been narrower than 900 px (stacked layout), windows reopened as flat strips; the stacked column is no longer measured as the workspace, and a window whose saved box no longer fits opens at its default size.
  • Intelligence: a past event named as background ("the largest penalty since Russia's 2022 invasion") is no longer read as a new military escalation; a "sanctions breach" is no longer a hack, and houses collapsing in a flood are no longer a bankruptcy.

Platform

  • Broker adapters answer to one interface - connect, disconnect, get_account, get_positions, get_orders, place_order, cancel_order, modify_order; paper trading modifies by cancel/replace, a venue without the capability says so.

Documentation

  • New: ARCHITECTURE.md (product level), ALGORITHMS.md and API.md (their catalogues generated from the code), and a developer SETUP.md from installation to production; the platform's design moved to PLATFORM_DESIGN.md and the setup wizard guide to FIRST_RUN.md.

1.0.0 — 2026-09-27

The first release: the website, the web terminal, the server and the desktop app — which runs SwiftTrade on your computer without anything else installed.

Desktop — SwiftTrade on your computer

  • The installer contains the engine and its own private Python: no Python, Node.js, terminal or server needed. With no server chosen, the app starts it on 127.0.0.1, prepares the local database on the first launch, keeps the data in %APPDATA%\SwiftTrade and stops it cleanly on quit (also if the app is ended abruptly).
  • Windows downloads: the installer and a .zip (no installation). No single-file portable .exe — with the engine inside it would unpack ~700 MB to a temporary folder on every start.
  • A starting screen with live status; a first-launch setup wizard (Welcome, Account, Theme, Market data, Broker, Trading preferences, Market intelligence, Complete — every step skippable) and a setup guide (/guide/, Help menu).
  • View → Theme (Light / Dark / System); the window and title bar follow the page's theme with no flash on start.
  • Help: setup guide, run the wizard again, open the data folder; About shows the engine and Python version.
  • "Connect to a server instead…" / "Run on this computer" on the connect screen.

Themes

  • Light, Dark and System everywhere — website, console, terminal, desktop app — from one stored choice, applied before the first paint. Two designed themes (a research workstation in light, a long-session workstation in dark) on one set of semantic colour tokens; charts, canvases, order books, the globe and the 3D terminal on the home page follow the theme, with light-theme product captures of the real terminal.

Intelligence map and Intelligence Desk

  • A vector map of Natural Earth that zooms from the world to a city: wheel and trackpad-pinch zoom toward the pointer, touch pinch, drag with inertia, double-click, + − ⌂ ◎ ⤢ controls and keyboard; smooth fly-to camera; search for countries, provinces, cities, seas and straits, ports, airports, topics and events.
  • Server-side clustering by zoom, category-shaped markers (filled = reported/confirmed, hollow = single source, dashed ring = country-level location), conflict zones by reporting volume, 36 layers in four groups; reference layers from real datasets only, the rest say "no dataset" and accept an operator dataset with a stated source.
  • The Intelligence Desk: Live, Geopolitics, Conflicts, Markets, Economy, Military, Energy, Infrastructure, Natural events and Watchlist; every item with time, place, category, verification, sources, impact and confidence; FACT / ANALYSIS / SPECULATION kept apart with their basis; all sources with publication, time, link, category and reliability; timeline, related events, potential market relevance (labelled as a reference mapping) and measured reactions; a conflict monitor; an intelligence watchlist; configurable, rate-limited alerts. LIVE only while sources answer.
  • New open and official sources: USGS earthquakes, NASA EONET, GDACS, UN News, ReliefWeb and GDELT queries; major media feeds listed but off until their terms are checked. Hazard feeds' own coordinates locate their events.
  • Optional Google base maps with an operator-configured, referrer-restricted key (not tested without a key).

Brand and terminal

  • One brand source (web-next/lib/brand-mark.mjs): the crowned W on its tile, legible at 16 px, used for the terminal, website, favicon, app icons, installer icon and the desktop app's own screens.
  • Terminal top bar: brand · workspace · search · status · alerts · settings · account.
  • A "CONNECTION LOST" banner says the screen is frozen and blocks new orders until the stream is back; orders ask for confirmation by default (can be turned off).

Website

  • The story of SwiftTrade and its founder, from the first idea to the terminal, with dark and light themes.
  • The terminal shown in 3D and as real product captures; a live window onto this server's data, labelled by source (live venue data or the built-in simulator).
  • Security & connectivity section; download page listing only builds that exist, with size, date and SHA-256.
  • Accounts: registration with e-mail verification, sign-in, two-factor sign-in, password reset, sessions, API tokens.
  • Settings: broker connections (Binance Spot — testnet or live), verified with the exchange before they are saved.
  • Accessibility: WCAG AA text contrast in dark and light, one heading outline per page, landmarks and labelled fields (checked by web-next/scripts/a11y-audit.mjs).
  • Faster first load: the 3D scene's code loads only near its section, fonts trimmed to the Latin subset, the home page asks the server for a count instead of 200 records (phone profile: LCP 3.8 s → 2.0 s, 2.0 MB → 1.1 MB).

Terminal

  • Floating-window workstation with charting, order flow, trading desk, research, intelligence and markets panels — 47 panels and 18 desk layouts.
  • Research brief: type an instrument or a topic ("AAPL", "Bitcoin", "EUR/USD", "US inflation", "NVDA earnings") and get market data, measured history, technical context, the co-pilot's notes, options (model), related events and the economic calendar — every line labelled FACT, ANALYSIS or SPECULATION with its basis. No language model writes it.
  • Saved workspaces: name the current arrangement and reopen it; synced to your account when signed in (web and desktop), otherwise kept on the device.
  • Bracket orders: attach a stop-loss and/or take-profit to a market or limit entry. Both exits are reduce-only, sized to what actually fills, and one cancels the other; cancelling a bracket never closes a position by itself.
  • Command bar: "Research brief" for any text, a Research action on every symbol, saved workspaces in the results.
  • Windows fit any screen size; panel headers no longer clip their metadata; a stacked layout on phones and narrow tablets.
  • AA contrast for secondary text, the heatmap and source tags; landmarks and labelled controls for screen readers.

Server

  • Accounts and sessions with CSRF protection, rotating refresh tokens, lockout, roles and per-IP rate limits.
  • Broker connections: keys encrypted with AES-256-GCM, bound to their owner, never returned to the browser; keys that can withdraw are refused for live accounts; every change audited. Planned brokers (Interactive Brokers, Alpaca, Kraken, Coinbase Advanced, OANDA) are listed as "coming soon" and cannot be connected.
  • Research brief API (/api/research/brief), experiment count endpoint.
  • Risk engine: the fat-finger price band now applies to marketable limits only; a passive limit far from the market (for example a take-profit) is no longer refused.
  • Production mode refuses to start without its secrets; API docs are off in production.
  • /downloads/ serves releases published while the server runs.

Desktop

  • Windows installer (SwiftTrade-Setup-1.0.0-x64.exe: per-user, Start-menu and desktop shortcuts, sign-in link, uninstaller), portable SwiftTrade-Portable-1.0.0-x64.exe and a .zip. Tested end to end: install, run, restart, uninstall.
  • Connects to your SwiftTrade server, sign-in through the browser, tray with the bot state and an emergency stop, update checks against your server's feed (latest.yml published with every release).
  • The portable build leaves the system's swifttrade:// link alone and signs in through a loopback callback.
  • Hardened: developer tools off in packaged builds, Electron fuses (including no extra file:// privileges), https-only server and update addresses; --smoke-test launch check.

Operations

  • Docker image, Docker Compose with Caddy (automatic HTTPS), backups, restore and monitoring documented in DEPLOYMENT.md; CI and tag-based release workflows.

Fixed

  • The engine used defusedxml without declaring it (a clean install would fail to start); it is declared now.
  • Window buttons overlapped panel titles in the expanded density; the layout menu could open behind the windows; emoji-style glyphs rendered as coloured emoji on Windows; the website menu is a ⋮ button.
  • The 3D terminal on the home page could show a white screen; panel headers in the terminal clipped their text.
  • /downloads/ did not serve releases published after the server started; a macOS .zip would have been listed as Linux; pip install failed on case-sensitive file systems (README name); swifttrade doctor crashed on a piped Windows console; development e-mails could sort out of order.
  • The command bar could throw when closed within 30 ms of opening.
  • A portable run pointed the system's swifttrade:// link at a temporary folder.

Known limitations

  • Builds are not code-signed yet (Windows SmartScreen / macOS Gatekeeper warn); no MSIX without a certificate.
  • The Google Maps integration has not been tested against Google (no key available).
  • Map geography is Natural Earth 1:10m (region and city level); street level needs Google Maps.
  • English only; market timestamps in UTC.
  • macOS and Linux builds are configured (CI) but not built or tested for this release.
  • No listed-options market data: option chains and Greeks are a model on realised volatility.
  • The Binance connector is tested against a mock transport; try it on the testnet first.
  • Live trading is off by default and requires three separate switches.