Skip to content

QuantAscent — Alpha Release Notes

Current Version: v1.0.30-alpha

Thank you for testing QuantAscent! This document covers what's included, what's known to be incomplete, and what to expect as an alpha tester.


What This Alpha Includes

Full Feature Set

Every feature described in the Product Overview is functional:

  • 12 tabs — Dashboard, Account, Holdings, Strategy Performance, Strategy Manager, Strategy Builder, Backtesting, Research, Company Analysis, Company Screener, Trade Log, Settings
  • 39 built-in strategies — sector-specific (growth + balanced) and index-tracking strategies, pre-built and ready to deploy or customize
  • 120+ financial metrics across value, quality, growth, momentum, and safety factors
  • 20 years of historical data for ~5,000 US equities
  • Automated trading through Interactive Brokers with three order modes
  • Full accounting — FIFO lot matching, wash sale tracking, tax reporting
  • Auto-updates — the app updates itself silently on startup

Data Pack (Pre-loaded)

Your alpha install includes: - Financial database (fundamentals, prices, and computed metrics) - Pre-built metrics matrix - 39 built-in strategies with cached backtest results

This means you can explore Research, Strategy Builder, and Backtesting immediately without waiting for downloads.


Version History

v1.0.30-alpha (Current)

  • Move QuantAscent to its own domain — quantascent.io, with a new landing page and a public alpha-access request form. Existing alpha installs continue to work on the old domain without changes; you can ignore the move entirely.
  • Add named backtest runs and per-strategy variant grouping — running a backtest for a strategy used to overwrite its previous result, so trying out different lookback windows or rebalance frequencies meant losing the comparison the moment you ran the next one. Each backtest now keeps its own named variant under its strategy, and the backtest list groups every variant under one expandable strategy card showing how many runs you've stored and which one has the best Sharpe (with a ★ on the winning variant). The launcher has a new Run Name field that auto-fills from the current params (e.g. lookback=12q, rebal=21d) — clear it to type your own label. Right-click any variant for Rename, Delete, or Duplicate as new run — Duplicate loads that variant's params back into the launcher so you can tweak one knob and rerun, ideal for sensitivity sweeps across lookback / rebalance / horizon. Compare mode now distinguishes variants of the same strategy (Momentum · lookback=12q vs Momentum · lookback=20q) so they no longer collide as duplicate columns in the comparison table. Your existing backtests are preserved as each strategy's first variant. Built-in strategies stay flat as before.
  • Split strategies into "sleeves" (the named portfolio bucket) and "scoring systems" (the algorithm a sleeve uses to pick names) — the Strategy Manager now lets you swap a sleeve's scoring algorithm from the Edit dialog while preserving its allocation, identity, and trade history. Each sleeve keeps a record of which scoring algorithm it was using when, so when a sleeve's returns shift after a swap you can tell whether the cause was the algorithm change or the market. Renaming a sleeve is now purely cosmetic — only the display name updates, the underlying record stays the same — so your trade history is no longer rewritten on rename. Strategy Builder no longer auto-creates 0%-allocation sleeves every time you save a scoring strategy (the source of the "ghost" entries that built up in the Strategy Manager), and a new + New Strategy button at the bottom of the Strategy Manager is now the explicit way to create a sleeve. First launch runs a one-time migration that backs up your data first, splits each existing strategy into a sleeve plus the scoring system it was using, and tags every past trade with the algorithm that picked it. Inactive 0%-allocation sleeves with no trade history are auto-cleaned during the migration.
  • Add Conditional IC against sector / industry / MarketCapBand, with a working Scan Mode quintile split — the Research page advertised conditional IC across "sector or size buckets", but the conditioning picker buried sector / industry / country / exchange at the bottom of the dropdown under "Other" and had no market-cap-band option at all. The picker now opens with a "Categorical" group at the top listing sector / industry / country / exchange / MarketCapBand, where MarketCapBand auto-derives the 5 size buckets (Mega / Large / Mid / Small / Micro) from MarketCap and renders in size order rather than alphabetical. Scan Mode also now honors a Quintile split — picking Quintile in Scan Mode used to silently fall back to a median split, but it now produces a per-metric IC across Q1–Q5 of the conditioning variable plus the best-vs-worst-quintile spread, ranked across every metric. The Research docs page (§7) is rewritten to match what's actually built.
  • Fix Conditional IC chart unreadable when the conditioning variable has many values — running CurrentPE_ratio | industry against ~150 industries used to plot every one of them as a wall of overlapping rotated labels. The chart now caps at the top 30 subsets by |IC| (sorted most positive → most negative on the x-axis) with (top 30 of N) noted on the axis label, while the table below the chart still lists every subset. The bar chart's left margin also auto-sizes to the longest rendered y-tick label so short labels don't sit behind a 22% empty gutter, and long sector / industry names rotate 30° when there are more than 5 categories or any name is longer than 8 characters.
  • Fix Backtesting Compare mode breaking after switching tabs — entering Compare mode, picking a few strategies, navigating to a different page and coming back used to leave the strategy checkboxes invisible, and clicking another card did nothing. The only way out was clicking Exit Compare and Compare again. The list now re-applies your compare selections every time it rebuilds, so tab switches, sort changes, and timeframe changes all preserve the active comparison.
  • Split built-in strategies and their backtests into a separate strategy pack — the weekly data pack now ships metric matrices only, and built-in strategies + their cached backtest results ship in a new strategy pack on a slower multi-day cadence. Previously the whole bundle was gated on the slowest piece (multi-day backtest builds), so fresh fundamentals were held back waiting on backtests. Now matrices update weekly while strategies/backtests update on their own cadence. The startup wizard downloads both packs in sequence, and a new scheduled job pulls the strategy pack from the VPS every Saturday evening alongside the existing data-pack sync.
  • Add safety guards against empty-pack wipe-and-empty installs — a 2026-04-26 incident shipped an empty data pack that wiped every tester's local built-in backtest cache, leaving the Backtesting tab empty until the next install. The new strategy-pack installer refuses to wipe-and-replace if the manifest claims zero strategies or zero backtests, or if the extracted archive's file counts disagree with the manifest. The destructive wipe only runs after both validations pass, and a post-install check confirms the destination isn't empty before writing the version file.

