v1.3.0 - Import from any broker
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.pyretakes 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.batIf 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