mql5-x-compile

SKILL.md

MQL5 X-Drive CLI Compilation

Compile MQL5 indicators/scripts via command line using X: drive mapping to avoid "Program Files" path spaces that cause silent compilation failures.

When to Use (Proactive Triggers)

ALWAYS use this skill after:

  • Editing any .mq5 file (indicator, script, EA)
  • Editing any .mqh file (library/include)
  • User says "compile", "build", "test it", "try it", "run it"
  • User asks to verify changes work
  • Making code changes that need validation

Also use when:

  • User mentions MetaEditor, compilation errors, or path issues
  • Exit code 1 appears (reminder: exit 1 is normal, check .ex5 file)
  • Need to verify .ex5 file was created

Prerequisites

X: drive must be mapped (one-time setup):

BOTTLE="$HOME/Library/Application Support/net.metaquotes.wine.metatrader5"
cd "$BOTTLE/dosdevices"
ln -s "../drive_c/Program Files/MetaTrader 5/MQL5" "x:"

Verify mapping exists:

ls -la "$BOTTLE/dosdevices/" | grep "x:"

Compilation Instructions

Step 1: Construct X: Drive Path

Convert standard path to X: drive format:

  • Standard: C:\Program Files\MetaTrader 5\MQL5\Indicators\Custom\MyIndicator.mq5
  • X: drive: X:\Indicators\Custom\MyIndicator.mq5

Pattern: Remove Program Files/MetaTrader 5/MQL5/ prefix, replace with X:\

Step 2: Execute Compilation

WINE="/Applications/MetaTrader 5.app/Contents/SharedSupport/wine/bin/wine64"
WINEPREFIX="$HOME/Library/Application Support/net.metaquotes.wine.metatrader5"
ME="C:/Program Files/MetaTrader 5/MetaEditor64.exe"

# Compile using X: drive path
WINEPREFIX="$WINEPREFIX" "$WINE" "$ME" \
  /log \
  /compile:"X:\\Indicators\\Custom\\YourFile.mq5" \
  /inc:"X:"

Critical flags:

  • /log: Enable compilation logging
  • /compile:"X:\\...": Source file (X: drive path with escaped backslashes)
  • /inc:"X:": Include directory (X: drive root = MQL5 folder)

Step 3: Verify Compilation

CRITICAL: Wine returns exit code 1 even on successful compilation. Ignore the exit code - always verify by checking the .ex5 file and per-file log.

Check if .ex5 file was created:

BOTTLE="$HOME/Library/Application Support/net.metaquotes.wine.metatrader5"
EX5_FILE="$BOTTLE/drive_c/Program Files/MetaTrader 5/MQL5/Indicators/Custom/YourFile.ex5"
LOG_FILE="$BOTTLE/drive_c/Program Files/MetaTrader 5/MQL5/Indicators/Custom/YourFile.log"

# Check .ex5 exists with recent timestamp
if [ -f "$EX5_FILE" ]; then
  ls -lh "$EX5_FILE"
  echo "✅ Compilation successful"
else
  echo "❌ Compilation failed"
fi

# Check per-file log (UTF-16LE, but often readable with cat)
cat "$LOG_FILE" | grep -i "error\|warning\|Result"

Per-file log location: The .log file is created in the same directory as the .mq5 file (e.g., Fvg.mq5Fvg.log). This is more reliable than logs/metaeditor.log.

Common Patterns

Example 1: Compile CCI Neutrality Indicator

WINE="/Applications/MetaTrader 5.app/Contents/SharedSupport/wine/bin/wine64"
WINEPREFIX="$HOME/Library/Application Support/net.metaquotes.wine.metatrader5"
WINEPREFIX="$WINEPREFIX" "$WINE" "C:/Program Files/MetaTrader 5/MetaEditor64.exe" \
  /log \
  /compile:"X:\\Indicators\\Custom\\Development\\CCINeutrality\\CCI_Neutrality_RoC_DEBUG.mq5" \
  /inc:"X:"