v1.0.29-alpha

  • Add Copy Strategy to Portfolio — copy a strategy's setup from one portfolio to another (e.g. promote a paper-tested strategy to live). Each Strategy Manager card has a new Copy button (also in the right-click menu). The destination lands inactive at 0% allocation; trade history, P&L, and rebalance state stay behind. Pre-flight blocks name collisions and shared-template content conflicts.
  • Fix daily portfolio backup only capturing the active portfolio — every portfolio now lands in one dated folder under your backup destination, plus the registry and global settings. Restore by dropping a dated folder back into %LOCALAPPDATA%/QuantAscent. Older single-portfolio backups age out via the existing 30-day retention. Backup destination is now a single machine-level setting instead of per-portfolio.
  • Add periodic benchmark-price audit — a new daily job re-checks every row in benchmark_log.csv against canonical adjusted closes and rewrites any row drifting more than 1 basis point. Corrects historical SPY/QQQ/DIA/IWM rows that drifted from dividend distributions and intraday-snapshot rows from prior data-pack rebuilds. Runs across every portfolio.
  • Fix data-pack sync silently treating a wiped matrices/ folder as up to date — sync now checks each matrix file listed in the version manifest still exists on disk. Antivirus quarantine or partial installs that left matrices missing now self-heal on the next launch.

