TradeWX Web Application
CX Markets — the futures-exchange arm of Cantor Fitzgerald — engaged INNOV8 in early 2016 to
design, architect, and develop TradeWX, a
realtime trading platform for weather-derivative futures. The accuweather project codename ties to the exchange’s
lineage: Cantor’s CX Markets traded weather futures, and AccuWeather was a data-feed and
forecasting partnership integral to the platform’s value chain.
The engagement shape
Five weeks, late January through late February 2016. INNOV8 brought a full product team — UX/design leadership, product strategy, frontend architecture, iOS, and Android — and ran end-to-end product delivery while CX’s backend team built the matching engine and ticker-server APIs in parallel. The directive was unambiguous: ship a responsive AngularJS single-page trading platform that could carry realtime market data without dropping ticks, accept order entry without dropping misclicks, and look credible on both a Bloomberg-terminal-replacement trading desk and a tablet-on-couch position-monitoring session.
Why AngularJS in early 2016
Five weeks isn’t the timeline where you adopt a framework still nailing down its API. AngularJS 1.5 — released February 2016, right as the project kicked off — was the production-grade choice: established two-way binding semantics, mature dependency-injection container, well-documented digest cycle, and a large enough ecosystem that pre-built charting and grid components existed off-the-shelf. Angular 2 wouldn’t ship until September 2016; React was rising but its enterprise ecosystem was still maturing for SPAs of this complexity. AngularJS gave the project a known-good base on which to layer the realtime-streaming, order-entry, and chart-rendering specifics the trading platform needed.
The component model AngularJS 1.5 introduced (.component() registration replacing the looser .directive() patterns
of earlier 1.x projects) gave the codebase predictable two-way binding without the scope-pollution that older Angular 1
projects struggled with. Coming online at the exact moment that API stabilized was a small piece of timing luck that
paid down maintenance cost from day one.
Realtime market data over WebSockets
The price-tick stream flowed over WebSockets. Sub-second cadence — every position the trader held, every quote on the order book, every market they were watching updated continuously while the session ran. Three architectural concerns drove the wiring:
- Connection lifecycle — the WebSocket layer wrapped reconnection logic, exponential backoff on network drops, and a heartbeat ping/pong so dead connections were detected within seconds (not minutes). Traders holding open positions couldn’t tolerate silent disconnect — the UI had to know it was stale and tell the operator.
- Backpressure + buffering — under bursty market conditions (a weather event landing during active trading hours), the tick rate spiked. The render layer batched updates to the next animation frame instead of rendering every tick synchronously; the matching engine’s outbound queue was always going to be deeper than the browser could ever paint, and pretending otherwise meant dropped frames.
- State reconciliation — the application held a local model of the order book + the trader’s positions. On WebSocket reconnect, the server sent a full snapshot, and the client reconciled the gap. The race condition between “snapshot arrived” and “live ticks resumed” was the architectural surface that needed the most careful handling; apply the snapshot wrong and the trader sees a stale book they think is current.
Order entry safety
A trading UI is the rare frontend where one accidental click can cost real money. The order-entry flow built in three layers of confirmation cost:
- Validation as the user typed — tick-size enforcement, position-limit checks, and contract-availability rules ran client-side before the submit button was even enabled. Most failure modes never reached the matching engine because the form wouldn’t let them.
- Explicit confirmation modal above a soft-warning threshold (configurable per market) — large orders surfaced a modal that summarized the trade in plain language before allowing submit. Misclicks on big tickets had to be impossible-or-recoverable.
- Final acknowledgment from the matching engine before the order showed as live in the position-management table. No optimistic “yes you ordered that” without the server’s confirmation hash.
Charting + market-data display
Realtime price charts, depth-of-book visualization, and historical-context overlays rendered via SVG-based charting libraries selected for tick-rate tolerance (60fps re-paints under streaming load). Position-management tables ran AngularJS’s two-way binding against the local market-data model so quotes updated in place without re-mounting rows — a meaningful performance win when the table holds twenty positions all flickering on every tick.
Build pipeline + styling
Webpack for module bundling + asset pipelining (still relatively new in early 2016 — most enterprise teams were
still on Grunt or Gulp). SCSS with component-scoped styling for the trading-desk UI’s dense information layout.
AngularJS 1.5’s new .component() model for predictable bindings, as covered above.
What shipped
A responsive AngularJS trading platform with realtime price-tick streaming over WebSockets, order entry with multi-layer validation, position management, market-data charting, and account flows. Five weeks from kickoff to ship. INNOV8 delivered the full product surface — design through deployment — and CX Markets’ backend team brought the matching engine and market-data plumbing online to meet it.
Technologies used
AngularJS, WebSockets, SCSS, Webpack.
Have something worth building together?
INNOV8 is currently focused on Phlip — but selectively open to the right next chapter. If the work here resonates with what you're trying to build, get in touch.
