All three export ledgers rather than trades, so read why that matters first if you have not.
Interactive Brokers
Take the Flex Query, not the CSV. IBKR offers activity statements as CSV and as a Flex Query in XML, and the XML is materially better for a journal:
- it carries realised P&L per closing trade, computed by the broker in the account currency
- the trade rows are unambiguously typed, so nothing has to be inferred from an amount column
- it is designed to be generated repeatedly on a schedule, which makes it the right choice if you intend to keep importing
The currency point is the one that matters most. On a multi-currency account, matching fills by price and subtracting gives you a number in the instrument's currency, converted at whatever rate you assume. IBKR's own realised figure already reflects the conversion applied at the time — so the XML avoids a drift that no amount of careful arithmetic on a CSV can fix.
If you do take the CSV, the columns that matter are DataDiscriminator (which distinguishes real trade rows from summaries — this trips up most parsers), Symbol, Quantity, T. Price, Comm/Fee and Realized P/L.
Charles Schwab
Schwab exports transaction history as CSV, and its shape is an accounting ledger rather than a trading one.
Key columns: Date, Action, Symbol, Quantity, Price, Fees & Comm, Amount.
Two things to know:
Action is the only reliable filter. The file contains dividends, interest, transfers and journal entries alongside buys and sells, and several of them have values in Amount. Selecting rows by action type is the difference between a trade history and a mixed bag with a few fake winners in it.
Fees are positive. Schwab writes Fees & Comm as a positive charge, unlike MetaTrader, which writes commission negative. This is exactly the sign inconsistency described in net P&L, and it is why our implementation subtracts the absolute value rather than adding the column.
Dates come without a timezone, in US Eastern.
Trading 212
Export from the History section; the file arrives as CSV.
Columns: Action, Time, Ticker, No. of shares, Price / share, Result, ID.
Use the Result column. Trading 212 gives its own realised figure per closing trade, and like IBKR's it already accounts for the currency conversion — which matters here because the platform is popular for trading US stocks from non-dollar accounts.
There is no separate commission column in the standard export, because the platform's commission model differs from a traditional broker's. Costs are inside the result rather than itemised, which means any per-trade fee total will read as zero. That is not an error, and it is why our analyzers say "not listed separately in this file" rather than showing a zero — a zero there would claim you trade for free.
Action also carries deposits, withdrawals and dividends here, so the same filtering applies as with Schwab.
What to check after importing any of the three
The trade count, against roughly what you remember. Wildly high means fills were counted as trades; wildly low means the matching dropped unmatched fills, usually because the export does not reach back far enough.
Whether anything shows as still open that you know is closed — the same symptom, from the same cause.
Any of the free analyzers will show you the count and the parser it used, which is a quicker check than opening the file in a spreadsheet.