v1.0.28-alpha

  • Split metric matrices into builtin/ and user/ subdirectories — built-in matrices ship with the data pack and are wiped/replaced cleanly on each install instead of accumulating up to ~30 GB of stale weekly files. Your custom matrices live in a separate folder the data pack never touches. Settings → Default Matrix and the Research / Strategy Builder pickers group entries by Built-in vs User.
  • Fix paper portfolios writing phantom weekend / holiday rows — opening the app on a Saturday or NYSE holiday was producing a same-day row in portfolio_log.csv with a fake daily return computed from off-market IBKR marks. Snapshots now skip non-trading days. Existing weekend/holiday rows in older logs need to be deleted by hand if you want them gone.
  • Add TWS-process-running and Read-Only API states to the IBKR setup wizard — the wizard now detects when TWS is running with the API socket disabled, and when TWS has Read-Only API enabled (which lets the app see holdings but blocks all trades). The sidebar IBKR pill shows yellow "Read-Only" alongside Connected and Disconnected; clicking it re-checks after you uncheck the box in TWS.
  • Remove automatic local matrix build from the startup wizard — when matrices weren't found, the wizard used to fall back to a multi-hour local CPU-burning build. Matrices ship via the data pack only now; the wizard verifies they're present and tells you to re-run data pack sync if not.
  • Distinguish data-pack manifest 404 from network errors in startup logs — the previous "manifest is None" message couldn't tell you whether the endpoint was missing or the network was unreachable. Now logs distinct messages for each.
  • Add first-run IBKR connection setup wizard — a guided walkthrough that detects what's wrong with your IBKR connection (TWS not running, API not enabled, wrong port, paper-vs-live mismatch) and shows the exact step needed. One-click "Open TWS / IB Gateway" and "Switch to {portfolio}" buttons. A clickable IBKR pill in the sidebar reopens the wizard whenever you need it.
  • Fix paper portfolios showing cash-only phantom NAV and 1855% first-day returns on fresh setup — a bundle of bugs in the new-paper-portfolio backfill produced a phantom $13K NAV row (cash only) on day one and a +1855% daily return when day two's real $261K NAV arrived. Now writes today's actual NAV from IBKR and properly excludes pre-start rows from baseline calculations.
  • Fix IBKR Paper Trading Disclaimer notifications stacking — accepting the disclaimer prompt in TWS used to fire 3–5 duplicate toasts at once. Dedupe is now shared across all connection roles; at most one toast per minute.
  • Fix Holdings page getting stuck on "Fetching IBKR positions…" after a portfolio switch — particularly when the IBKR gateway was swapped mid-switch (paper → live login). Three small bugs combined to freeze the UI; the fixes restore correct loading state and retry IBKR once instead of waiting through the per-role cooldown.
  • Clean up console noise during IBKR disconnects — Windows socket-cleanup tracebacks no longer spam the console on every gateway disconnect, and the Paper Trading Disclaimer warning is logged once instead of 3–5 times back-to-back.
  • Fix Strategy Manager rebalance preview generating phantom trim-sells for tickers held by a different strategy — a brand-new strategy with no positions of its own would show SELL orders for tickers another strategy in the same portfolio happened to hold. Trim and buy logic is now scoped to the strategy being rebalanced.
  • Fix FIFO lot matching closing another strategy's lots when a sale is tagged to a specific strategy — a sale tagged to Strategy A could close oldest lots regardless of strategy, sometimes silently closing lots that belonged to Strategy B. The matcher is now strategy-scoped. No data repair needed — the bug never fired in practice.
  • Fix fixed_allocation rebalance using IBKR's total position for target-vs-current comparisons — same bug pattern as the equity-scoring trim-sell fix above, fixed pre-emptively before any overlap configuration could trigger it.
  • Add Buying Power and Cash line to the Rebalance Preview dialogs — the preview now shows estimated buying power and cash before/after the trade, so you can tell at a glance whether a rebalance will dip into margin or use up your cash float. Cash-after is shown in red when the trade would drop cash below zero.

v1.0.27-alpha

  • Fix Backtesting tab freezing when you cancel mid-run — clicking Cancel during a backtest used to freeze the UI for several seconds and often left the Cancel button stuck on screen, blocking new backtests until restart. Cancel now returns instantly and the UI always resets cleanly.
  • Fix Strategy Builder strategy dropdown going empty after switching scoring modes and clicking No on the create prompt — switching back to the original mode now correctly restores its strategies in the dropdown.
  • Fix Strategy Builder save-after-Type-switch making a new strategy disappear — a sync bug between hidden and visible mode widgets used to make a freshly-saved strategy vanish from the list. Save and refresh paths now always agree on which mode is active.
  • Fix Strategy Builder Save As and Duplicate silently overwriting another existing strategy when the new name normalized to an existing filename. Save As now prompts to confirm overwrite; Duplicate refuses and asks for a different name.
  • Fix Strategy Builder rename leaving a phantom orphan when the manager update fails — rename used to delete the old file before updating the manager, so any failure in the manager step left the new file orphaned. Rename now writes the new file, updates the manager, and only deletes the old file if both prior steps succeed.
  • Fix Strategy Builder categorical filter changes not flagging the strategy as unsaved — toggling sectors / industries / countries / exchanges now lights the dirty-state indicator the same way other filter changes do.
  • Fix daily portfolio backup failing on OneDrive destinations — backups used to copy to a <date>.partial staging folder and rename to <date> at the end, but OneDrive's sync would hold the staging folder open and the rename would fail with "Access is denied", leaving empty .partial folders behind. The script now copies directly to the final destination; pre-fix .partial folders are cleaned up automatically on the next run.

