LEGSTECH Optimizer 20fd86f065 fix: dashboard goes silent during Phase 1 (no AI thinking, empty Param Changes panel)
Three issues caused the dashboard to look frozen during the long Phase 1
exploration phase, even when 2+ runs had completed:

1. AI Thinking feed only got ONE entry (the phase-start banner) and then
   went silent until Phase 2. Phase 1 is LHS sampling so there are no AI
   calls — but we can still narrate observations rule-based. Added
   _narrate_phase1_run() that emits a per-result message tuned to what
   actually happened: 'PF 1.8, DD 14% — strong region, worth refining'
   (success), '$-734 loss with 191 trades — skipping' (warning), 'only
   3 trades — params too restrictive' (info), etc. Mediocre runs are
   throttled to 1-in-5 to avoid feed spam

2. Parameter Changes panel showed 'No iterations yet — AI-driven param
   edits appear per iteration' which is misleading during Phase 1
   (where there are no iterations YET, by design). Empty-state message
   now phase-aware: shows 'Exploration phase — changes appear in Phase
   2' during phase1, 'Waiting for first AI iteration' if autonomous, or
   'Random-neighbor refinement — enable Autonomous AI for AI changes'
   if not autonomous

3. AI Summary still said 'Waiting for optimization to start...' even
   while the optimization was actively running. New refreshAIWaitingState()
   updates the message based on (a) whether a run is active and (b)
   whether the API key is set. When running with no key, shows 'AI
   insights are off — no Anthropic API key set' with a 'Configure API
   key in Settings →' link

Frontend now also tracks state.phase and state.autonomous from
phase_start events so all empty-state messages stay in sync.
2026-04-25 14:47:49 +00:00
2026-04-13 02:28:09 +00:00

APEX — AIPowered MT5 EA Optimizer

Built with Claude Opus 4.7 License: MIT Demo Mode

An AI trader thinking out loud while it tests, fails, and improves a strategy.

Built with Claude Opus 4.7 for the Cerebral Valley × Anthropic — Built with Opus 4.7 hackathon.

APEX is an autonomous optimizer for MetaTrader 5 Expert Advisors. Instead of bruteforcing parameters with grid search, an LLM reads each backtest result, decides which parameter to change and why, then runs the next backtest — iterating toward profitfactor / drawdown / Calmar targets you set. Every reasoning step streams live to a dashboard.


Why this is different

Traditional optimizers APEX
Bruteforce grid / genetic search AI reads each result, decides what to change
Black box — see only final winner Live thinking feed + periteration param diffs
No notion of why a config works Stores AI analysis next to every run
Stops after N iterations Stops when quality targets are met (early exit)
Oneshot validation Outofsample + sensitivity with live progress

Demo

APEX in action

6frame timelapse of one autonomous run — Phase 1 exploration → Phase 2 AI iteration → Phase 3 validation → verdict. Every backtest, every parameter change, and every line of AI reasoning streams live.

A static highres view is at screenshots/dashboard.png. The dashboard shows three live phases — Exploration → Iteration → Validation — with the AI's reasoning streaming on the right, parameter changes per iteration in the centre, and an outofsample/sensitivity validation panel that updates as MT5 finishes each test.

Other views: setup wizard · settings modal · bestresult modal with evolution path


How it works

┌──────────────────────────────────────────────────────────────────────────┐
│                       APEX OPTIMIZATION LOOP                             │
│                                                                          │
│   Phase 1: EXPLORATION                                                   │
│     LatinHypercube sample N parameter sets → run in MT5 Strategy Tester │
│     → score with Calmar / PF / MFE / sessionstability / recovery        │
│                                                                          │
│   Phase 2: AI ITERATION (autonomous loop)                                │
│     ┌──► Claude reads full history + targets + parameter schema          │
│     │      ↓                                                             │
│     │    Claude returns: { changes:[{param,value,reason}], confidence }  │
│     │      ↓                                                             │
│     │    Apply changes (clamped to schema bounds), dedupe, run backtest  │
│     │      ↓                                                             │
│     │    Stream `ai_thinking` + `param_changes` events to UI             │
│     │      ↓                                                             │
│     └──── Targets met? → exit early.  Stuck? → random escape.            │
│                                                                          │
│   Phase 3: VALIDATION                                                    │
│     Outofsample run on unseen dates + ±20% sensitivity probe on the    │
│     top parameter → verdict: RECOMMENDED / RISKY / NOT_RELIABLE          │
│                                                                          │
│   Output: ranked .set file + perrun report folder + final verdict       │
└──────────────────────────────────────────────────────────────────────────┘

