Journal CSV import: broker exports, column mapping and dedupe
"Import trades from CSV" reads a broker export, detects the delimiter and columns automatically, previews the parsed trades and writes them into the journal. Re-importing the same file updates existing rows instead of duplicating them.
Senzoukria · Documentation · Updated September 2026
Where to find it
- Where
- Journal → Trades → "Import CSV" button
- Sources
- Apex Trader Funding (default), Rithmic Trader, NinjaTrader, TradingView, Other CSV
- Delimiter
- Comma, semicolon or tab, picked from the first line
- Dedupe key
- The trade id column when present, otherwise "{source}-row-{n}"
What it does
The dialog says: "Export from your broker dashboard, drop the file here. Re-imports dedupe automatically." Choose the broker source, then drop the file or use "Browse file" (.csv or text). The parser strips a UTF-8 byte-order mark, handles quoted fields with embedded commas, quotes and newlines, and picks the delimiter that appears most often in the header line.
The preview shows the file name, the count of parsed and skipped rows, the number of columns, a collapsible "Column auto-mapping" list and the first 8 trades (Time, Symbol, Side, Qty, Entry, Exit, P&L). The button reads "Import N trades". The result panel prints "+N new · N updated" and the number of failed rows if any, with "Import another" and "Done".
Column mapping
| Field | Accepted headers | Required |
|---|---|---|
| symbol | symbol, instrument, contract, ticker | yes |
| side | side, buy/sell, b/s, direction, type | yes |
| entryPrice | entry price, open price, buy price, avg entry price, fill price | yes |
| exitPrice | exit price, close price, sell price, avg exit price | no |
| quantity | qty, quantity, size, contracts, shares, lots | no (default 1) |
| pnl | pnl, p/l, p&l, profit, net pnl, realized pnl, pl | no |
| entryTime | entry time, open time, buy time, time, datetime, trade time, fill time | no (defaults to now) |
| exitTime | exit time, close time, sell time | no |
| commission | commission(s), fee(s) | no |
| accountId | account, account id, account number | no |
| externalId | trade id, order id, ticket id, execution id, id, fill id | no |
| notes | notes, comment, memo, tag | no |
Value parsing
- Side: B, BUY, LONG, L become LONG; S, SELL, SHORT, SH become SHORT. Any other value skips the row.
- Numbers: dollar signs, spaces and thousands separators are removed; a value in parentheses is read as negative.
- Quantity is rounded to an integer.
- Dates: anything the JavaScript Date parser accepts (ISO, MM/DD/YYYY…), plus the compact YYYYMMDD HH:MM[:SS] form read as UTC. Output is ISO 8601 UTC.
- A row without symbol, side or entry price is counted as skipped; empty rows are ignored.
How to use it
Export the trade list from the broker or prop-firm dashboard, keep the header line, and drop the file. Check the auto-mapping list: a field mapped to "—" was not found, and the resulting trades will have that field empty. Time and account columns matter most: trades imported without an account number land in the "No account recorded" bucket of the account selector.
Imports are upserts keyed on the source and the external id. Re-importing an updated export refreshes the matching rows and reports them as "updated" rather than creating duplicates. When the file has no id column, the row number is used, so reordering the rows between two exports changes which trade is updated.
Limits and pitfalls
- Imported trades keep the P&L of the file; nothing is recomputed from prices and point values.
- Timeframe, setup, rating, emotion and screenshots are not read from CSV; add them afterwards from the trade form.
- Only one file at a time. The source choice affects the fallback id prefix, not the column mapping.
- Dates without a timezone are interpreted by the machine's local zone by the Date parser; the compact form is treated as UTC.
Related pages
- Journal: trades tab
- Journal overview and account scope
- Journal sync from Rithmic
- Futures backtesting guide
This page in other languages
Frequently asked questions
- Why were rows skipped?
- A row is skipped when the symbol, the side or the entry price cannot be read. Open the "Column auto-mapping" list to see which columns were not detected.
- Will importing twice duplicate my trades?
- No, as long as the file has an id column or keeps the same row order. Matching rows are updated and counted as "updated".
- Does the import need a broker connection?
- No. It reads a local file and writes to the local journal database.