v1.0.26-alpha

  • Add Include / Exclude toggle for sector / industry / country / exchange filters in Strategy Builder — every categorical filter combo now has a small mode dropdown letting you pick whether the checked items should be the ONLY values matched (Include) or the values to EXCLUDE from the universe. Useful for "keep these 5 sectors but exclude specific industries within them" universe definitions.
  • Fix Research page Global Filter returning zero results when two or more values are selected for the same dimension — adding three sector rows for Tech, Utilities, and Industrials used to AND them together (an impossible condition since each stock belongs to one sector). Multiple rows in the same dimension now OR within and AND across dimensions.
  • Fix Filter Tester histogram chart showing the unfiltered matrix as the "All stocks" baseline — even when the Global Filter narrowed the universe, the gray "All stocks" distribution and n= count always showed the full matrix. The chart now applies the same filter as the table stats.
  • Fix Research page IC Rankings and Score Breakdown Y-axis labels getting clipped when the Global Filter bar expands. Long metric names like ReturnOnTangibleAssets no longer drop their first 3–5 characters at any window width.
  • Fix Research page Score Breakdown and Score Analysis ignoring the selected strategy's universe filters — picking a strategy and running Score Breakdown by industry used to break results down across every industry in the matrix instead of just the strategy's universe. Now AND-combines the strategy's filters with the Global Filter bar.
  • Fix Strategy Builder silently wiping sector/industry/country/exchange filter selections on view revisit — saving a strategy with Tech and Industrials checked and navigating away/back used to reset the checks. The refresh path now preserves user selections.

v1.0.25-alpha

  • Fix Strategy Performance page showing wildly inflated returns on paper portfolios — four compounding bugs in the paper-account aggregation pipeline produced returns that didn't match the Dashboard or holdings (in one test, a "Total" row of +23.7% YTD against a Dashboard +4.6%, and a single-ETF Oil sleeve at +668% YTD against an actual ~33% move). On first launch after upgrade the paper strategy log is rebuilt end-to-end so every period return reflects the corrected math immediately. Live (FLEX-based) portfolios were not affected.

v1.0.24-alpha

  • Fix Backtesting Compare mode clipping strategy name headers — long strategy names in side-by-side compare mode used to get cut off at the top and bottom when wrapped to multiple lines. Headers now auto-size to fit and re-fit when the window is resized.
  • Fix Backtesting tab keeping the previous portfolio's strategies after a mid-session portfolio switch — switching portfolios mid-session left the dropdown showing the old portfolio's strategies until you restarted. Switch now also refreshes Backtesting.
  • Fix Strategy Builder metric-insight popup showing global stats instead of strategy-universe stats — the IC, quintile bars, and threshold stats shown when you opened a criterion used to be computed against the full ~5,000-stock baseline regardless of your strategy's filters. They now respect the strategy's universe so the numbers match Research and what the backtest will see.
  • Replace "Min Rebalance %" with "Min Trade $" — the anti-churn threshold is now measured in flat dollars instead of as a percentage of NAV (default $50; set to $0 to disable). The previous percentage-based threshold scaled badly to large accounts. On first launch the setting resets to the new default; the previous min_rebalance_pct key is silently ignored.

