Pairing Modes
How NinjaTrader pairs trades by executions, why date filters legitimately change the numbers, and when to use TradeScope's Wide vs NT day-by-day views.
NinjaTrader stores executions, not trades
NinjaTrader's database doesn't have a “trade” table. It has an executions table — one row per buy or sell fill. Every time you click Buy, Sell, or get filled by a stop or bracket, NinjaTrader writes one execution row with the time, price, quantity, and instrument.
A “trade,” in NinjaTrader's vocabulary, is what you get when you pair an opening execution with the execution that closes it. Open at 9:30, close at 9:45 = one trade. Open at 9:30, close half at 9:45 and half at 9:50 = two trades (NT splits multi-fill exits into separate trades, one per closed unit).
Why this matters: the “trade” you see in NinjaTrader's Trade Performance report is a calculated view of your underlying executions. The executions are the ground truth. The trades are an interpretation of them.
How NinjaTrader pairs executions into trades
NinjaTrader sorts the visible executions by time (with price and execution ID as tiebreakers) and then walks them in order using FIFO — first-in, first-out. As it walks, it tracks your running position per account and instrument. When an execution reduces your position toward zero, the closed quantity is paired against your oldest still-open opening fill, and that pairing becomes a “trade.”
TradeScope does the exact same walk, on the same sorted execution list, using the same FIFO rules. That's why the numbers match: same input, same algorithm, same output.
See the Further reading section below for NinjaTrader's own documentation on how Trade Performance calculates trades.
Why date filters legitimately change the numbers
Here's the part that surprises most users. NinjaTrader's Trade Performance window re-pairs trades inside whatever date range you've filtered to. It doesn't show you a saved list of trades — it re-runs the FIFO walk on the executions inside the filter, every time you change the filter.
That means the same data can show different numbers depending on the filter you pick. Concrete example:
You buy 1 ES on Friday at 3:55 PM at 4500. You sell 1 ES on Monday at 9:35 AM at 4520. That's +20 points / +$1,000 — one trade, two-and-a-half days long.
- ▸Filter to Friday only → NinjaTrader sees only the Friday buy. No matching sell inside the window. Zero closed trades, zero P&L.
- ▸Filter to Monday only → NinjaTrader sees only the Monday sell. No matching opening fill inside the window. It synthesizes an opening cost basis from the first available fill in the window (or shows the position as opened-then-closed within Monday). The numbers look right for Monday but the entry price isn't your real entry.
- ▸Filter to Fri–Mon together → NinjaTrader sees both fills. Pairs them. Shows the real +20-point trade with the real entry and exit prices.
None of those is wrong. They're all what NinjaTrader actually does — they're just answers to different questions. TradeScope mirrors this faithfully.
Wide mode
One pairing across the entire visible date range. Multi-day positions appear as single rows with your real entry price and your real exit price. Wide mode answers: “What did this position actually do, from open to close?”
On the Calendar, the day a trade closes on gets credit for the P&L (matching NinjaTrader's bucketing for Daily P&L). A small ● dot flags any trade that opened on a prior day so you can spot multi-day positions at a glance.
Use Wide when: you care about real entry/exit prices, real trade durations, or you want a clean view across a multi-day or multi-week range. This is the default — and what most journals show.
NT day-by-day mode
Each day in the visible window is paired in isolation. Multi-day positions get split — the entry day shows a synthetic open closing into the end of session (or carrying forward, depending on the fills), and the next day re-pairs from a synthetic cost basis. NT day-by-day mode answers: “What would NinjaTrader Trade Performance show if I filtered to just this day?”
Trade counts and total P&L can legitimately differ from Wide mode on carryover days. That's not a bug — it's NinjaTrader's actual behavior when filtered day-by-day, made visible.
Use NT day-by-day when: you're cross-checking TradeScope against NinjaTrader filtered day-by-day, or you only care about what happened on a specific day and want to ignore prior-day exposure.
How to verify any number against NinjaTrader directly
The most reliable sanity check is to open both apps side-by-side:
- ①Open NinjaTrader's Trade Performance window.
- ②Set the same accounts and the same date range as TradeScope.
- ③The Net P&L, Gross P&L, win count, loss count, and trade count should match.
If they don't, the gap usually points to one of three things: a pending sync (TradeScope hasn't read NT's latest writes yet — click Sync), a mode mismatch (Wide vs NT day-by-day), or an account hidden in TradeScope (check Settings → Accounts). The Settings → Diagnostics page in TradeScope has a per-trade carryover breakdown for windowing-related discrepancies.
Where pairing modes show up in TradeScope
- Mode toggle in the date filter bar — visible on Dashboard, Calendar, and Trade Log. Flip it anywhere; the whole app updates together.
- Carryover dots on the Calendar mark days containing trades that opened on a prior day. Click into the day to see the underlying trades and the NinjaTrader execution fills that paired into them.
- Carryover analysis in Settings → Diagnostics breaks down exactly which trades are affected by the current date window and how much P&L they account for.
- Default pairing mode preference in Settings → General. Whichever mode you set here is what the app launches in — toggling during a session is a temporary override.
Coming in a future release
PlannedFor futures traders, “a day” doesn't always mean midnight-to-midnight. CME Globex sessions, for example, run from 6:00 PM ET the previous calendar day to 5:00 PM ET the current day — a position you open at 8:00 PM Monday and close at 10:00 AM Tuesday is one continuous session-day trade, not a multi-day carryover.
We're planning to add a third pairing mode alongside Wide and NT day-by-day:
- Preset session windows — pick from common futures-session schedules like CME Globex (6 PM ET → 5 PM ET next day) or Regular Trading Hours (9:30 AM → 4:00 PM ET) with one click.
- Custom window ranges — set your own session open and close hours plus a timezone, so non-CME-products or international sessions can also be reported by their natural day boundary.
You'll see a placeholder “Session day · soon” pill in Settings → General → Default pairing mode in TradeScope v2.0.12 — that's where the third mode will land when it ships.
Further reading
NinjaTrader's support forum has a thread that walks through exactly how Trade Performance pairs executions into trades, with responses from NinjaTrader staff:
- NinjaTrader forum — Trade Performance execution / trade pairing issue A user-reported case of trades that didn't pair the way they expected. NinjaTrader staff explain the FIFO + visible-window pairing model that TradeScope mirrors. Worth a read if you're trying to understand exactly why a number changes when you change the filter.