MT5 Log Reader
Overview
Read MetaTrader 5 log files programmatically to access Print() output from indicators, scripts, and expert advisors. Implements dual logging pattern where Print() statements go to MT5 logs (human-readable) and CSV files provide structured data for validation.
When to Use
Use this skill when:
-
Validating MT5 indicator/script execution
-
Checking compilation or runtime errors
-
Analyzing Print() debug output from indicators
-
Verifying unit test results (Test_PatternDetector, Test_ArrowManager)
-
User mentions checking "Experts pane" or "log" manually
-
User asks "did it work?" or "check the output"
Log File Structure
Runtime Logs (Experts Pane)
MT5 runtime logs are stored at:
$MQL5_ROOT/Program Files/MetaTrader 5/MQL5/Logs/YYYYMMDD.log
File Format:
-
Encoding: UTF-16LE (Little Endian) - Read tool handles automatically
-
Structure: Tab-separated fields (timestamp, source, message)
-
Size: Grows throughout day (typically 10-100KB, can reach 5MB+)
Compilation Logs (Per-File)
MetaEditor creates a .log file next to each compiled .mq5 :
Example: Fvg.mq5 creates Fvg.log in the same directory
$MQL5_ROOT/Program Files/MetaTrader 5/MQL5/Indicators/Custom/Development/FVG/Fvg.log
File Format:
-
Encoding: UTF-16LE (often readable with plain cat )
-
Contains: Compilation progress, error count, warnings, timing
-
Success indicator: "0 errors, 0 warnings"
Important: Wine/CrossOver returns exit code 1 even on successful compilation. Always check the .log file or verify .ex5 exists.
Workflow
Step 1: Construct Log Path
Determine today's date and build the absolute path:
TODAY=$(date +"%Y%m%d") LOG_FILE="$MQL5_ROOT/Program Files/MetaTrader 5/MQL5/Logs/${TODAY}.log"
Step 2: Search for Relevant Entries
Use Grep tool to filter log entries (more efficient than reading entire file):
Pattern: indicator name, "error", "ERROR", "v0\.4\.0", "Phase 2", etc. Path: Log file from Step 1 Output mode: "content" -n: true (show line numbers) -A: 5 (show 5 lines after matches for context)
Common search patterns:
-
CCI Rising Test|CCI_Rising_Test
-
Find specific indicator output
-
error|ERROR|failed
-
Find error messages
-
v0\.4\.0|v0\.3\.0
-
Find specific version output
-
Phase \d+|Test arrow created
-
Find initialization messages
-
DEBUG Bar
-
Find calculation output
Step 3: Analyze Results
Check the grep output for:
-
Timestamps - Verify output matches expected execution time
-
Error messages - Identify specific failures with context
-
Version numbers - Confirm correct .ex5 file is loaded
-
DEBUG output - Validate calculation results
-
Test results - Verify unit test pass/fail status
Common Validation Patterns
Check indicator version loaded
After compilation, verify the new .ex5 file is loaded:
Search for version string in recent log entries
Pattern: "v0\.4\.0|=== CCI Rising Test" Output mode: content Context: -A 2
Look for initialization message with version number and timestamp matching the reload time.
Find runtime errors
Pattern: "error|ERROR|failed|Failed" Output mode: content Context: -A 3 -B 1 # Show 3 lines after, 1 before
Analyze error codes (e.g., 4003 = invalid time) and error context.
Monitor calculation output
Pattern: "DEBUG Bar" Output mode: content Context: -A 0 # No extra context needed -n: true # Show line numbers
Verify calculation values are reasonable (not EMPTY_VALUE, not reversed).
Verify test arrow creation
Pattern: "Phase 2|Test arrow created|Failed to create" Output mode: content Context: -A 2
Check for success message with timestamp.
Large Log Files
If log file exceeds 5MB (Read tool limit):
-
Use Grep exclusively (more efficient than reading entire file)
-
Use time-based filtering with -A and -B context
-
Search for specific indicator names to narrow results
Integration with Dual Logging
This skill accesses one half of the dual logging pattern:
-
MT5 Log Files (this skill) - Human-readable Print() output
-
CSV Files (CSVLogger.mqh) - Structured audit trails
Both are accessible programmatically without user intervention.
Security Considerations
-
Log files may contain sensitive trading data (symbol names, account info)
-
Do not expose absolute paths unnecessarily in user-facing output
-
Filter sensitive information when reporting results
-
No file modification operations allowed (read-only access)
Examples
Example 1: Verify indicator reloaded after compilation
User: "I reloaded the indicator, can you check if v0.4.0 is running?"
Action:
- Grep for "v0\.4\.0|CCI Rising Test v0\.4"
- Check most recent match timestamp
- Verify it's after compilation time (16:59)
Output: "Yes, v0.4.0 loaded at 17:01 on EURUSD M1 chart"
Example 2: Find why histogram is empty
User: "The last 19 bars are still empty, check the log"
Action:
- Grep for "DEBUG Bar|CCI=" pattern
- Look for EMPTY_VALUE or unusual values
- Check for error messages with -A 3 context
Output: "Found 'CCI=179769313486231570...' which is EMPTY_VALUE constant. The indicator didn't calculate CCI for those bars."
Example 3: Validate calculation fix
User: "Check if the absolute value fix is working"
Action:
- Grep for "DEBUG Bar.*\|CCI\|=" (looking for |CCI|= output)
- Compare with old format "DEBUG Bar.*CCI=" (without |CCI|)
- Check timestamp matches latest compilation
Output: "The log shows old format (no |CCI|=) at 16:56. Need to reload to get v0.4.0 from 16:59."
References
-
MT5 file locations: docs/guides/MT5_FILE_LOCATIONS.md
-
Dual logging implementation: docs/plans/cci-rising-pattern-marker.yaml Phase 3-4
-
CSVLogger library: Program Files/MetaTrader 5/MQL5/Indicators/Custom/Development/CCINeutrality/lib/CSVLogger.mqh