v1.0.23-alpha

  • Fix benchmark and strategy logs staying out of date after a fresh daily data pack installs on startup — the startup wizard used to skip the catch-up step when your portfolio log was current but the benchmark or strategy logs weren't, leaving gaps until the next morning's cron. Wizard now runs a lightweight refill in that case.
  • Add missed scheduled runs tracking — strategies fire on schedule only while the app is open, so missing a Sunday-evening generate window or a Monday rebalance used to be silent. The app now keeps a per-portfolio run ledger and pops a Pending Actions dialog on startup (and hourly) showing each missed run with one-click Run / Generate / Execute / Dismiss buttons. Color-coded by how overdue. Holiday-aware.
  • Add batched catch-up execution — clicking Run now on multiple missed items runs them in a sensible order (oldest first; generate before execute for the same strategy). Same-window items run in parallel; different windows queue. Closing the dialog mid-run doesn't cancel anything.
  • Add Upcoming Schedule card to the Strategy Manager page — shows the next wave of scheduled runs with task chips, strategy name, scheduled time, and a countdown. Period filter defaults to This Week; overdue runs always appear at the top regardless of the selected period.
  • Each strategy card now shows Next generate and Next execute lines separately, with market-holiday awareness so dates reflect the actual trading day.

v1.0.22-alpha

  • Add built-in strategy update notifications — when a built-in strategy is regenerated on the server (every ~12 weeks), any copy you adopted used to silently fall out of date. The Strategy Manager now flags adopted strategies whose source built-in has a newer version with an amber "Update available" pill and shows a count next to Strategy Manager in the sidebar. Clicking the pill opens a side-by-side diff (added criteria green, removed red, weight changes blue) with Update / Keep as-is / Cancel.
  • Fix stale validation warnings persisting in strategy_allocations.json — runtime warning text was being written back to disk on every save, even after the underlying issue was fixed. The file now strips runtime annotations before writing; existing files self-clean on next save.
  • Move IBKR FLEX token storage to the Windows Credential Manager — the token used to live as plaintext in your per-portfolio settings file. It now lives in Windows' encrypted secret vault (DPAPI), scoped to your user account. Renaming a portfolio migrates the token alongside the folder rename.
  • Add Privacy mode — a new Settings checkbox that masks every dollar amount in the UI with $•••• so you can share your screen without exposing balances. Percentages, share counts, tickers, and dates stay visible. Toggle and save; every tab re-renders immediately, no restart needed.
  • Fix Strategy Performance "Total" row showing roughly double the correct value — a roll-up summary row in IBKR's FLEX data was being parsed as a position and dumped into a phantom "Discretionary" bucket, inflating the Total row by ~2× across all timeframes. Parser now skips the summary row, and strategy_log.csv was rebuilt from inception.
  • Fix partial-fill trades silently tagged as "Discretionary" — when IBKR split one order into multiple fills, only the first fill matched the strategy ledger; the rest fell through to Discretionary. Same issue when fill price drifted more than $0.02 from the limit. Sibling and price-drifted fills now match back to the parent order's strategy.
  • Replace yfinance with Financial Modeling Prep (FMP) for benchmark prices, paper-account historical prices, earnings calendar, and stock news. yfinance prohibits commercial use; FMP is licensed for it.
  • Add a daily data pack — a small (~7 MB) download that keeps the last ~14 days of prices, upcoming earnings calendar, and recent stock news fresh. Synced on app launch and via a 4:30 AM ET refresh.
  • Add stale data notifications on the bell icon — surface a warning if the daily pack is more than 30 hours old. Benchmark and portfolio loggers also follow a strict skip-on-stale rule: leave gaps that self-heal when fresh data arrives instead of writing rows with last week's price.
  • Expand earnings calendar coverage on the Company Analysis page — fixed an FMP endpoint cap that was silently truncating most of the requested window. Scheduled report dates now show for AAPL, MSFT, GOOGL, JPM, BAC, PNC, and many more.
  • Fix DIA missing from benchmarks — the Dow benchmark stopped getting fetched after the FMP migration. Pack builders now always fetch SPY, QQQ, DIA, and IWM regardless of strategy membership.
  • Switch benchmark returns to total return (dividend-adjusted) — FMP's plain price endpoint returned split-adjusted-but-not-dividend-adjusted closes, causing benchmark rolling returns to step down on the migration day (e.g. SPY 10-year from 294% to 234%). Now uses the dividend-adjusted endpoint so returns match what you'd actually earn holding the ETF.
  • Fix Holdings page hanging on "Fetching account metrics…" for up to a minute after switching to a well-populated Live account. Removed a dead serial-per-stock pricing loop that wasn't even feeding the UI; metrics now return in milliseconds.

