VEEMAN reads the trade exports your broker or backtester already produces. Several formats are recognised automatically; everything else goes through a universal mapping engine.
Drop one of these and it imports with no configuration:
| Source | Notes |
|---|---|
| Option Omega | Portfolio or single-strategy exports. Trade-level detail is retained for per-strategy sizing. |
| TradeStation | Export the full Trades List report. |
| TradingView | Strategy-tester "List of trades" export. |
| Interactive Brokers | Activity Statement export. Reads the executed-trades section (Dettaglio eseguiti / Trades) and sums the realized P/L of each fill on its close date. |
| Portfolio Builder | Native export. |
| Invest Studio | A daily equity export (not per-trade — so it has no trade count). It marks equity on every calendar day; VEEMAN derives P/L on weekdays only, folding any weekend drift into the following Monday so no phantom Saturday/Sunday rows leak into the day-of-week stats. The total P/L is unchanged. |
An IBKR Activity Statement bundles every asset class and several non-trade items. VEEMAN reads it deliberately:
ClosedLot per lot closed. VEEMAN keeps only the
execution rows (reading the DataDiscriminator column), so a $300 result stays $300 instead of
becoming $600. If a statement carries both order-level and execution-level rows, the order rows win —
an order is the sum of its executions.If a file isn't one of the above, VEEMAN's mapping engine locates the date and the profit/loss automatically. It comfortably handles tastytrade (via its cash ledger), NinjaTrader, MetaTrader, Sierra Chart and, in general, any CSV that contains a date and a P/L (or something P/L can be derived from). How it decides is covered in How import works.
.csv, .txt, .xlsx, .xls. (Excel needs the openpyxl package on the server — if it's missing, export to CSV.)$1,234.56, parenthesised negatives (123.45), and EU/US decimal styles are parsed.Decimal comma or thousands separator? Decided once per column
12,345 is 12345 in US convention and 12.345 in European convention, and nothing inside that one cell
says which. So the decision is taken once for the whole column, by looking at all of its values
together — a single 1,5 or 0,375 anywhere in the column proves the comma is decimal, because neither
is a valid thousands grouping. Cells that would be ambiguous on their own are resolved by their
neighbours.
If a column offers no decisive evidence — every value looks like 12,345 — VEEMAN picks the US
convention (the more common in exports) and opens the review step, because at that point it is a
convention, not a reading.
Amounts that cannot be read at all are excluded and counted, never turned into 0. A fabricated
zero is indistinguishable from a genuine break-even day and would enter win rate, profit factor and the
VaR tail as if it were real.
Whatever the input, VEEMAN reduces each strategy to a single series: one profit/loss value per day (multiple trades on the same day are summed). That uniform shape is what makes strategies from different platforms directly comparable.
Alongside the P/L, VEEMAN also captures — where the file exposes it — the contracts and number of trades closed each day. These feed the per-strategy manual costs control: TradingView, TradeStation, IBKR and Option Omega carry a quantity column, so they unlock the accurate per-contract basis; any per-trade export unlocks per-trade; pure equity-curve exports (no trade rows) fall back to a flat per-day cost.
Minimum requirement
A file is ingestible if VEEMAN can find a date and a P/L — either directly, from a cash-flow ledger (value minus commissions and fees), or from a running equity/balance column it can difference day to day. Files with none of these (e.g. position snapshots or holdings reports) can't be turned into a P/L series.
Next: How import works — the mapping engine and the review step.