Multi-file uploaders trigger Windows browsers' folder-select mode
which bypasses the type filter. Switch to N single-file slots
(matching the working set comparator pattern) so the OS picker
stays in single-file mode where folder selection is impossible.
Default 5 slots, expandable up to 20 via dropdown.
When a user selects a folder in the upload picker (browser behaviour
that bypasses type filter), all files come through and only valid
extensions get processed. Make the skipped count visible and update
the caption to set expectations.
Mac Safari was offering folder uploads when type=None was set on
file_uploader. Set explicit type=[htm,html,csv] on both
portfolio master and builder pages so the OS picker restricts to
individual files of supported extensions.
Live MT5 EAs page (view_ftp_tracker.py):
- FTP-based multi-account tracker replacing view_mt5_tracker.py
- Account configuration with add/remove, FTP folder validation, Demo/Personal/Prop types
- Prop account fields: profit target %, max loss %, daily loss % with EA hard stop banner
- Account summary cards: recovery factor, loss streak, stagnation days, today P&L, prop progress bars
- Calendar view: month/week/year, Mon-Fri only, weekly total column, $ or % toggle
- Open positions table parsed from MT5 HTML Open Positions section
- Symbol correlation heatmap (collapsible)
- Trade analysis section with full stats, equity/drawdown/daily P&L, DOW/hour, monthly table
- Analysis modes: Overall, By Account, By Symbol, By Algo, By Day of Week
- Dynamic combined balance field auto-updates from selected accounts
- Auto-refresh polling with session state timestamp guard
- Report date extracted from MT5 HTML header (Date: field)
- Drawdown $ / % toggle with spline smoothing
mt5_parser.py:
- calc_stats(df, deposit=0.0) — deposit-aware balance drawdown matching MT5 Balance Drawdown Maximal
- max_drawdown_pct and peak_equity added to calc_stats return
- peak_at_dd uses .loc[] fix (IndexError on filtered DataFrames)
- parse_open_positions() — parses Open Positions section from MT5 account HTML
- extract_strategy() — filters sl/tp/so close-reason comments, maps nan to Manual
ftp_sync_cli.py:
- New CLI tool for FTP connection testing and cache population
MT5Tools_FTP_Setup_Guide.docx:
- FileZilla Server setup, MT5 publisher config, CLI verification, troubleshooting
- Replace Inputs= with [TesterInputs] section in ini files so MT5
cannot override set file parameters with cached/default values
- Fix build_ini to use caller-supplied report_name instead of
recomputing a generic name, ensuring each run gets a unique ini
- Replace shutil.copy2 + delete loop with shutil.move for htm reports
- Add companion PNG move (name, -holding, -mfemae, -hst) to reports folder
- Fix Streamlit folder warning appearing in wrong conditional branch
Applies to both mt5_batch_backtest.py and view_batch_backtest.py
- mt5_batch_backtest.py / view_batch_backtest.py: fix update_param to
clear MT5 .set flag bit 2 (use-default) and update default field so
manual lot size actually takes effect
- view_portfolio_master.py: Max DD% now uses deposit not running peak,
Max Position Exposure rebuilt as proper timeline sweep
- view_portfolio_builder.py: Max DD% formula aligned to match master
- view_portfolio_master.py / view_portfolio_builder.py: results table
now shows full stats columns including Stability score