Using the column mapper for any CSV
Drop any CSV, tab or text file. If Actal does not recognise the header line, it asks which column is which, once, and remembers the mapping for every file with the same header. Twelve platforms are detected automatically; everything else goes through the mapper.
What to do
- 1
Click Import trades, pick the account, and drop the file. If the header is not recognised you land on the mapping page: "This file was not recognised; tell the journal what each column holds".
- 2
Pick a mode next to "Map the columns": "One row per execution" when each row is a fill, or "One row per round trip" when each row is a finished trade. Actal guesses round trip when a header mentions exit or close.
- 3
Check the guesses. Each field has a dropdown; required fields are marked with a red star. Pick "not in this file" for anything you do not have.
- 4
If you mapped a Status column, type the value that counts, for example Filled, in the box under it.
- 5
Give the mapping a name under "Save as" and click "Save mapping and preview".
- 6
On the preview check the first rows, the day/month note, the timezone, unknown symbols and the commission, then click Import N trades.
The two modes
"One row per execution" is for order or fill exports: each row is one fill with a price and a time, and Actal pairs the fills into round trips, including scale-ins and partial exits. A position still open at the end of the file is not a trade and is listed under Parser notes. "One row per round trip" is for files where each row already is a finished trade, with an entry price, an exit price and an exit time.
Every field
| Field | Needed | What it holds |
|---|---|---|
| Symbol | Required | e.g. MNQZ5, ES 12-25, /MNQU6. Actal works out the root and the point value. |
| Side | Optional | Buy/Sell, Long/Short, B/S, Bought/Sold. Leave blank if the quantity is signed. |
| Quantity | Required | Contracts, lots or shares filled. |
| Fill price | Required, execution mode | The price of the fill. |
| Fill time | Required, execution mode | Date and time, any common format. |
| Entry price | Required, round trip mode | |
| Exit price | Required, round trip mode | |
| Entry time | Optional, round trip mode | Exit time is used when missing. |
| Exit time | Required, round trip mode | |
| P&L | Optional, round trip mode | Taken as authoritative when mapped, else computed from prices and the point value. |
| Commission | Optional | Counted as the trade's cost. |
| MFE | Optional, round trip mode | The most the trade was in profit, in money. |
| MAE | Optional, round trip mode | The most the trade was against you, in money. |
| Stop loss | Optional | The price your stop was at. Sets each trade's risk and R. In execution mode, put it on the row that opens the trade. |
| Order ID | Optional | Helps duplicate detection. |
| Account | Optional | Rows with different account values never pair with each other. |
| Status | Optional | With an allowed value typed below it, other rows are skipped. |
Guesses come from the header names: Symbol, Instrument, Contract or Ticker for the symbol; Qty, Quantity, Contracts, Size or Volume for the quantity; Fill Time, Exec Time, Timestamp, Date/Time for the time; Entry price, Open price, Exit price, Close price; PnL, P&L, Profit, Realized for the P&L; Commission, Fee, Fees; and so on. Header case does not matter. Anything wrong, change it before you save.
Side values and signed quantities
- A buy is b, buy, bot, bought, long or l, or anything that starts with buy, bought or long.
- A sell is s, sell, sld, sold, short or sh, or anything that starts with sell, sold or short.
- With no side column, a positive quantity is a buy and a negative one a sell. The quantity is stored without the sign.
- In round trip mode with no side column and unsigned quantities, the side is worked out from the P&L and the prices, and the preview says how many trades were read as shorts that way. Map a Side column to set it yourself.
- A row with no usable symbol, quantity or side is skipped with the note "Missing symbol, quantity, or side" and its line number.
The status filter
Order exports list cancelled and working orders next to the filled ones. Map the Status column, and a box appears under it: "allowed value, e.g. Filled", prefilled with Filled. Only rows whose status equals that value are read; case does not matter. Several values separated by commas are accepted. The preview counts what was dropped: "N row(s) skipped by the status filter". If every row is skipped you get 0 trades, so check the value against the file's own spelling.
Dates, times and the day/month order
Times can be ISO (2026-08-28 09:35:12), US (08/28/2026 9:35:12 AM), European (28.08.2026 09:35), written out (Aug 8, 2025 at 08:43), with or without seconds, and with a trailing offset or a US zone such as EDT. A time Actal cannot read is skipped with the note "Unparseable time".
Slash dates like 05/10/2026 can be either way. Actal settles the order in this priority: a day number above 12 somewhere in the file proves it; otherwise your own choice on a previous file with the same header; otherwise a date in the file name, such as 2026-10-07 or 7 Oct 2026; otherwise the upload day, since a trade cannot be more than a day in the future; otherwise your region (day/month outside the Americas). When the order was not proven, the preview shows a box such as "Dates like 05/10/2026 could go either way. Read as 10 May (month/day)." with a button "Switch to" the other reading. The switch is remembered on the saved mapping.
Times with no offset are read in your profile timezone. When that happens the preview shows "File timestamps are in" so you can pick the platform's zone and click "Apply and re-check".
The stop loss column
Map a column such as Stop Loss, SL or S/L and each trade's risk is set from the distance between the entry and the stop, at the contract's dollars per point. The guess only comes from headers that cannot be a stop order's trigger price, so a column named Stop Price is never picked up by itself. A stop is kept only when it reads as one: below a long's entry or above a short's, within half the entry price of it, and never on options. Stops that fail are left out with a note saying why, for example that the column needs the stop's price, not ticks, points or dollars.
On the preview the file's stop beats the risk rules for every trade that has one, and the risk box says "The stop loss in your file sets the risk on N trade(s)." A number typed on a row still wins for that trade. See The Stop and Risk columns.
Saved mappings
A mapping is keyed by the header line, lower-cased with the spacing collapsed. The next file with the same header skips the mapper and goes straight to the preview. The import page lists them under "Your saved column mappings" with a Delete button each. To change a mapping, delete it and drop the file again. The mapper cannot be reopened from the preview.
When the preview looks wrong
- Unknown symbols block the import until you enter a point value in the "Unknown symbols" box: the dollar value of a one-point move for one contract, or 1 for stocks and crypto. Nothing is guessed. Confirmed values live in Settings > Contracts and win over the built-in table.
- Prices ten or a hundred times too big get a suggestion "divide prices by N" with a checkbox. Untick it to keep the file's prices.
- No commission column mapped? The preview asks for a commission per contract, round trip, like it does for Tradovate.
- A column you mapped that is missing from a later file is listed under Parser notes as "Mapped column(s) not found in this file".
Questions people ask
Did this not answer it?
Ask from the Feedback page in the app. The founder answers every question there, and the answer ends up in this help centre. Not signed in? Email hello@actal.io.