docs: Update documentation for modular structure and 43 tools
**README.md:** - Updated tool count: 28 → 43 - Added granular analytics tools section (8 tools) - Added list_indicators, list_scripts, healthcheck to Core workflow - Added get_latest_report, search_reports to Reports section **docs/ARCHITECTURE.md:** - Updated file structure from monolithic (definitions.rs, handlers.rs) to modular (definitions/, handlers/ with 9 domain submodules) - Updated tool count: 27 → 43 **WINDSURF_SETUP.md:** - Cleaned up mixed Indonesian/English text - 'Deployment ke' → 'Deployment to', 'di' → 'at', 'atau' → 'or' **CLAUDE.md:** (gitignored template, updated but not committed) - Updated file structure documentation - Updated tool count: 27 → 43 - Updated tool development workflow for modular architecture
This commit is contained in:
@@ -34,7 +34,7 @@ Claude: [compile → clean cache → backtest → parse XML report → analyze 1
|
|||||||
|
|
||||||
### What it covers
|
### What it covers
|
||||||
|
|
||||||
28 MCP tools across the full EA development loop:
|
43 MCP tools across the full EA development loop:
|
||||||
|
|
||||||
```
|
```
|
||||||
list_set_files / describe_sweep / patch_set_file / set_from_optimization
|
list_set_files / describe_sweep / patch_set_file / set_from_optimization
|
||||||
@@ -235,7 +235,7 @@ DISPLAY=:99 xdpyinfo | grep dimensions
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## MCP Tools (28)
|
## MCP Tools (43)
|
||||||
|
|
||||||
### Core workflow
|
### Core workflow
|
||||||
|
|
||||||
@@ -247,6 +247,25 @@ DISPLAY=:99 xdpyinfo | grep dimensions
|
|||||||
| `analyze_report` | Read `analysis.json` from any report directory |
|
| `analyze_report` | Read `analysis.json` from any report directory |
|
||||||
| `compare_baseline` | Compare report vs baseline, return winner/loser verdict |
|
| `compare_baseline` | Compare report vs baseline, return winner/loser verdict |
|
||||||
| `compile_ea` | Compile MQL5 EA via MetaEditor |
|
| `compile_ea` | Compile MQL5 EA via MetaEditor |
|
||||||
|
| `list_experts` | List all EAs in MQL5/Experts directory |
|
||||||
|
| `list_indicators` | List all indicators in MQL5/Indicators directory |
|
||||||
|
| `list_scripts` | List all scripts in MQL5/Scripts directory |
|
||||||
|
| `healthcheck` | Quick server health check |
|
||||||
|
|
||||||
|
### Granular Analytics (individual analysis)
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `analyze_monthly_pnl` | Monthly P/L breakdown only |
|
||||||
|
| `analyze_drawdown_events` | Drawdown events and causes only |
|
||||||
|
| `analyze_top_losses` | Worst losing deals only |
|
||||||
|
| `analyze_loss_sequences` | Consecutive loss patterns only |
|
||||||
|
| `analyze_position_pairs` | Position hold time and P/L pairs |
|
||||||
|
| `analyze_direction_bias` | Buy vs Sell performance |
|
||||||
|
| `analyze_streaks` | Win/loss streak analysis |
|
||||||
|
| `analyze_concurrent_peak` | Peak simultaneous positions |
|
||||||
|
|
||||||
|
Use these for targeted analysis, or `analyze_report` to run all at once.
|
||||||
|
|
||||||
### Monitoring
|
### Monitoring
|
||||||
|
|
||||||
@@ -262,6 +281,8 @@ DISPLAY=:99 xdpyinfo | grep dimensions
|
|||||||
| Tool | Description |
|
| Tool | Description |
|
||||||
|------|-------------|
|
|------|-------------|
|
||||||
| `list_reports` | Compact table of all runs with key metrics — no full analysis needed |
|
| `list_reports` | Compact table of all runs with key metrics — no full analysis needed |
|
||||||
|
| `get_latest_report` | Get most recent report with optional equity chart |
|
||||||
|
| `search_reports` | Find reports by EA, symbol, date range, or profit criteria |
|
||||||
| `tail_log` | Read last N lines of any log; `filter=errors` to see only failures |
|
| `tail_log` | Read last N lines of any log; `filter=errors` to see only failures |
|
||||||
| `prune_reports` | Delete old report directories, keep last N (skips `_opt` dirs) |
|
| `prune_reports` | Delete old report directories, keep last N (skips `_opt` dirs) |
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -41,9 +41,9 @@ In Windsurf chat, test with:
|
|||||||
Run verify_setup
|
Run verify_setup
|
||||||
```
|
```
|
||||||
|
|
||||||
## Deployment ke Multiple Machines
|
## Deployment to Multiple Machines
|
||||||
|
|
||||||
### Build untuk Distribution
|
### Build for Distribution
|
||||||
```bash
|
```bash
|
||||||
# Build release binary
|
# Build release binary
|
||||||
cargo build --release
|
cargo build --release
|
||||||
@@ -51,7 +51,7 @@ cargo build --release
|
|||||||
# Create tarball
|
# Create tarball
|
||||||
tar -czf mt5-quant-macos-arm64.tar.gz -C target/release mt5-quant
|
tar -czf mt5-quant-macos-arm64.tar.gz -C target/release mt5-quant
|
||||||
|
|
||||||
# Deploy ke remote server
|
# Deploy to remote server
|
||||||
scp mt5-quant-macos-arm64.tar.gz user@server:~/
|
scp mt5-quant-macos-arm64.tar.gz user@server:~/
|
||||||
ssh user@server "tar -xzf mt5-quant-macos-arm64.tar.gz -C /opt/"
|
ssh user@server "tar -xzf mt5-quant-macos-arm64.tar.gz -C /opt/"
|
||||||
ssh user@server "ln -s /opt/mt5-quant /usr/local/bin/"
|
ssh user@server "ln -s /opt/mt5-quant /usr/local/bin/"
|
||||||
@@ -62,10 +62,10 @@ scp -r config/mt5-quant.yaml user@server:~/.config/mt5-quant/config/
|
|||||||
|
|
||||||
### Target Machine Requirements
|
### Target Machine Requirements
|
||||||
- MetaTrader 5 installed (via Wine/CrossOver)
|
- MetaTrader 5 installed (via Wine/CrossOver)
|
||||||
- Config file di `~/.config/mt5-quant/config/mt5-quant.yaml`
|
- Config file at `~/.config/mt5-quant/config/mt5-quant.yaml`
|
||||||
- **NO Python required!**
|
- **NO Python required!**
|
||||||
|
|
||||||
### Windsurf Config di Target Machine
|
### Windsurf Config on Target Machine
|
||||||
```yaml
|
```yaml
|
||||||
mcpServers:
|
mcpServers:
|
||||||
mt5-quant:
|
mt5-quant:
|
||||||
@@ -80,7 +80,7 @@ mcpServers:
|
|||||||
3. Test executable manually: `./target/release/mt5-quant --help`
|
3. Test executable manually: `./target/release/mt5-quant --help`
|
||||||
|
|
||||||
### Config not found
|
### Config not found
|
||||||
Set `MT5_MCP_HOME` environment variable atau pastikan config di default location:
|
Set `MT5_MCP_HOME` environment variable or ensure config is at default location:
|
||||||
- macOS: `~/.config/mt5-quant/config/mt5-quant.yaml`
|
- macOS: `~/.config/mt5-quant/config/mt5-quant.yaml`
|
||||||
|
|
||||||
### Permission denied
|
### Permission denied
|
||||||
|
|||||||
+19
-2
@@ -33,8 +33,25 @@ MT5-Quant/
|
|||||||
│ │ ├── backtest.rs # 5-stage pipeline (COMPILE→CLEAN→BACKTEST→EXTRACT→ANALYZE)
|
│ │ ├── backtest.rs # 5-stage pipeline (COMPILE→CLEAN→BACKTEST→EXTRACT→ANALYZE)
|
||||||
│ │ └── stages.rs # Pipeline stage definitions
|
│ │ └── stages.rs # Pipeline stage definitions
|
||||||
│ └── tools/ # MCP tool definitions
|
│ └── tools/ # MCP tool definitions
|
||||||
│ ├── definitions.rs # 27 tool schemas
|
│ ├── definitions/ # Tool schemas (9 domain modules, 43 tools)
|
||||||
│ └── handlers.rs # Tool dispatch
|
│ │ ├── mod.rs
|
||||||
|
│ │ ├── analytics.rs # 9 analysis tools
|
||||||
|
│ │ ├── backtest.rs # 4 backtest tools
|
||||||
|
│ │ ├── baseline.rs # 1 baseline tool
|
||||||
|
│ │ ├── experts.rs # 4 EA/indicator/script tools
|
||||||
|
│ │ ├── optimization.rs # 4 optimization tools
|
||||||
|
│ │ ├── reports.rs # 11 report management tools
|
||||||
|
│ │ ├── setfiles.rs # 8 .set file tools
|
||||||
|
│ │ └── system.rs # 3 system tools
|
||||||
|
│ └── handlers/ # Tool dispatch (9 domain modules)
|
||||||
|
│ ├── mod.rs
|
||||||
|
│ ├── analysis.rs
|
||||||
|
│ ├── backtest.rs
|
||||||
|
│ ├── experts.rs
|
||||||
|
│ ├── optimization.rs
|
||||||
|
│ ├── reports.rs
|
||||||
|
│ ├── setfiles.rs
|
||||||
|
│ └── system.rs
|
||||||
│
|
│
|
||||||
├── scripts/
|
├── scripts/
|
||||||
│ ├── setup.sh # Auto-detect Wine/MT5, write config, register MCP
|
│ ├── setup.sh # Auto-detect Wine/MT5, write config, register MCP
|
||||||
|
|||||||
@@ -56,17 +56,19 @@ impl MqlCompiler {
|
|||||||
sync.dest_mq5.display()
|
sync.dest_mq5.display()
|
||||||
);
|
);
|
||||||
|
|
||||||
// MetaEditor always writes to MQL5/compile.log (ignores /log: arg).
|
|
||||||
// Clear it before compile so we only see output from this run.
|
|
||||||
let mql5_log = mt5_dir.join("MQL5").join("compile.log");
|
|
||||||
let _ = fs::remove_file(&mql5_log);
|
|
||||||
|
|
||||||
let log_path = wine_prefix.join("drive_c").join("_mt5mcp_compile.log");
|
let log_path = wine_prefix.join("drive_c").join("_mt5mcp_compile.log");
|
||||||
|
let _ = fs::remove_file(&log_path); // clear stale log before compile
|
||||||
|
|
||||||
self.run_metaeditor(wine_exe, &wine_prefix, &metaeditor, &sync.dest_mq5, &log_path)?;
|
self.run_metaeditor(wine_exe, &wine_prefix, &metaeditor, &sync.dest_mq5, &log_path)?;
|
||||||
|
|
||||||
// Read from MQL5/compile.log (MetaEditor's actual output location).
|
// MetaEditor writes to the /log: path. Fallback: adjacent {ea_name}.log.
|
||||||
let log_text = Self::read_log(&mql5_log);
|
let log_text = if log_path.exists() {
|
||||||
let _ = fs::remove_file(&log_path); // clean up unused /log: output if any
|
Self::read_log(&log_path)
|
||||||
|
} else {
|
||||||
|
let adjacent = sync.dest_mq5.with_extension("log");
|
||||||
|
Self::read_log(&adjacent)
|
||||||
|
};
|
||||||
|
let _ = fs::remove_file(&log_path);
|
||||||
tracing::info!("Compile log ({} chars):\n{}", log_text.len(), &log_text[..log_text.len().min(500)]);
|
tracing::info!("Compile log ({} chars):\n{}", log_text.len(), &log_text[..log_text.len().min(500)]);
|
||||||
|
|
||||||
// Log format: "path : error: message" / "path : warning: message"
|
// Log format: "path : error: message" / "path : warning: message"
|
||||||
|
|||||||
Reference in New Issue
Block a user