v1.0.21-alpha

  • New installs now create both a Paper and Live portfolio by default, with Paper active on first launch so new users start safely in paper trading mode.
  • Renaming a portfolio now renames the data folder on disk to match — previously only the display name changed while the folder kept the original slug. Open file handles (SQLite, IBKR) are safely closed and reopened during the rename.
  • Switching to a live portfolio that has no FLEX credentials or start date configured now prompts the IBKR setup dialog automatically, instead of silently skipping data sync.
  • Portfolio deletion no longer hardcodes protection for a "default" portfolio — instead, you can delete any portfolio except the last remaining one.
  • Fix incorrect prices and daily PNL for illiquid stocks when the market is closed — stocks like SENEA with very wide bid/ask spreads were showing the bid/ask midpoint instead of the session close price, causing wildly inflated market values and daily returns. The streaming price fallback now uses the session close (matching TWS behavior) before resorting to the bid/ask midpoint.
  • Add order status dialog for manual orders on the Holdings page — submitting an order now opens a real-time status window (similar to rebalance execution) showing order progress, fill updates, timeout countdown, and connection status instead of a static text label.
  • Add order cancellation for manual orders — the status dialog includes a Cancel button that sends a cancel request to IBKR and waits for confirmation, with a warning if cancellation cannot be confirmed.
  • Add arbitrary ticker entry for manual orders — the ticker field is now a free-text input with autocomplete from held positions. You can type any stock ticker (e.g. AAPL) to place a buy order directly without going through IBKR TWS. Selling a ticker you don't hold shows a short-position confirmation warning.
  • Add arbitrary ticker lookup for the candlestick chart — the chart ticker selector is now free-text with autocomplete, so you can view price charts for any stock, not just ones you currently hold.

v1.0.20-alpha

  • Add download page at quantascentfund.com/download — alpha testers can download the installer directly by entering their API key. Available for both Windows and macOS.
  • Add HTTPS to quantascentfund.com — all traffic is now encrypted end-to-end via Caddy reverse proxy with auto-provisioned Let's Encrypt certificates.
  • Add time-based API key expiration — keys now expire after a configurable number of days (default 90). The server returns distinct error messages for expired, revoked, and invalid keys.
  • Add extend command to API key management — expired or expiring keys can be renewed without generating a new key.
  • Improve error messages for API key validation — the download page, activation dialog, and startup wizard now show specific messages for expired, revoked, invalid, and network-unreachable cases instead of generic errors.

v1.0.19-alpha

  • Add API key validation on startup — the app now validates your API key against the server each time it launches. If the key is missing, invalid, expired, or the server is unreachable, the app enters a degraded mode with trading, data sync, portfolio logging, and scheduled jobs disabled. A clear warning dialog explains what happened and how to fix it.
  • Add server-side validation to the API key setup dialog — keys are verified against the server before being saved. Invalid keys are rejected with an error message instead of being silently accepted.
  • Fix Enter key in the API key dialog triggering "Skip" instead of "Save & Continue" — the Save button is now the default action.
  • Add API key status indicator in Settings — shows green "Valid" or red "Invalid" next to the API key field, with sync buttons disabled when the key is invalid.
  • Validate API key changes in Settings before saving — prevents saving an invalid key, and reminds users to restart the app after updating.
  • Guard trade submission, strategy generation, and rebalance execution behind API key validation — disabled actions show a popup or tooltip explaining that a valid key is required.
  • Fix empty database crash during first-run matrix build — building a metrics matrix with no tickers in the database now raises a clear error instead of crashing with KeyError: 'ticker'.
  • Fix HTTP 422 errors from the server not handled in database and data pack sync clients — missing or invalid API keys now produce clear error messages instead of unhandled exceptions.