The AI loop lives in optimizer/ai_guided_loop.py; the reasoner contract is in analysis/ai_reasoner.py; event emission to the UI flows through optimizer/pipeline.py via SocketIO.


Quick start

1. Clone + install

git clone https://github.com/tonnylegacy/MT5_Optimizer.git
cd MT5_Optimizer
python -m venv .venv
.venv\Scripts\activate            # Windows
# source .venv/bin/activate       # macOS/Linux
pip install -r requirements.txt

2. Configure

Copy the example config and fill it in:

cp config.example.yaml config.yaml

Set your Anthropic API key (get one at https://console.anthropic.com/):

# Option A — environment variable (recommended)
setx ANTHROPIC_API_KEY "sk-ant-..."     # Windows
export ANTHROPIC_API_KEY="sk-ant-..."   # macOS/Linux

# Option B — paste into config.yaml under ai.anthropic_api_key

Edit config.yaml to match your local MT5 install paths under mt5: (terminal exe, AppData path, MQL5 Files path).

3. Launch

python app.py

Open http://localhost:5000. Register your EA on the Setup page, set thresholds, hit Start, and watch the AI think.

Demo mode (no MT5 required)

Don't have MT5 installed? Run the offline demo that feeds synthetic backtest results through the same AI loop and dashboard:

python -m demo.run_demo

This is the path to use if you're a hackathon judge — you'll see the full thinking feed, parameterchange panel, validation phase, and verdict screen without needing a Windows machine with MT5.


Configuration cheatsheet

Key What it does
ai.enabled Master toggle for the AI reasoning layer.
ai.model claude-opus-4-7 (best), claude-sonnet-4-6 (balanced), claude-haiku-4-5 (fast).
thresholds.min_profit_factor / min_calmar Quality gates a result must clear.
optimization.max_iterations Hard cap on AI loop iterations.
mt5.terminal_exe Full path to terminal64.exe.
periods.train_* / validate_* / oos_* Train + walkforward validation date ranges.

The full schema lives in config.example.yaml with comments.


Project layout

MT5_Optimizer/
├── app.py                    Flask + SocketIO server (entry point)
├── config.example.yaml       Configuration template
├── analysis/
│   └── ai_reasoner.py        Claude API client (analyze + suggest_next_params)
├── optimizer/
│   ├── pipeline.py           3phase pipeline orchestrator
│   ├── ai_guided_loop.py     Autonomous AI iteration loop
│   ├── result_ranker.py      Scoring & ranking of runs
│   └── session_config.py     Perrun config dataclass
├── ea/
│   └── schema.py             EA parameter schema + clamp/validation
├── mt5/                      MT5 launcher, ini builder, html report parser
├── reports/
│   └── writer.py             Perrun HTML/CSV/JSON output
├── ui/
│   ├── templates/            dashboard.html, setup.html, reports_index.html
│   └── static/js/dashboard.js  All clientside logic
└── tests/

See PROJECT_HANDOFF.md for a deeper architectural tour.


Live events (SocketIO)

The dashboard subscribes to these — useful if you want to plug a different UI on top:

Event When it fires Payload (key fields)
phase_start Each phase begins phase, total, mode
run_complete Any backtest finishes run_id, phase, net_profit, profit_factor, calmar, max_drawdown, score, params
ai_thinking AI narrates a decision msg, kind (info/reasoning/decision/success/warning/hypothesis), iteration, phase
ai_iteration_start / ai_iteration_complete Each AI loop iteration iteration, analysis, change_records, confidence, goal_status
param_changes Periteration parameter diff iteration, changes:[{param, from, to, reason}], confidence
validation_start / validation_run_start / validation_run_complete / validation_done Phase 3 visibility kind (oos/sensitivity), metrics, passing
early_termination Pipeline stops before max_iterations reason (targets_met/no_profit/budget_exhausted/stuck_escape/user_stop), message, details
optimization_complete Run finished verdict, best_run_id, set_file_url, full metrics

Contributing

Bug reports + PRs welcome. The codebase is intentionally small enough to read in an hour:

  • optimizer/pipeline.py orchestrates phases.
  • optimizer/ai_guided_loop.py is the autonomous loop.
  • ui/static/js/dashboard.js is one file; no frontend build step.

Run tests with pytest. There's no CI yet — fix that and we'll merge it.


License

MIT — see LICENSE. Use it, fork it, ship it.

Built with Anthropic Claude for the reasoning layer and MetaTrader 5 for the backtests. APEX is independent of and not endorsed by either.

Languages
Python 56.2%
HTML 27.3%
JavaScript 12.8%
CSS 2.3%
MQL5 1.3%
Other 0.1%