The Multi-Market Dashboard: Scoping Your P&L Across Crypto, US Stocks, and PSX Without Faking the Math
A scope selector that narrows your dashboard to one market at a time — and the honest math problem it created: what does "return" mean when your account has only one starting-capital figure to split three ways?
One Account, One Blended Number
Trade BTCUSDT on an exchange, US:AAPL through a synced brokerage, and PSX:HBL by hand, and the dashboard used to do what every dashboard does: add it all up. One Net P&L. One win rate. One equity curve. Which is fine, right up until you actually want to know whether your PSX picks are working, separate from whatever crypto did last week.
The Multi-Market Dashboard is the fix — a scope selector that narrows the dashboard down to one market at a time, and a set of math that had to get honest about what it can and can't compute once you do that.
How the App Knows Which Market a Trade Is In
There's no market column anywhere in the schema. Nobody tags a trade "crypto" or "PSX" when they enter it. Instead, every symbol is run through a plain prefix parser at read time:
BTCUSDT -> crypto US:AAPL -> us PSX:HBL -> psx
No prefix means crypto — the default, since that's the bare-symbol convention the exchange sync already used. A US: prefix means US stocks, PSX: means the Pakistan Stock Exchange. That's the entire classification: marketForSymbol() reads the string in front of the colon and returns one of exactly three values — crypto, us, or psx. No configuration, no per-symbol lookup table, no migration required to add a market — the parser already covers whatever gets typed.
Worth naming a gap here honestly: onboarding also lets you tick "Index" and "Forex" as markets you follow, because those are useful chart shortcuts. But they're chart-only — there's no way to hold a position or log a trade in them — so they never produce a scope chip and never show up in any of what follows. If you only ever picked Forex at signup, the dashboard has nothing to scope.
The Scope Selector Hides Until It's Needed
The bar that lets you switch markets doesn't appear by default. It checks how many markets you actually have data in — trades, manual portfolio holdings, synced exchange wallets — and if that number is less than two, it renders nothing at all. Not a disabled state, not a single greyed-out chip. Nothing. A trader who only touches crypto gets the exact same dashboard they always had, byte-for-byte.
That "actually have data in" distinction matters more than it sounds. The chips aren't built from what you picked on the onboarding market-preference screen — they're built from what's actually sitting in your trade history and your synced or manual holdings right now. Say "yes" to PSX during signup and never place a PSX trade, and no PSX chip appears. What you say you'll trade and what you're actually trading are two different questions, and only the second one should change what the dashboard shows you.
When two or more markets do have data, you get a row of chips: All markets, plus one per detected market. It's built as a proper WAI-ARIA radiogroup with roving tabindex — arrow keys and Home/End move focus between chips the way a native radio group would, not just Tab-Tab-Tab through every option.
Your choice sticks. It's saved to localStorage under a per-user key, so switching to "US only" and coming back tomorrow keeps you on US. And if the market you had scoped to stops having any data — you closed your last position there, say — it quietly falls back to "All markets" instead of showing you an empty scope with no explanation.
What Actually Narrows — and What Doesn't
Scope the dashboard to one market and four things filter down with it: the Performance Metrics cards (Net P&L, Return, Win Rate, Fees, Trade count), Trade History, the Trading Calendar, and the day-detail modal you open from it. Pick "PSX only" and every one of those surfaces shows PSX and nothing else.
One thing deliberately does not move: the Equity Curve. It stays account-wide no matter what scope is selected, and it says so on-screen rather than pretending otherwise:
"Account-wide — the equity curve tracks your whole account, not the {market} scope."
That's not an oversight. An equity curve is a trajectory of one number — total account equity — over time. Slicing it per market would mean attributing every deposit, withdrawal, and cross-market capital movement to a specific market, and the app doesn't record capital movements that way. Rather than fake a per-market equity line by drawing something that looks precise but isn't backed by real attribution, it stays whole and tells you so.
One more distinction worth knowing before you go looking for a feature that isn't gated: the Equity Curve and Trading Calendar are Pro-only, regardless of scope — a free account sees an upgrade card in their place. The Market Scope selector itself, along with the scoped Metrics cards and Trade History, are not gated. You can scope your metrics and trade list on the free tier; the equity curve and calendar are what Pro unlocks.
What "Return" Even Means Once You Scope
This is the part that took real thought, because the honest answer is: the account only has one starting-capital figure and one goal. You enter both once, at onboarding, for the whole account. There is no "PSX starting capital" stored anywhere to divide your PSX return against.
So a scoped Return can't be "P&L since starting capital" the way the unscoped one is — there's no per-market starting capital to be since. Instead, the dashboard reconstructs a capital committed figure per market, built entirely from data that's already on hand:
Open positions in this market -> their cost basis
Closed trades in this market -> their capital risked
= Capital committed to this market
(Realized P&L + Unrealized P&L) / Capital committed = Return %If a market has nothing open and nothing closed yet, capital committed is zero and Return shows as null rather than a divide-by-zero or a misleading 0% — the metrics card reads "No capital committed yet" instead of a number. Crypto futures margin counts toward crypto's committed capital too, since futures only exist inside the crypto market in this app.
The metrics card wears the distinction on its subtitle. Unscoped, it reads "Since starting capital." Scoped, it switches to "On capital committed to {market}" — a genuinely different denominator, labeled as one, not a silently swapped number under an identical caption. A small pill next to the "Performance Metrics" heading confirms the scope too — "{market} only" — and the section description spells out exactly what you're looking at: net P&L, return on committed capital, win rate, fees, and activity across that one market's trades.
Capital committed is reconstructed from open and closed positions, not recorded as its own figure — because the account was only ever designed to track one starting-capital number, and pretending otherwise would just move the dishonesty somewhere less visible.
Cash Doesn't Get Split Either
The same discipline applies to cash balances. If you hold USDT, USD, and PKR, the dashboard shows each currency's balance separately, along with which markets it can actually fund — USDT and USD fund crypto and US stocks, PKR funds PSX. Nothing gets divided up or estimated across markets.
This only appears when you're actually holding more than one cash currency, as a small row underneath the breakdown: something like "PKR 50,000 · funds PSX" for a currency that's usable, or "· not a trading currency here" for one that isn't tied to any market you currently hold positions in.
The Blended View Isn't Just a Sum
Switch back to "All markets" and you don't just get one number for the whole account — you get a breakdown grid underneath it, one row per market that actually has closed trades. Each row shows that market's signed P&L, its win rate and closed-trade count, and a compact "X committed · Y% return" summary using the same committed-capital math described above. A market with no closed trades yet simply doesn't get a row — there's nothing honest to summarize about it.
The Bug We Found on the Way In
Building the scoping feature meant looking hard at how markets get funded during onboarding, and that turned up a real bug in the existing flow — one that had nothing to do with the dashboard itself, but that the dashboard work wouldn't have been safe to ship without fixing.
Here's what was happening. If you picked, say, crypto and PSX as your markets at signup and funded your account in USDT, the app created one cash pool: USDT. No PKR row existed anywhere, because you never told it a PKR amount. The problem is that "no PKR row" was indistinguishable from "this user skipped entering starting capital entirely" — which is a normal, supported state the app already has to handle. So the first time you logged a PSX buy, there was nothing to debit. Not an error, not a warning — the trade just silently failed to draw down any cash pool, and your account quietly went out of sync with what you actually held.
The fix, shipped the same day as the dashboard scoping itself: cash seeding now seeds the currency you actually funded first, then adds an empty placeholder row for every other currency implied by the markets you picked — deduped by dollar-family, so USDT and USD count as one pool rather than two.
Pick crypto + PSX at onboarding, fund 1000 USDT Before: no PKR row exists -> first PSX buy debits nothing -> silent desync After: empty PKR row seeded -> first PSX buy debits PKR correctly
One knock-on effect worth mentioning: the "Hold this capital as" currency chooser in the goals flow only appears when your market picks actually imply more than one non-dollar-equivalent currency. Pick crypto and US stocks together and you're never asked — both live in one dollar pool, and a question with an obvious answer isn't worth asking.
What We Didn't Build
Per-market goals don't exist. There's no schema field for a PSX-specific target next to your account-wide one, no UI for setting one — just a code comment stating plainly that this was a decision, not a gap. The account has one goal because it has one starting-capital figure, and a per-market goal would need to know how much capital moved between markets over time — money that shifted from crypto into funding a PSX position, for instance. The app doesn't record capital transfers between markets at that level of detail, so it has nothing true to build a per-market goal out of.
We'd rather ship "capital committed," a number that's fully reconstructable from data the app actually has, than invent a per-market goal balance built partly on a transfer history that was never recorded.
Tested Before It Shipped
The scoping and capital-committed logic is covered by 35 automated tests across three files — 13 for the market-scope logic, 13 for the capital-committed math, and 9 for the scope selector bar itself — all passing on the current codebase. The onboarding side has its own coverage: 7 end-to-end scenarios walking through PSX rupee funding, crypto+PSX funded from either side, a single-market signup that shows no currency chooser at all, a crypto+US signup that stays one dollar pool with no question asked, a EUR-denominated US trader getting a correctly-converted USD pool, and the case where no starting capital is entered at all — confirming that produces no cash seed, not a broken one.
Try It
If your account already has trades or holdings in two or more of crypto, US stocks, and PSX, the scope selector is already there — open your dashboard and look above the metrics cards. If it's not showing, that just means the app hasn't seen you trade in a second market yet.
For the charting side of trading across these same three markets, see Inside PTJ Charts: Crypto, US Stocks & PSX. And if you're curious how the one account-wide goal this post keeps referencing actually works, How to Set Compounding Goals covers it in full.
Recommended reading
Related guides
How Pro Trading Journal Payments Work: USDC on Solana, No Card, No Wallet Connection
Pro Trading Journal now accepts USDC on Solana for Pro. No card, no subscription, no wallet connection — a QR code, an address, and an exact amount. Here's exactly how it works and why we built it this way.
Community Signals & the PTJ Algo Radar: How We Verify Every Call
Two systems on one Pro-gated page: an algo radar that hides its numbers until 100 trades back them up, and a community call feed where a daily cron replays open signals against real candles to earn the verified badge.
The Verified Leaderboard: How Pro Trading Journal Ranks Real Execution, Not Screenshots
Only exchange-synced, closed trades count toward Pro Trading Journal's leaderboard. Here's exactly how PTJ Score, the eligibility floor, and reciprocal privacy work, straight from the code that runs it.
Ready to review your trades with a crypto trading journal?
Turn this guide into a repeatable review habit with Pro Trading Journal, a crypto trading journal app for tracking trades, R-multiples, equity curve, and trading psychology. Starter includes 50 new trades every calendar month with no expiry.
Start Your Free Journal