v1.0.18-alpha

  • Move IBKR streaming prices to a dedicated background thread — the UI no longer blocks on IBKR network calls during price updates, reconnection, or streaming setup. Eliminates UI stuttering during poor network conditions and freezes when IBKR reconnects after a disconnect.
  • Validate IBKR data on startup before displaying — if the IBKR gateway is still initializing (account data not yet populated), the app shows DB-only holdings and automatically retries once the gateway is ready, instead of displaying incorrect NAV or position values.
  • Guard candlestick chart loading against unstable connections — chart loading is deferred until IBKR data is confirmed valid, preventing crashes from mid-call socket disconnects.
  • Reduce IBKR connection retry cooldown from 30 seconds to 10 seconds for faster reconnection after gateway restarts.
  • Fix holdings page failing to load when IBKR connection drops during startup — the app now automatically reconnects and retries price fetching instead of showing an empty "No holdings data" screen. Also fixes a bug where connection errors during per-symbol price lookups were silently swallowed instead of triggering a retry.
  • Fix order cancellation not confirmed by IBKR — pre-market fallback orders (limit-then-market mode) could remain live after the user clicked Cancel because the app sent the cancel but never verified IBKR acknowledged it. Cancellation now polls for confirmation up to 10 seconds and warns the user if any orders could not be confirmed cancelled.
  • Add cancel check between primary and fallback order phases — prevents fallback MKT orders from being placed when the user already clicked Cancel during the primary LMT phase.
  • Fix strategy chart defaults not persisting — deselecting a strategy in the Defaults dialog appeared to work but the change was silently lost on timeframe change or app restart because the settings file was read-only. Also fix performance and risk metrics tables ignoring chart defaults so deselected strategies no longer appear in the tables.
  • Fix cash deposits counted as portfolio gains — IBKR FLEX data can include offsetting internal CashTransaction legs for a single deposit, causing the deposit amount to net to zero. Portfolio returns now use the authoritative ChangeInNAV.depositsWithdrawals value from IBKR instead of summing individual transactions.
  • Fix settings changes requiring app restart to take effect — settings like Min Rebalance %, Margin Enabled, and Max Leverage now apply immediately after saving. Previously, several modules cached stale values at startup.
  • Allow Min Rebalance % to be set to 0% — removes the previous 0.1% floor so users can disable the anti-churn guard entirely.

v1.0.17-alpha

  • Add in-app bug reporting — submit bug reports directly from Help & About with a description, system info, and log file attached automatically. Reports are stored securely on the server and the developer is notified by email.

v1.0.16-alpha

  • Add extended hours trading support — new "Extended Hours" toggle in Settings allows limit orders to fill during pre-market (4:00 AM–9:30 AM ET) and after-hours (4:00–8:00 PM ET) sessions via IBKR's outsideRth flag. Defaults to off. When enabled, buy limit prices use the ask (instead of mid) to stay within IBKR's after-hours price caps.
  • Fix misleading "All orders filled successfully" notification when buy orders are rejected — rebalance now reports rejected symbols and partial fills accurately
  • Fix holdings page reloading every ~60 seconds while idle — TWS sends zero-position events for closed positions, which were mistaken for new trades and triggered an infinite reload loop
  • Fix holdings page crash/freeze from repeated clicking — table sorting no longer creates C++ objects (swaps text in place), chart redraws reuse matplotlib axes instead of accumulating figure state, and rapid chart button clicks are debounced with load-in-progress guards
  • Fix portfolio event handler accumulation across IBKR reconnects — updatePortfolioEvent is now properly disconnected during streaming cleanup

v1.0.15-alpha

  • Fix orphaned positions not sold during rebalance — exit sells now use the lots DB (authoritative FIFO-matched positions) instead of the strategy ledger, which could drift due to old-format entries or incomplete partial fill recording

v1.0.14-alpha

  • Fix startup hang when IBKR paper account is not fully initialized — IBKR connection no longer blocks all roles behind a single lock
  • Fix catchup worker persisting ibkr_connected=True after initial cash balance check fails, preventing cascading timeouts