# Result: CCI_Neutrality_RoC_DEBUG.ex5 created (23KB)

Example 2: Compile Script

WINEPREFIX="$WINEPREFIX" "$WINE" "C:/Program Files/MetaTrader 5/MetaEditor64.exe" \
  /log \
  /compile:"X:\\Scripts\\DataExport\\ExportAligned.mq5" \
  /inc:"X:"

Example 3: Verify X: Drive Mapping

WINE="/Applications/MetaTrader 5.app/Contents/SharedSupport/wine/bin/wine64"
WINEPREFIX="$HOME/Library/Application Support/net.metaquotes.wine.metatrader5"
WINEPREFIX="$WINEPREFIX" "$WINE" cmd /c "dir X:\" | head -10
# Should list: Indicators, Scripts, Include, Experts, etc.

Troubleshooting

Issue: Exit code 1 but compilation succeeded

Cause: Wine always returns exit code 1, even on success Solution: Ignore exit code. Always verify by:

  1. Check .ex5 file exists with recent timestamp: ls -la YourFile.ex5
  2. Check per-file log for "0 errors, 0 warnings": cat YourFile.log

Issue: 42 errors, include file not found

Cause: Compiling from simple path (e.g., C:/file.mq5) without X: drive Solution: Use X: drive path with /inc:"X:" flag

Issue: Exit code 0 but no .ex5 file

Cause: Path contains spaces or special characters Solution: Use X: drive path exclusively (no spaces)

Issue: X: drive not found

Cause: Symlink not created Solution: Run prerequisite setup to create x: symlink in dosdevices

Issue: Wrong MetaTrader app path

Cause: MetaTrader 5.app path is different on this machine Solution: Verify with ls /Applications/MetaTrader\ 5.app

Issue: Can't find metaeditor.log

Cause: Looking in wrong location Solution: Use per-file log instead - it's in the same directory as your .mq5 file (e.g., Fvg.mq5 creates Fvg.log)

Benefits of X: Drive Method

Eliminates path spaces: No "Program Files" in path ✅ Faster compilation: ~1 second compile time ✅ Reliable: Works consistently unlike direct path compilation ✅ Includes resolved: /inc:"X:" finds all MQL5 libraries ✅ Simple paths: X:\Indicators\... instead of long absolute paths

Comparison: X: Drive vs Manual GUI

Method Speed Automation Reliability
X: drive CLI ~1s ✅ Yes ✅ High
Manual MetaEditor ~3s ❌ No ✅ High
Direct CLI path N/A ⚠️ Unreliable ❌ Fails silently

Integration with Git Workflow

X: drive mapping is persistent and git-safe:

  • Symlink stored in bottle's dosdevices/ folder
  • Doesn't affect MQL5 source files
  • Works across git branches
  • No configuration files to commit

Security Notes

  • X: drive is used for compilation, which generates .ex5 / .log files, resulting in write operations.
  • No execution of compiled files during compilation
  • MetaEditor runs in sandboxed Wine environment
  • No network access during compilation

Quick Reference

Compilation command template:

WINEPREFIX="$HOME/Library/Application Support/net.metaquotes.wine.metatrader5" \
  /Applications/MetaTrader\ 5.app/Contents/SharedSupport/wine/bin/wine64 \
  "C:/Program Files/MetaTrader 5/MetaEditor64.exe" \
  /log /compile:"X:\\Path\\To\\File.mq5" /inc:"X:"

Bottle location: ~/Library/Application Support/net.metaquotes.wine.metatrader5/

X: drive maps to: MQL5/ folder inside bottle

Verification: Check for .ex5 file and review per-file .log (ignore exit code - it's always 1)

Weekly Installs
16
First Seen
Jan 27, 2026
Installed on
gemini-cli15
opencode15
github-copilot14
codex13
amp13
kimi-cli13