Your fills, read as behavior — no account, nothing uploaded
biaX turns a closed-trade history into behavioral statistics. This page runs that computation in your browser — on a constructed sample tape, or on rows you paste in yourself.
Nothing you paste is sent anywhere. There is no API call on this page and no upload;
every figure below is computed from the table on this page by
/js/demo.js. The site's cookieless page-view counter loads here as it does
on every page, and it never sees your rows.
The rows
Sample Trader A: a deliberately constructed demo portfolio — not real fills
Map your columns
Fills are paired first-in, first-out per symbol into closed round-trips; a position still open at the end of the file is left out and counted. Round-trip P&L is price-only (fees not subtracted). Dates are read as written — slash dates as month/day/year — and the entry hour is the clock in the file.
Two numbers per trade is enough
Keep the first line as the column names. Then one line per closed trade: how many days you held it, and the percent you closed at. Losses take a minus sign. That is the whole minimum — the box already has a runnable example in it, so you can edit the numbers and press Compute.
Optional columns — each one switches on another panel below
entry_date,entry_hour,ticker,hold_days,pnl_pct,entry_tags,added_to_loser
2026-05-04,9,TSLA,5,1.48,,0
2026-06-01,13,NVDA,38,-12.88,FOMO|Greedy,0
- entry_hour — hour of day, 0–23. Switches on the hour-of-day panel.
- entry_tags — how you felt going in, separated by
|. The names the app itself uses read directly, in either language —FOMO,Greedy,Calm,Confident,Impatient,Anxious,Regret,Panic,Revenge,Bored,Averaging down,Rule followed,Planned stop,Target hit, and the rest of the catalog. A name it doesn't recognise falls into “Other” rather than being dropped. - added_to_loser — how many times you added to the position while it
was down.
yes/noalso read. - entry_date, ticker — labels only; they change no figure.
-12.88and-12.88%both read. Column order doesn't matter as long as the first line names them. First 2,000 rows.
Or paste a broker export as-is
- Read directly — header text confirmed on the broker’s own docs: Interactive Brokers activity statement (Trades section), Kraken trades export.
- Recognised, one click to confirm — header known from community documentation, so the page shows you the column mapping before computing: Robinhood, Webull, Charles Schwab, Fidelity, Interactive Brokers Flex Query, Coinbase, Binance.
- Anything else with a header row — a small “map your columns” panel opens. Time, side, price and quantity are the four it needs.
- Fills are paired first-in, first-out per symbol into closed round-trips. Only closed round-trips are read; adds while down are counted from the fills. Nothing is uploaded at any step.
| # | Entry date | Hour | Ticker | Hold | P&L | Entry tags | Added while down |
|---|
0 rows in view.
What comes out
Hold time, split by how the position closed
Same rows, cut once.
Entry tags, grouped
Tags recorded when the position was opened — not after it closed.
Adding while the position was down
Counted from the rows, not self-reported.
Entry hour
Exchange local time, bucketed by the hour the position opened.
The statements the app would show
Up to three, ranked by the size of the average P&L gap in the bucket behind them. Every bucket under 10 trades is dropped before ranking.
What this data can't show
The part a screenshot usually leaves out. Three detectors exist in the app and stay silent here, because their input isn't in these columns.
Take the readout with you
A 1080×1350 image or a plain-text summary, drawn in this tab from the rows above. It carries hold times, tag-group sizes, adds while down, entry hours and one statement — and nothing else: no P&L figure, no win rate, no score.
The same readout on a connected account
biaX: Emotional Trade Journal runs these statistics on a read-only brokerage connection, with the price path filled in for the signals this page leaves blank.
How exact is this?
The formulas, thresholds, rounding, tag catalog and statement wording are transcribed from the app's own modules — a bucket under 5 trades is not reported, a statement needs 10, win rate rounds to four places, an average to two. The file names every server module it mirrors in its header comment, so the two can be diffed by hand.
Sample Trader A is a deliberately constructed demo portfolio — not real fills: 40 round-trips written to exercise every panel, including the empty ones. It is not a real person's account, and no figure here is presented as anyone's track record.
Everything above describes rows that already closed. It is not a recommendation, a rating of the trades, or a forecast. biaX connects to a brokerage read-only and never places an order. Research named on this page: Odean (1998) on the disposition effect, Arkes & Blumer (1985) on the sunk-cost effect.
If you are reading this for a class or a trading group, there is a second demo — what an instructor sees, and what the cohort console withholds from them.
The app does the same on your own history, with the price path filled in — what each plan opens or read the support FAQ.