feat: Live MT5 EAs page + parser improvements

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
This commit is contained in:
unknown
2026-04-20 08:30:46 +10:00
parent e1b426c9b2
commit 6f8e01bcf1
13 changed files with 1834 additions and 105 deletions
+8 -4
View File
@@ -9,8 +9,6 @@ Launch: streamlit run app.py
import streamlit as st
from streamlit_option_menu import option_menu
import importlib, sys, os
import view_settings
view_settings.inject_theme_css()
# ── Page config ───────────────────────────────────────────────────────────────
st.set_page_config(
@@ -144,8 +142,8 @@ with st.sidebar:
st.markdown("---")
page = option_menu(
menu_title = None,
options = ["Trade Analysis", "Trade Compare", "Portfolio Builder", "Portfolio Master", "EA Comparator", "Batch Backtest", "Settings"],
icons = ["bar-chart-line", "arrow-left-right", "briefcase", "trophy", "sliders", "cpu", "gear"],
options = ["Trade Analysis", "Trade Compare", "Portfolio Builder", "Portfolio Master", "Live MT5 EAs", "EA Comparator", "Batch Backtest", "Settings"],
icons = ["bar-chart-line", "arrow-left-right", "briefcase", "trophy", "wifi", "sliders", "cpu", "gear"],
default_index = 0,
styles = {
"container" : {"background-color": "transparent", "padding": "0"},
@@ -174,6 +172,7 @@ if page == "Trade Analysis":
elif page == "Portfolio Builder":
import view_portfolio_builder as p
importlib.reload(p)
p.render()
elif page == "Portfolio Master":
@@ -195,6 +194,11 @@ elif page == "Batch Backtest":
importlib.reload(p)
p.render()
elif page == "Live MT5 EAs":
import view_live_mt5_eas as p
importlib.reload(p)
p.render()
elif page == "Settings":
import view_settings as p
importlib.reload(p)