You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Treasury notes/bonds (CUSIP 9128*) now use the CSV Amount column for cost basis instead of qty * price, which was inflating P&L by orders of magnitude
Same-day mixed buys/sells are reordered by net daily flow so a partial close on an existing long position is no longer misclassified as opening a short
Options assigned/exercised/expired close at $0 so the premium becomes realised P&L instead of leaving the contract permanently open
Bloomberg-style symbols derived from descriptions for US Treasuries (e.g. T 4.25 12/31/26) instead of surfacing raw 9-character CUSIPs
Options realised P&L matched to the CSV Amount column, capturing exchange/regulatory fees Firstrade rolls into the amount without itemising
Commission and Fee columns tracked separately on trades
Generic broker selection routes to the Firstrade parser when headers unambiguously match
EXEC TIME hints extracted from row descriptions; execution datetimes rewritten monotonically post-sort to preserve position-aware order
Heads up: the Firstrade parser is now labelled Alpha in the import UI. Please review imported trades and report incorrect P&L or symbol mappings via GitHub Issues.
Interactive Brokers (IBKR)
Rewrote error code dictionary against the official Flex Web Service v3 docs (e.g. 1007 was incorrectly labelled token-expired; that's actually 1012)
Added all transient codes (1001, 1004-1009, 1018, 1019, 1021) to the retry set
requestFlexReport now retries up to 5x on transient IBKR/DNS errors
fetchFlexReport poll loop uses the retryable set instead of a hardcoded 1019 check
Scheduler cleans up zombie fetching/started log entries on startup
Trade filters & detail
URL filter params are now authoritative — click-throughs like /trades?symbol=X no longer pick up a stale status:open filter from localStorage
Open option positions in Trade Detail now show entered premium plus unrealized P&L (using the dashboard's manual option price) instead of Open
Max Drawdown click in Analytics now force-enables the drawdown chart if hidden and adds a brief ring highlight on scroll
Display Currency description in Settings clarified — it changes the symbol only, no FX conversion
Broker sync date range
New sync_start_date column on broker_connections (NULL = All Time)
Sync Trades From preset selector (All Time, This Year, Last 30/90 Days, Last 1 Year, Custom) in both the IBKR setup modal and the connection settings modal
syncConnection() falls back to the connection's sync_start_date when no explicit start is supplied, applying the floor to scheduled auto-syncs as well
Image upload UX
Paste images from the clipboard directly into the trade and diary upload zones (shortcut label adapts to platform)
Warn before saving an edited trade when images are selected but not yet uploaded, then flush pending uploads on confirm
Features
Stock Analyzer / DCF valuations
Auto-save every Calculate — no more clicking Save Valuation
Saved Valuations panel always visible (was hidden until a symbol was searched)
Colored symbol chips per row; current-symbol rows group at top with an Only {symbol} filter
Click a saved valuation for a different symbol to switch the analyzer and auto-load its assumptions/fair values
Loading a saved row rehydrates the Bear/Base/Bull cards from stored fair values; margin-of-safety recomputed client-side
Fixes
saveValuation now rounds shares_outstanding before INSERT (Finnhub returns shares in millions; the *1e6 multiply yielded floating-point residue like 1036160000.0000001 for NOW, which Postgres rejected on the BIGINT column with a 500)
Added migration 180_create_email_log.sql — emailService.logEmail() and the retention email schedulers reference an email_log table that no migration ever created, causing relation "email_log" does not exist errors on every scheduled run