Zaehid Hakim
Register Case 01 + 07

Case 01 + 07 Next.js · Express · Python · MT5 · SwiftUI Live, web and App Store 2024 to now

ForexAcuity

A forex analysis platform, web and iOS, fed live from MetaTrader 5.

Presenting problem
A price-action method needed its signals visible across six currency pairs at once, live, on desktop and phone, with a safe way to practise trades and review them afterwards.
Assessment
The signals are computed inside MetaTrader 5, a desktop trading terminal. The data has to leave MT5 and reach a browser and a phone within seconds. Replay has to show only bars that had closed at that moment, or practice results mean nothing.
Plan
An MT5 Expert Advisor feeds a Python bridge, then an Express API and WebSocket server on my VPS, then a Next.js dashboard. Supabase handles sign-in and the trade journal; Stripe takes the web lifetime plan. The native SwiftUI app adds live 2-minute charts, a practice simulator with live and replay modes, and a journal synced to the same backend.
Outcome
Web platform live at forexacuity.co.uk. iOS app on the App Store since 2 Sep 2026, now on version 1.4, with a lifetime in-app purchase. 175 unit tests cover the engine, journal, replay clock and chart maths.
ForexAcuity homepage: the headline 'Stop reacting. Start anticipating.', a waitlist form, an App Store badge, and the dashboard showing live EURUSD, GBPUSD and USDCAD charts.
forexacuity.co.uk · desktop
ForexAcuity iOS Charts tab with live 2-minute candle charts. ForexAcuity iOS Analysis tab showing the state of all six pairs.

iOS app · App Store screenshots

Case detail

How the data moves

MetaTrader 5 runs the Expert Advisor on the VPS. Each bar, it publishes the moving-average state for six pairs: EURUSD, GBPUSD, USDCAD, USDCHF, USDJPY and GBPJPY. A Python bridge passes those messages to the Express API, which keeps the latest state and broadcasts it over a plain WebSocket to every open dashboard and phone. A 2-minute bar is pushed about every three seconds while it forms, then once more when it closes.

When a client reconnects, it subscribes first, buffers what arrives, fetches history over REST, then flushes the buffer. A dropped connection heals without a gap in the chart.

The iOS app

The app is native SwiftUI, with five tabs: Charts, Analysis, Practice, Journal and Profile. It targets iOS 17 for the Swift Charts scrolling APIs.

  • Practice, live and replay. Replay plays back recorded market tapes. Everything it shows is derived from bars that had already closed at the replay clock, so rewinding is exact and nothing peeks ahead.
  • Journal. Practice and manual trades sync to the same Supabase backend as the web dashboard.
  • Purchases. A non-consumable lifetime membership through StoreKit. Account deletion is built in, as App Store review requires.
  • Tests. 175 Swift Testing unit tests over the engine, journal, replay clock, ribbon maths and chart time maths.

First approved on 1 Sep 2026 and released the next day. Version 1.4 has been live since 23 Sep.

Decisions worth recording

  • Plain WebSocket, not socket.io. One protocol for the browser and the phone, with fewer moving parts to debug on a single server.
  • Weekend gaps removed from charts. Bars plot evenly, as MT5 shows them. Labels and crosshairs map back to real time.
  • Display only. The platform shows context. It does not tell anyone to buy or sell, and the copy is written to keep it that way.
Back to the register