v1.0.13-alpha

  • Fix settings discard crash when switching portfolios (QSpinBox.setText → setValue)
  • Remove local builtin strategy regeneration from startup — strategies now only download from VPS data pack
  • Remove stale auto-regenerate setting, scheduler job, and UI regenerate buttons
  • Clean up old VPS matrices automatically when a new data pack installs

v1.0.12-alpha

  • Add 60-second cooldown to position-change reload to prevent reload loop during active trading
  • Update known position set immediately on detection to prevent repeat triggers

v1.0.11-alpha

  • Auto-detect TWS trades: holdings page reloads automatically when positions change outside the app
  • Discretionary allocation updates in real time from live IBKR positions
  • Fix read-only rebalance state file cleanup on Windows (WinError 5)

v1.0.10-alpha

  • Fix stale rebalance state deadlock: auto-clear orphaned state files instead of blocking preview
  • Fix empty buy orders for small-allocation strategies: anti-churn guard no longer blocks initial position entry

v1.0.9-alpha

  • Show install progress bar during auto-update instead of a blank screen
  • Add bounds checking on numeric settings (Client ID, Order Timeout, Min Rebalance %)
  • Stale NAV warning on dashboard when portfolio data is outdated (NYSE calendar-aware)
  • Verify IBKR account type on reconnect to prevent live/paper mismatch
  • Clarified Min Rebalance % description in UI and documentation

v1.0.8-alpha

  • Added alpha documentation site with MkDocs, docs button in Help dialog

v1.0.7-alpha

  • Version bump for alpha distribution with full data pack

v1.0.6-alpha

  • Auto-updater now relaunches the app automatically after silent install
  • Improved update reliability

v1.0.5-alpha

  • Fixed frozen-app detection for the packaged build (Nuitka compatibility)

v1.0.4-alpha

  • Consolidated logging: all logs now go to a single log directory
  • Removed scattered debug error files

v1.0.3-alpha

  • Pre-alpha hardening release — data safety, logging, and stability fixes
  • Read-only file locking to prevent manual edits of data files
  • Mid-trade disconnect detection and order reconciliation for IBKR
  • Help & About dialog with version info, log folder access, and system info
  • IBKR live positions as primary holdings data source
  • Worker thread safety, FLEX validation, order timeout enforcement

Earlier Releases (Pre-alpha)

  • Money-weighted returns (IRR) alongside time-weighted returns
  • Auto software updates with silent install
  • Discretionary strategy for tracking non-app trades
  • Market order mode and limit-then-market hybrid
  • Rebalance execution polish: progress UI, cancel support, failure handling
  • Chart defaults dialog for persistent preferences
  • Async holdings loading for faster startup
  • Batch strategy execution with order netting
  • Fixed allocation (ETF) backtesting support
  • Backtest subprocess isolation to prevent UI freezes
  • Data catchup on portfolio switch

Known Limitations

These are areas that are incomplete or have known rough edges:

Platform

  • The app is packaged with Nuitka; startup may take a few seconds on first launch

Trading

  • Options trading is not supported — equity positions only
  • Order execution assumes US market hours and US equities
  • The Flex API has rate limits — if you trigger multiple rapid syncs, you may need to wait

Data

  • The financial database covers US equities only (~5,000 stocks)
  • Some newer IPOs or recently listed companies may not have full metric history
  • Metric data updates weekly on Saturdays — intra-week data is not reflected until the next sync

UI

  • Some charts may render slowly with very large date ranges (10+ years with many strategies)
  • The app uses a fixed dark theme — light mode is not available

What We're Looking For

As an alpha tester, the most valuable feedback is:

  1. Crashes or freezes — if the app stops responding, submit a bug report from Help & About
  2. Data that looks wrong — if a number doesn't match what you see in IBKR, note the specific metric and date
  3. Confusing workflows — if you can't figure out how to do something, that's a documentation or UX issue we want to fix
  4. Things that are slower than expected — note which screen and what you were doing

How to Report Issues

Open Help & About from the sidebar and use the Submit Bug Report button. Describe what happened and what you expected — your system info and log file are included automatically. The developer is notified by email when a report is submitted.


What's Next

The roadmap for upcoming alpha releases includes: - Additional built-in strategy types - Enhanced reporting and export options - Performance optimizations based on tester feedback - Documentation updates based on questions and confusion points