Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fef0db3c4 | ||
|
|
95ceef3e3f | ||
|
|
662e9e324c | ||
|
|
6d1f940887 | ||
|
|
41c8b36826 | ||
|
|
42318b040a | ||
|
|
fdb45b8eed | ||
|
|
b63bda64ab | ||
|
|
cbed3d15af | ||
|
|
8cce92c409 |
Generated
+1
-1
@@ -481,7 +481,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mt5-quant"
|
name = "mt5-quant"
|
||||||
version = "1.28.0"
|
version = "1.29.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "mt5-quant"
|
name = "mt5-quant"
|
||||||
version = "1.28.0"
|
version = "1.29.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "MT5-Quant MCP Server - Exposes MT5 backtest and optimization tools via MCP"
|
description = "MT5-Quant MCP Server - Exposes MT5 backtest and optimization tools via MCP"
|
||||||
authors = ["masdevid <masdevid@example.com>"]
|
authors = ["masdevid <masdevid@example.com>"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# MT5-Quant
|
# MT5-Quant
|
||||||
|
|
||||||
**MCP server for MT5 strategy development on macOS/Linux.** 43 tools to compile, backtest, analyze, and optimize MQL5 Expert Advisors — no Windows required.
|
**MCP server for MT5 strategy development on macOS/Linux.** 57 tools to compile, backtest, analyze, optimize, and manage MQL5 Expert Advisors — no Windows required.
|
||||||
|
|
||||||
```
|
```
|
||||||
You: "Backtest MyEA Jan-Mar, what caused the February drawdown?"
|
You: "Backtest MyEA Jan-Mar, what caused the February drawdown?"
|
||||||
@@ -23,15 +23,61 @@ Claude: [compile → clean → backtest → analyze 1,847 deals]
|
|||||||
|
|
||||||
## Quick Install
|
## Quick Install
|
||||||
|
|
||||||
|
### 1. Download & Setup
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -L -o mt5.tar.gz https://github.com/masdevid/mt5-mcp/releases/latest/download/mt5-quant-macos-arm64.tar.gz
|
curl -L -o mt5.tar.gz https://github.com/masdevid/mt5-mcp/releases/latest/download/mt5-quant-macos-arm64.tar.gz
|
||||||
tar -xzf mt5.tar.gz
|
tar -xzf mt5.tar.gz
|
||||||
bash scripts/setup.sh
|
bash scripts/setup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Register MCP Server
|
||||||
|
|
||||||
|
#### Claude Code
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Navigate to your project directory first
|
||||||
|
cd /path/to/your/mt5-quant
|
||||||
|
|
||||||
|
# Register MCP server (requires absolute path)
|
||||||
claude mcp add MT5-Quant -- $(pwd)/mt5-quant
|
claude mcp add MT5-Quant -- $(pwd)/mt5-quant
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
claude mcp list
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Windsurf
|
||||||
|
|
||||||
|
Add to `~/.windsurf/config.yaml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
mcpServers:
|
||||||
|
mt5-quant:
|
||||||
|
command: /absolute/path/to/mt5-quant
|
||||||
|
env:
|
||||||
|
MT5_MCP_HOME: /absolute/path/to/mt5-quant
|
||||||
|
```
|
||||||
|
|
||||||
|
Or use the config command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get absolute path
|
||||||
|
which mt5-quant
|
||||||
|
|
||||||
|
# Add to Windsurf config
|
||||||
|
cat >> ~/.windsurf/config.yaml << EOF
|
||||||
|
mcpServers:
|
||||||
|
mt5-quant:
|
||||||
|
command: $(which mt5-quant)
|
||||||
|
env:
|
||||||
|
MT5_MCP_HOME: $(dirname $(which mt5-quant))
|
||||||
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
**[Full Setup →](docs/QUICKSTART.md)**
|
**[Full Setup →](docs/QUICKSTART.md)**
|
||||||
|
|
||||||
|
> **Note:** MCP servers require **absolute paths**. Use `$(pwd)` or full path like `/Users/name/mt5-quant/mt5-quant`, not relative paths like `./mt5-quant`.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -47,12 +93,12 @@ The AI runs the full pipeline: compile → clean cache → backtest → extract
|
|||||||
| [QUICKSTART.md](docs/QUICKSTART.md) | Complete setup for macOS/Linux |
|
| [QUICKSTART.md](docs/QUICKSTART.md) | Complete setup for macOS/Linux |
|
||||||
| [CONFIG.md](docs/CONFIG.md) | Configuration reference |
|
| [CONFIG.md](docs/CONFIG.md) | Configuration reference |
|
||||||
| [WINDSURF.md](docs/WINDSURF.md) | Windsurf IDE integration |
|
| [WINDSURF.md](docs/WINDSURF.md) | Windsurf IDE integration |
|
||||||
| [TOOLS.md](docs/MCP_TOOLS.md) | All 43 tools (31 documented) |
|
| [TOOLS.md](docs/MCP_TOOLS.md) | All 57 tools documented |
|
||||||
| [ARCHITECTURE.md](docs/ARCHITECTURE.md) | Design and internals |
|
| [ARCHITECTURE.md](docs/ARCHITECTURE.md) | Design and internals |
|
||||||
| [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) | Common issues |
|
| [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) | Common issues |
|
||||||
| [REMOTE_AGENTS.md](docs/REMOTE_AGENTS.md) | Linux optimization agents |
|
| [REMOTE_AGENTS.md](docs/REMOTE_AGENTS.md) | Linux optimization agents |
|
||||||
|
|
||||||
## MCP Tools (43)
|
## MCP Tools (57)
|
||||||
|
|
||||||
### Core workflow
|
### Core workflow
|
||||||
|
|
||||||
@@ -120,6 +166,30 @@ Use these for targeted analysis, or `analyze_report` to run all at once.
|
|||||||
| `cache_status` | MT5 tester cache size breakdown by symbol — check before cleaning |
|
| `cache_status` | MT5 tester cache size breakdown by symbol — check before cleaning |
|
||||||
| `clean_cache` | Delete tester cache files; supports per-symbol and `dry_run` |
|
| `clean_cache` | Delete tester cache files; supports per-symbol and `dry_run` |
|
||||||
|
|
||||||
|
### Pre-flight & Validation
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `get_active_account` | Get current MT5 account session (login, server, available symbols) |
|
||||||
|
| `check_symbol_data_status` | Validate symbol has sufficient history data for date range |
|
||||||
|
| `check_mt5_status` | Check if MT5 terminal is installed and ready |
|
||||||
|
| `validate_ea_syntax` | Pre-compile syntax check without running full compilation |
|
||||||
|
|
||||||
|
### Project Management
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `init_project` | Scaffold new MQL5 project with templates (scalper/swing/grid/basic) |
|
||||||
|
| `create_set_template` | Generate .set parameter file from EA input variables |
|
||||||
|
| `export_report` | Export backtest report to CSV, JSON, or Markdown |
|
||||||
|
|
||||||
|
### History & Comparison
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `get_backtest_history` | List all backtests for EA/symbol with summary metrics |
|
||||||
|
| `compare_backtests` | Compare 2+ backtest results side-by-side with analysis |
|
||||||
|
|
||||||
### .set file — read / write
|
### .set file — read / write
|
||||||
|
|
||||||
| Tool | Description |
|
| Tool | Description |
|
||||||
@@ -138,6 +208,16 @@ Use these for targeted analysis, or `analyze_report` to run all at once.
|
|||||||
| `diff_set_files` | Side-by-side diff of two `.set` files — only changed params returned |
|
| `diff_set_files` | Side-by-side diff of two `.set` files — only changed params returned |
|
||||||
| `set_from_optimization` | Generate a clean backtest `.set` from `get_optimization_results` params; optionally narrow sweep |
|
| `set_from_optimization` | Generate a clean backtest `.set` from `get_optimization_results` params; optionally narrow sweep |
|
||||||
|
|
||||||
|
### Search & Discovery
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `search_experts` | Search EAs by name pattern across all directories |
|
||||||
|
| `search_indicators` | Search indicators by name pattern |
|
||||||
|
| `search_scripts` | Search scripts by name pattern |
|
||||||
|
| `copy_indicator_to_project` | Copy indicator to project directory |
|
||||||
|
| `copy_script_to_project` | Copy script to project directory |
|
||||||
|
|
||||||
Full schema: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md)
|
Full schema: [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md)
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|||||||
+347
-3
@@ -2,11 +2,13 @@
|
|||||||
|
|
||||||
Full input/output schemas for MT5-Quant tools.
|
Full input/output schemas for MT5-Quant tools.
|
||||||
|
|
||||||
> **Documentation Status:** This file documents 31 of 43 total tools. Missing:
|
> **Documentation Status:** This file documents 49 of 57 total tools. Missing:
|
||||||
> - `list_experts`, `list_indicators`, `list_scripts`
|
> - `list_experts`, `list_indicators`, `list_scripts`
|
||||||
> - `healthcheck`
|
> - `healthcheck`, `list_symbols`
|
||||||
> - `search_reports`, `get_latest_report`
|
> - `search_reports`, `get_latest_report`, `list_reports`, `prune_reports`, `tail_log`
|
||||||
> - Granular analytics: `analyze_monthly_pnl`, `analyze_drawdown_events`, `analyze_top_losses`, `analyze_loss_sequences`, `analyze_position_pairs`, `analyze_direction_bias`, `analyze_streaks`, `analyze_concurrent_peak`
|
> - Granular analytics: `analyze_monthly_pnl`, `analyze_drawdown_events`, `analyze_top_losses`, `analyze_loss_sequences`, `analyze_position_pairs`, `analyze_direction_bias`, `analyze_streaks`, `analyze_concurrent_peak`
|
||||||
|
> - Archive/history tools: `archive_report`, `archive_all_reports`, `get_history`, `annotate_history`, `promote_to_baseline`
|
||||||
|
> - Experts search: `search_experts`, `search_indicators`, `search_scripts`, `copy_indicator_to_project`, `copy_script_to_project`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -1237,6 +1239,323 @@ List all `.set` files in the MT5 tester profiles directory with param counts, sw
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## `get_active_account`
|
||||||
|
|
||||||
|
Get current MT5 account session information: login, server, and available symbols. This is essential for pre-flight checks to ensure symbol availability before backtesting.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{} // No parameters
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
ready_for_backtest: boolean; // true if account exists and symbols available
|
||||||
|
account: {
|
||||||
|
login: string;
|
||||||
|
server: string;
|
||||||
|
} | null;
|
||||||
|
server: string; // Active server name
|
||||||
|
available_servers: string[]; // All servers with history data
|
||||||
|
symbols: string[]; // Symbols available for active server
|
||||||
|
symbol_count: number;
|
||||||
|
hint: string; // "Ready for backtesting" or instructions
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `check_symbol_data_status`
|
||||||
|
|
||||||
|
Validate if a symbol has sufficient historical tick data for a specified date range before running backtest. Prevents failed backtests due to missing history data.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
symbol: string; // e.g., "XAUUSDc"
|
||||||
|
from_date: string; // "YYYY.MM.DD"
|
||||||
|
to_date: string; // "YYYY.MM.DD"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
symbol: string;
|
||||||
|
server: string;
|
||||||
|
has_sufficient_data: boolean;
|
||||||
|
requested_range: { from: string; to: string };
|
||||||
|
data_range: string; // "YYYY.MM.DD - YYYY.MM.DD" or "unknown"
|
||||||
|
years_available: number; // Count of years with data
|
||||||
|
hcc_files_count: number; // Number of history cache files
|
||||||
|
warnings: string[] | null; // Data range issues
|
||||||
|
suggestion: string; // Action recommendation
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `check_mt5_status`
|
||||||
|
|
||||||
|
Check if MT5 terminal is properly installed and configured. Returns comprehensive status of all required components.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{} // No parameters
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
terminal_ready: boolean; // true if all components present
|
||||||
|
checks: {
|
||||||
|
mt5_dir_exists: boolean;
|
||||||
|
terminal64_exe: boolean;
|
||||||
|
metaeditor64_exe: boolean;
|
||||||
|
metatester64_exe: boolean;
|
||||||
|
wine_executable: boolean;
|
||||||
|
wine_path: string | null;
|
||||||
|
};
|
||||||
|
mt5_version: string | null;
|
||||||
|
current_account: {
|
||||||
|
login: string;
|
||||||
|
server: string;
|
||||||
|
} | null;
|
||||||
|
hint: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `get_backtest_history`
|
||||||
|
|
||||||
|
List all backtests previously run for a specific EA and/or symbol with summary metrics. Use for tracking performance over time.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
expert?: string; // Filter by EA name
|
||||||
|
symbol?: string; // Filter by symbol
|
||||||
|
limit?: number; // Max results (default: 10)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
count: number;
|
||||||
|
total: number;
|
||||||
|
filters: {
|
||||||
|
expert: string | null;
|
||||||
|
symbol: string | null;
|
||||||
|
};
|
||||||
|
history: Array<{
|
||||||
|
report_dir: string;
|
||||||
|
date: string | null;
|
||||||
|
expert: string | null;
|
||||||
|
symbol: string | null;
|
||||||
|
period: string | null;
|
||||||
|
profit: number | null;
|
||||||
|
profit_factor: number | null;
|
||||||
|
expected_payoff: number | null;
|
||||||
|
drawdown_pct: number | null;
|
||||||
|
total_trades: number | null;
|
||||||
|
win_rate: number | null;
|
||||||
|
}>;
|
||||||
|
hint: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `compare_backtests`
|
||||||
|
|
||||||
|
Compare two or more backtest results side-by-side with key metrics analysis. Includes profit/drawdown differences and verdict on which performed better.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
report_dirs: string[]; // List of report directory paths to compare
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
count: number;
|
||||||
|
comparisons: Array<{
|
||||||
|
report_dir: string;
|
||||||
|
expert: string | null;
|
||||||
|
symbol: string | null;
|
||||||
|
net_profit: number | null;
|
||||||
|
profit_factor: number | null;
|
||||||
|
drawdown_pct: number | null;
|
||||||
|
total_trades: number | null;
|
||||||
|
win_rate: number | null;
|
||||||
|
expected_payoff: number | null;
|
||||||
|
recovery_factor: number | null;
|
||||||
|
sharpe_ratio: number | null;
|
||||||
|
}>;
|
||||||
|
analysis: Array<{
|
||||||
|
compare_to: string | null;
|
||||||
|
report: string | null;
|
||||||
|
profit_diff: number;
|
||||||
|
profit_pct_change: number;
|
||||||
|
drawdown_diff: number;
|
||||||
|
profit_factor_diff: number;
|
||||||
|
verdict: "better" | "worse" | "mixed";
|
||||||
|
}> | null;
|
||||||
|
verdict: string | null; // "Best: <report_dir>"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `init_project`
|
||||||
|
|
||||||
|
Create a new MQL5 project with standard directory structure and template files. Supports scalper, swing, grid, and basic templates.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
name: string; // Project name (used for EA filename)
|
||||||
|
template?: "scalper" | "swing" | "grid" | "basic"; // Default: "basic"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
project_name: string;
|
||||||
|
template: string;
|
||||||
|
created_files: string[]; // Paths to created files
|
||||||
|
hint: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `validate_ea_syntax`
|
||||||
|
|
||||||
|
Perform pre-compile syntax check on MQL5 source file without running full compilation. Detects common issues before expensive MetaEditor compilation.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
path: string; // Path to .mq5 source file
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
valid: boolean;
|
||||||
|
path: string;
|
||||||
|
checks: {
|
||||||
|
has_on_init: boolean;
|
||||||
|
has_on_tick: boolean;
|
||||||
|
has_on_deinit: boolean;
|
||||||
|
lines: number;
|
||||||
|
};
|
||||||
|
errors: Array<{
|
||||||
|
line: number;
|
||||||
|
message: string;
|
||||||
|
severity: "error";
|
||||||
|
}> | null;
|
||||||
|
warnings: Array<{
|
||||||
|
line: number;
|
||||||
|
message: string;
|
||||||
|
severity: "warning";
|
||||||
|
}> | null;
|
||||||
|
hint: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `create_set_template`
|
||||||
|
|
||||||
|
Generate a .set parameter file template based on an EA's input variables. Automatically parses input declarations from source code.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
ea: string; // EA name or path to .mq5/.ex5 file
|
||||||
|
output_path?: string; // Optional custom output path
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
ea: string;
|
||||||
|
inputs_found: number;
|
||||||
|
inputs: Array<{
|
||||||
|
name: string;
|
||||||
|
type: string;
|
||||||
|
default: string;
|
||||||
|
description: string | null;
|
||||||
|
}>;
|
||||||
|
set_file: string; // Path to generated file
|
||||||
|
hint: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `export_report`
|
||||||
|
|
||||||
|
Export backtest report to various formats (CSV, JSON, Markdown) for external analysis or sharing.
|
||||||
|
|
||||||
|
### Input schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
report_dir: string; // Path to backtest report directory
|
||||||
|
format?: "csv" | "json" | "md"; // Default: "csv"
|
||||||
|
output_path?: string; // Optional custom output file path
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
success: boolean;
|
||||||
|
format: string;
|
||||||
|
output_file: string;
|
||||||
|
source: string;
|
||||||
|
hint: string;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## `archive_report`
|
## `archive_report`
|
||||||
|
|
||||||
Convert a backtest report directory into a compact JSON entry appended to `config/backtest_history.json`. Idempotent — re-archiving the same report is a no-op. Optionally deletes the source directory to reclaim disk space.
|
Convert a backtest report directory into a compact JSON entry appended to `config/backtest_history.json`. Idempotent — re-archiving the same report is a no-op. Optionally deletes the source directory to reclaim disk space.
|
||||||
@@ -1527,6 +1846,31 @@ clean_cache(symbol=XAUUSD, dry_run=true) → preview
|
|||||||
clean_cache(symbol=XAUUSD) → execute
|
clean_cache(symbol=XAUUSD) → execute
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Pre-flight validation
|
||||||
|
|
||||||
|
```
|
||||||
|
get_active_account() → current login, server, available symbols
|
||||||
|
check_symbol_data_status(symbol=XAUUSD, from=2025.01.01, to=2025.03.31)
|
||||||
|
→ verify data availability before backtest
|
||||||
|
check_mt5_status() → verify MT5 installation and readiness
|
||||||
|
validate_ea_syntax(path=MyEA.mq5) → pre-compile syntax check
|
||||||
|
```
|
||||||
|
|
||||||
|
### Project management
|
||||||
|
|
||||||
|
```
|
||||||
|
init_project(name=MyStrategy, template=scalper) → scaffold new EA with template
|
||||||
|
create_set_template(ea=MyEA) → generate .set from EA inputs
|
||||||
|
export_report(report_dir=..., format=csv) → export to CSV/JSON/Markdown
|
||||||
|
```
|
||||||
|
|
||||||
|
### History and comparison
|
||||||
|
|
||||||
|
```
|
||||||
|
get_backtest_history(expert=MyEA, limit=10) → list past backtests with metrics
|
||||||
|
compare_backtests(report_dirs=["dir1", "dir2"]) → side-by-side comparison
|
||||||
|
```
|
||||||
|
|
||||||
### Working with set files
|
### Working with set files
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
+5
-4
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/modelcontextprotocol/specification/main/schema/2024-11-05/schema.json",
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
||||||
"name": "io.github.masdevid/mt5-quant",
|
"name": "io.github.masdevid/mt5-quant",
|
||||||
"title": "MT5-Quant",
|
"title": "MT5-Quant",
|
||||||
"description": "MCP server for MT5 strategy development. Compile, backtest, analyze MQL5 EAs on macOS/Linux.",
|
"description": "MCP server for MT5 strategy development. Compile, backtest, analyze MQL5 EAs on macOS/Linux.",
|
||||||
@@ -7,12 +7,13 @@
|
|||||||
"url": "https://github.com/masdevid/mt5-quant",
|
"url": "https://github.com/masdevid/mt5-quant",
|
||||||
"source": "github"
|
"source": "github"
|
||||||
},
|
},
|
||||||
"version": "1.27.0",
|
"version": "1.29.0",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"registryType": "mcpb",
|
"registryType": "mcpb",
|
||||||
"identifier": "https://github.com/masdevid/mt5-quant/releases/download/v1.27.0/mcp-mt5-quant-macos-arm64.tar.gz",
|
"version": "1.29.0",
|
||||||
"fileSha256": "e4dd26f2fa920e22575c88546e4d0dc54ec34d51950f3c58bfdf3a3f10b8a9a4",
|
"identifier": "https://github.com/masdevid/mt5-quant/releases/download/v1.29.0/mcp-mt5-quant-macos-arm64.tar.gz",
|
||||||
|
"fileSha256": "5d56099e01c6df0c16bc8aa28fffab2e3ba7502f283c3c8273b70e4192230f01",
|
||||||
"transport": {
|
"transport": {
|
||||||
"type": "stdio"
|
"type": "stdio"
|
||||||
},
|
},
|
||||||
|
|||||||
+16
-1
@@ -40,8 +40,11 @@ pub struct McpRequest {
|
|||||||
#[derive(Debug, serde::Deserialize, serde::Serialize)]
|
#[derive(Debug, serde::Deserialize, serde::Serialize)]
|
||||||
pub struct McpResponse {
|
pub struct McpResponse {
|
||||||
jsonrpc: String,
|
jsonrpc: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
id: Option<Value>,
|
id: Option<Value>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
result: Option<Value>,
|
result: Option<Value>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
error: Option<McpError>,
|
error: Option<McpError>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,6 +52,7 @@ pub struct McpResponse {
|
|||||||
pub struct McpError {
|
pub struct McpError {
|
||||||
code: i32,
|
code: i32,
|
||||||
message: String,
|
message: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
data: Option<Value>,
|
data: Option<Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +82,9 @@ pub struct ToolCapabilities {
|
|||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
tracing_subscriber::fmt::init();
|
tracing_subscriber::fmt()
|
||||||
|
.with_writer(std::io::stderr)
|
||||||
|
.init();
|
||||||
|
|
||||||
let cli = Cli::parse();
|
let cli = Cli::parse();
|
||||||
|
|
||||||
@@ -111,6 +117,11 @@ async fn run_stdio_server() -> Result<()> {
|
|||||||
let server_clone = server.clone();
|
let server_clone = server.clone();
|
||||||
match serde_json::from_str::<McpRequest>(line) {
|
match serde_json::from_str::<McpRequest>(line) {
|
||||||
Ok(request) => {
|
Ok(request) => {
|
||||||
|
// Notifications have no id — don't send a response
|
||||||
|
if request.id.is_none() {
|
||||||
|
server_clone.handle_notification(request).await;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let response = server_clone.handle_request(request).await;
|
let response = server_clone.handle_request(request).await;
|
||||||
let response_json = serde_json::to_string(&response)?;
|
let response_json = serde_json::to_string(&response)?;
|
||||||
println!("{}", response_json);
|
println!("{}", response_json);
|
||||||
@@ -180,6 +191,10 @@ async fn handle_connection(socket: tokio::net::TcpStream) -> Result<()> {
|
|||||||
|
|
||||||
match serde_json::from_str::<McpRequest>(line) {
|
match serde_json::from_str::<McpRequest>(line) {
|
||||||
Ok(request) => {
|
Ok(request) => {
|
||||||
|
if request.id.is_none() {
|
||||||
|
server.handle_notification(request).await;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let response = server.handle_request(request).await;
|
let response = server.handle_request(request).await;
|
||||||
let response_json = serde_json::to_string(&response)? + "\n";
|
let response_json = serde_json::to_string(&response)? + "\n";
|
||||||
writer.write_all(response_json.as_bytes()).await?;
|
writer.write_all(response_json.as_bytes()).await?;
|
||||||
|
|||||||
+14
-3
@@ -99,6 +99,18 @@ impl McpServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Handle a notification (no id — no response sent)
|
||||||
|
pub async fn handle_notification(&self, request: McpRequest) {
|
||||||
|
match request.method.as_str() {
|
||||||
|
"notifications/initialized" => {
|
||||||
|
// Client confirms initialization is complete — no action needed
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
tracing::debug!("Unhandled notification: {}", request.method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn handle_request(&self, request: McpRequest) -> McpResponse {
|
pub async fn handle_request(&self, request: McpRequest) -> McpResponse {
|
||||||
match request.method.as_str() {
|
match request.method.as_str() {
|
||||||
"initialize" => {
|
"initialize" => {
|
||||||
@@ -123,9 +135,8 @@ impl McpServer {
|
|||||||
// Return immediately with fast status
|
// Return immediately with fast status
|
||||||
let server_info = json!({
|
let server_info = json!({
|
||||||
"name": "MT5-Quant",
|
"name": "MT5-Quant",
|
||||||
"version": "1.27.0",
|
"version": env!("CARGO_PKG_VERSION"),
|
||||||
"setup": {
|
"setup": {
|
||||||
"verified": null, // null = checking
|
|
||||||
"hint": "Auto-verification running... Use verify_setup tool for detailed status",
|
"hint": "Auto-verification running... Use verify_setup tool for detailed status",
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -164,7 +175,7 @@ impl McpServer {
|
|||||||
McpResponse {
|
McpResponse {
|
||||||
jsonrpc: "2.0".to_string(),
|
jsonrpc: "2.0".to_string(),
|
||||||
id: request.id,
|
id: request.id,
|
||||||
result: Some(crate::tools::get_tools_list()),
|
result: Some(json!({"tools": crate::tools::get_tools_list()})),
|
||||||
error: None,
|
error: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user