Skip to content

v1.3.0 - Import from any broker

Choose a tag to compare

@simonro simonro released this 13 Sep 13:49
· 18 commits to main since this release

Import from any broker, not just Thinkorswim and Interactive Brokers.

Not financial advice. Not a signal service. Every screenshot is the synthetic demo seed.

Generic CSV import

If your broker is not one of the two with a dedicated importer, copy your fills into the generic
template, one row per execution, and import it with Other broker (generic template). The journal
groups the fills into round-trip trades using the same code the broker importers use, so duplicate
detection and P&L behave exactly the same.

On the Import page, Broker not listed? links a blank template and a filled-in example: a long
with a partial exit, a short, an option and a micro future.

Column Needed What goes in it
date Required YYYY-MM-DD, or MM/DD/YYYY
time Required 24 hour HH:MM or HH:MM:SS, or 1:05 PM
symbol Required AAPL. Futures start with a slash: /MESU26
side Required BUY or SELL. BUY TO COVER, SELL SHORT, BOT and SOLD work too
quantity Required Shares or contracts, always positive
price Required Fill price per share or per contract
commission Optional Fees for that fill. Blank means 0
asset_type Optional STOCK (the default), OPTION or FUTURE
expiry, strike, put_call Options 2026-08-28, 765, CALL or PUT
multiplier Optional Point value for a future the app does not know

Columns can be in any order, common names such as Ticker, Qty and Fees are recognised, and
extra columns are ignored, so an export that already uses these headers imports without editing.
Auto-detect recognises the template.

It refuses rather than guesses. If any row cannot be read, nothing is imported and the error
names the line and the problem. Day-first dates are refused because 03/04 is ambiguous, and a
future with an unknown point value is refused unless the row has a multiplier, because assuming 1
would understate an /ES trade fifty times over. A silently skipped or mispriced fill would change
every P&L figure after it.

Also in this release

  • Demo trades are priced at each day's real closing level, so with market-data keys set the trade
    chart shows real candles with the fills sitting on the actual price action. The trades themselves
    are still entirely synthetic.
  • Without market-data keys, the chart area was a tall empty box on every trade. It is a single line
    now.
  • Trade View still told you to click a row to expand it; the expand was removed in 1.2.0. The copy
    is corrected.
  • backend/tests/test_generic_csv.py: 13 tests covering each instrument type's P&L and every refusal
    path. scripts/capture_screenshots.py retakes the README screenshots.

Want a dedicated importer for your broker?

Open an issue with a sample export that has account numbers and personal details removed. Every
parser only has to turn rows into executions; grouping, duplicate detection and P&L are shared.

Install

Download the zip below, unzip it, then follow the Quick Start in the README. Python 3.11 or newer
and Node 18 or newer. Run python scripts/seed_demo.py for the synthetic data in the screenshots.

Upgrading

Your trades (backend/trading_journal.db) and your keys (backend/.env) are not part of a release,
so updating never touches them.

If you cloned with git:

git pull
launch.bat

If you downloaded the ZIP: unzip this one into a new folder, copy your two files across, run
npm install in frontend/ once, then start it.

old-folder/backend/.env                 ->  new-folder/backend/.env
old-folder/backend/trading_journal.db   ->  new-folder/backend/trading_journal.db