Skip to content

A multi-broker trading desk with a strategy engine behind it

One console across Questrade and Interactive Brokers: unified positions, a backtested strategy engine, and automated execution with the risk controls wired in front of the order, not behind it.

Client
TradeSmart
Industry
Financial technology
Year
2026
A multi-broker trading desk with a strategy engine behind it

2 brokers

Questrade + IBKR behind one API

3 modes

backtest, paper and live share one codebase

Pre-trade

risk checks run before transmission

The challenge

Running capital across two brokers means two portals, two data models and two definitions of almost everything. Questrade and Interactive Brokers disagree on how a position is keyed, how partial fills are reported, how corporate actions land and how often you are allowed to ask. Neither is a real-time feed by default.

On top of that sat the hard part: the client wanted strategies to run unattended. Automated execution is easy to demo and unforgiving in production — a stale quote, a double-submitted order or a reconnect that silently drops a fill is the difference between a strategy and an incident.

What we built

We put a normalisation layer between the brokers and everything else. Each broker gets an adapter that owns its own OAuth refresh, rate-limit budget and reconnect behaviour, and emits a single canonical event stream — orders, fills, positions and cash — into TimescaleDB. Downstream, nothing knows or cares which venue a fill came from.

The strategy engine runs the same code in three modes against that stream: backtest over historical bars, paper against live prices, and live against real capital. A strategy that cannot be replayed bar-for-bar in backtest is not allowed to trade.

Execution sits behind a risk gate that evaluates before an order is transmitted, not after: per-symbol and portfolio exposure ceilings, a daily loss limit that flattens and halts, duplicate-intent detection keyed on an idempotency token, and a market-data staleness check that refuses to trade on a quote older than its threshold. Every fill is reconciled against the broker of record on a schedule, and any divergence pages a human rather than being quietly corrected.

The outcome

The desk shows one blended portfolio across both brokers, strategies move from backtest to paper to live without a rewrite, and every automated order carries an audit trail from the signal that produced it to the fill that closed it.

Stack

Laravel 13 PHP 8.4 Blade Tailwind CSS v4 Vite 8 TradingView Lightweight Charts MySQL (prod) / SQLite (local + tests) Redis-less DB queues on dedicated training / range-sim / bot-engine connections Pest 4 Pint Laravel Socialite Questrade API IBKR Client Portal Web API (OAuth 1.0a) Anthropic PHP SDK Herd

Let’s build something worth running.

Tell us what you are working on. We will come back with a plan, a timeline and a number.