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.
view_live_mt5_eas.py:
- Refresh All button and Auto-refresh input moved inside Account
Configuration expander to eliminate wasted space on main page
- Updated Xm ago timestamp remains on main page below expander
view_live_mt5_eas.py:
- Secondary text colour changed from #555/#666 to #A0A8B8 (silver grey)
for readability on dark theme
- Font size bumped from 11-12px to 13px across all card labels:
Updated timestamp, Balance/Current, Recovery, Loss streak,
Stagnation, Today P&L, prop account progress bar labels
view_live_mt5_eas.py:
- Replace broken sleep+rerun approach with streamlit-autorefresh
which injects a JS timer — works without user interaction
- Graceful fallback if package not installed, shows install hint
- First page load always pulls fresh data from FTP
- Auto-refresh fires FTP pull when poll interval has elapsed
requirements.txt:
- Added streamlit-autorefresh
view_live_mt5_eas.py:
- Auto-refresh: added sleep+rerun loop at end of render so page
keeps itself alive without user interaction
- Initialise ftp_last_auto_refresh to now on first page load so
timer starts correctly rather than triggering immediately
- Open positions table: updated columns to match MT5 HTML report
(Time, Position, Symbol, Type, Volume, Price, S/L, T/P,
Market Price, Swap, Profit, Comment)
mt5_parser.py:
- parse_open_positions: added market_price, swap, profit, comment
columns to match all 11 columns in MT5 HTML Open Positions table
view_live_mt5_eas.py:
- Auto-refresh: added sleep+rerun loop at end of render so page
keeps itself alive without user interaction
- Initialise ftp_last_auto_refresh to now on first page load so
timer starts correctly rather than triggering immediately
- Open positions table: updated columns to match MT5 HTML report
(Time, Position, Symbol, Type, Volume, Price, S/L, T/P,
Market Price, Swap, Profit, Comment)
mt5_parser.py:
- parse_open_positions: added market_price, swap, profit, comment
columns to match all 11 columns in MT5 HTML Open Positions table
view_live_mt5_eas.py:
- Auto-refresh: added sleep+rerun loop at end of render so page
keeps itself alive without user interaction
- Initialise ftp_last_auto_refresh to now on first page load so
timer starts correctly rather than triggering immediately
- Open positions table: updated columns to match MT5 HTML report
(Time, Position, Symbol, Type, Volume, Price, S/L, T/P,
Market Price, Swap, Profit, Comment)
mt5_parser.py:
- parse_open_positions: added market_price, swap, profit, comment
columns to match all 11 columns in MT5 HTML Open Positions table
mt5_parser.py:
- parse_open_positions: added market_price, swap, profit, comment
columns to match all 11 columns in MT5 HTML Open Positions table
view_live_mt5_eas.py:
- Open positions table columns updated to match MT5 report order:
Account, Time, Position, Symbol, Type, Volume, Price, S/L, T/P,
Market Price, Swap, Profit, Comment
view_live_mt5_eas.py:
- Open positions table now shows all columns: Account, Position,
Symbol, Base, Type, Lots, Open Time, Open Price, SL, TP, Status
- Friendly display names and formatted Open Time (DD.MM.YYYY HH:MM)
- Any extra columns returned by parser appended automatically
- Replaced real account numbers in FTP setup guide CLI examples
with generic placeholders (123456, 789012)
icmarkets_parser.py:
- Replaced real account numbers in docstring examples with
generic placeholders (123456789, 987654321)
.gitignore:
- Added *.docx to prevent docs with sensitive info being committed
view_live_mt5_eas.py:
- Replaced real account numbers in CLI examples with generic
placeholders (123456, 789012)
.gitignore:
- Added *.docx to prevent handoff/setup docs with sensitive
information being committed to the repo
view_live_mt5_eas.py:
- Replaced bare error message with full inline setup guide when
ftp_config.json is missing
- Part 1: FileZilla Server install, create FTP user, disable TLS,
passive mode port range
- Part 2: MT5 terminal FTP publisher settings step-by-step table,
common issues table
- Part 3: CLI verification commands for connection test, save
credentials, pull and cache accounts
- Part 4: config file reference table and .gitignore entries
- Part 5: troubleshooting table
- Info banner at bottom prompting to refresh once CLI setup is done
- Page loads normally once ftp_config.json exists — no behaviour change
view_settings.py:
- _write_server_config now always writes address = 0.0.0.0 for LAN mode
- Specific detected IP is display-only, not written to config.toml
- Fixes WinError 10049 when config.toml is shared across machines
with different LAN IPs via git pull
view_settings.py:
- Network Access section: LAN vs localhost toggle, port input
- _get_lan_ip: detects first 192.168.x.x address, ignores PPPoE/WAN
- _write_server_config: writes [server] block to config.toml
- _write_config: now preserves existing [server] block when saving theme
- Custom hostname input with step-by-step hosts file instructions
for Windows (C:\Windows\System32\drivers\etc\hosts) and macOS (/etc/hosts)
- iOS/Android note directing to IP address or static DHCP reservation
- _get_local_sha: reads .git/HEAD directly, no git CLI required
- _get_remote_info: fetches latest commit SHA from GitHub API, 1hr cache
- _get_recent_commits: fetches last 10 commits for changelog, 1hr cache
- check_for_update_banner: call from app.py to show top-of-page info
banner when local SHA differs from latest GitHub commit
- Version and Changelog section in Settings: local vs remote SHA,
update warning with git pull instructions, Check again button,
last 10 commits as collapsible expanders with you-are-here marker
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
- Add _generate_html_report() function with self-contained HTML output
- Charts built with direct Plotly.newPlot JSON (no pio.to_html conflicts)
- Equity curve, drawdown, daily P&L, DOW, hour of day charts
- Both view overlays original and edited equity curves
- Stats grid with delta arrows in Both mode
- Monthly performance table with JS $ / % toggle
- Initial balance passed explicitly from session state at download time
- Position summary and trade log as collapsible <details> dropdowns
- Daily P&L x-axis labels hidden for readability
- Download button at top of Overall mode, filename includes view and timestamp
- Move Initial Balance input to filters row so it's set before report renders
- Remove duplicate deposit input from monthly table section
Trade Analysis:
- Add editable raw trade log with # index and Group column
- Group column merges multiple entries into one position on Update
- Reset button clears edited version back to original upload
- View selector: Original / Edited / Both — appears after first Update
- Both mode: stats show with coloured delta arrows vs edited version
- Both mode: equity, drawdown and daily P&L charts overlay both versions
- Both mode: strategy comparison table shows inline delta values
- Position Summary expander above monthly table — all positions listed
(grouped with entry count, individual as single rows) sorted by open time
- Download exports edited version when available, original otherwise
- Trade # multiselect filter to show specific trades
- All charts and tables (DOW, hour, monthly) respect view selection
- Fix: Group column positioned second after # index
- Fix: DataFrame truth value error in download button
- Fix: Both mode now uses edited df for DOW/hour/monthly charts
mt5_parser:
- Add trading_days and trades_per_day to calc_stats
- Add ISO datetime format fallback for CSV imports
- Fix missing comment column KeyError in _enrich
- Fix NaT in date filter when open_time has null values
mt5_parser:
- Remove deprecated infer_datetime_format (removed in pandas 2.0)
- Add ISO datetime format fallback for CSV imports (YYYY-MM-DD)
- Fix missing comment column in _enrich causing KeyError on plain CSVs
Trade Analysis:
- Add daily P&L bar chart below equity curve
- Add drawdown panel below daily P&L
- Fix NaT in date filter when open_time has null values
Batch Backtest:
- Fix read_utf16/write_utf16 to detect and preserve original encoding
- Fix _clear_use_default_flags to clear bit 2 on all parameters
- Fix snapshot approach for report finding — before/after file scan
- Fix cleanup to remove all new htm files after each run
- Fix report selection to prefer named file over newest fallback
- Apply all encoding and flag fixes to CLI script mt5_batch_backtest.py
- incorrectly managed in/out trades skipping trades when multiple open entries on the same strategy.
- fixed card color backgrounds in light theme
- fixed strategy filters in portfolio builder
- 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
- Add monthly performance table (year x month grid) with $ / % toggle
and Initial Balance input alongside the toggle
- Add equity curve overlay toggles: Account total, By Strategy,
By Symbol, By Day of Week — checkboxes above each chart
- Fix all chart backgrounds to transparent for light/dark compatibility
- Fix chart grid and font colours to work on both themes
- Monthly table and equity overlays added to Overall, By Strategy
and By Symbol modes
Trade Analysis:
- Add toggleable equity curve overlays: Account total, By Strategy,
By Symbol, By Day of Week — checkboxes above each chart
- Fix all chart backgrounds to transparent (inherit page theme)
- Fix grid and font colours to work on both dark and light backgrounds
Settings page:
- Full theme control: Dark / Light / Custom radio with Apply button
- Custom mode: colour pickers for accent, page bg, sidebar bg, text,
font selector and base dark/light toggle
- Preview swatches before applying
- Discard / Reset to Dark button
- Text size: Normal / Large (+2px) / Extra Large (+4px) via CSS injection
- inject_theme_css() helper for app.py to apply font size on all pages
- Theme written to .streamlit/config.toml on apply
- Add Manual (edit in table) instrument mode
- Add Lock Table / Unlock buttons — edits persist without rerun interference
- Fix report name to always include symbol and period: {stem}_{symbol}_{period}_{model}
- Fix report names rebuilt from actual Symbol values in locked/edited table
- Add instrument warning above preview table
- Fix run_batch missing report_names parameter (recurring)
- Fix progress bar using stored total count
- Add Cancel button and bb_total / bb_report_dir session state keys
Batch Backtest:
- Fix run_batch signature missing report_names parameter (recurring)
- Add inline config editor to Active Config expander — edit and save
all settings directly from the UI without re-running CLI script
Set Comparator:
- Fix UTF-8/UTF-16 encoding detection using BOM check
- Fix parse to skip optimisation metadata lines (ParamName,F etc.)
- Fix export to preserve all original lines including metadata
- Add UBS format detection — warning shown for non-Ultimate Breakout files
- Fix view_set_comparator to unpack 4-value return from parse_set_file
Set Comparator:
- Fix UTF-16/UTF-8 encoding detection for .set files (BOM check)
- Fix parse to skip optimisation metadata lines (ParamName,F etc.)
- Fix export to preserve all original lines including metadata
- Add format detection warning for non-Ultimate Breakout .set files
Batch Backtest:
- Fix run_batch signature missing report_names parameter (caused hang)
- Fix progress bar to use stored total count not live set_files length
- Add Windows-only check at render entry point
- Fix optimisation file exclusion to match anywhere in filename
Trade Analysis:
- Fix IC Markets upload error handling to show actual exception
requirements.txt:
- Add scipy, openpyxl, beautifulsoup4
- README.md: full feature overview, install steps, file structure, format support
- MT5_Tools_Install_Guide.docx: 8-section Word doc covering install, all pages,
config reference and troubleshooting
- README.md: full feature overview, install steps, file structure, format support
- MT5_Tools_Install_Guide.docx: 8-section Word doc covering install, all pages,
config reference and troubleshooting