MQL Developer
Guide for professional MQL4/MQL5 development on MetaTrader platforms.
Quick Reference Navigation
Load the appropriate reference file based on the task:
| Task |
Reference File |
| MQL4 syntax, types, functions, predefined vars |
references/mql4-reference.md |
| MQL5 syntax, OOP, CTrade, Standard Library |
references/mql5-reference.md |
| Project structure, EA architecture, design patterns |
references/architecture-patterns.md |
| Orders, positions, risk management, trailing stops |
references/trading-operations.md |
| Custom indicators, UI panels, scripts, chart objects |
references/indicators-and-ui.md |
| WebRequest, JSON, REST API, Node.js integration |
references/external-communication.md |
| Strategy Tester, optimization, walk-forward, Monte Carlo |
references/backtesting.md |
| Code protection, licensing, anti-decompilation |
references/security-licensing.md |
Search Patterns for Large References
For targeted lookup in large files, grep for these section headers:
mql4-reference.md: Data Types, Variables, Operators, Arrays, Strings, Program Types, Predefined Variables, Technical Indicator Functions, Order Management, Market Information, Account Functions, Preprocessor, Error Handling, Common Gotchas, File Operations, WebRequest, Utility Functions, Global Terminal Variables
architecture-patterns.md: Project Structure, Simple Single-File, Modular EA, State Machine, Multi-Timeframe, Multi-Symbol, Singleton, Strategy Pattern, Observer, Include File Design, Complete Templates
mql5-reference.md: OOP Features, Trade Functions, CTrade, Native Trade, Event Handlers, Standard Library, Key Enumerations, SQLite, Sockets, Resources, OpenCL
MQL4 vs MQL5 Key Differences
| Aspect |
MQL4 |
MQL5 |
| Paradigm |
Procedural (C-like) |
Full OOP (C++-like) |
| Trade model |
Orders only (OrderSend) |
Orders + Deals + Positions (CTrade) |
| Account model |
Hedging only |
Netting + Hedging |
| Indicator buffers |
Max 8 |
Max 512 |
| Draw styles |
6 basic |
18 (basic + color) |
| Standard Library |
Minimal |
Comprehensive |
| Database |
None |
SQLite built-in |
| Sockets |
None |
TCP + TLS |
| OpenCL |
No |
Yes |
Core Workflow
Creating an Expert Advisor
- Define strategy signal logic (entry/exit conditions)
- Choose architecture: simple (single-file) or modular (Signal + Trade + Risk + Filter)
- Implement order/position management with proper error handling and retries
- Add risk management (position sizing, drawdown control)
- Add filters (time, spread, volatility)
- Backtest with Strategy Tester (Open Prices first, then Every Tick)
- Walk-forward validate and Monte Carlo test
Creating a Custom Indicator
- Choose window:
indicator_chart_window or indicator_separate_window
- Define buffers and plots (
indicator_buffers, indicator_plots in MQL5)
- Implement
OnCalculate() with efficient recalculation using prev_calculated
- Set draw styles, colors, labels
- Handle multi-timeframe data if needed
Communicating with External APIs
- Whitelist URL in Tools > Options > Expert Advisors
- Use
WebRequest() for REST calls (POST/GET)
- Build JSON manually (MQL has no native JSON)
- Parse response with string functions
- Use
EventSetTimer() for polling patterns
- Handle network errors with retries
Critical Gotchas
- Double comparison: Never use
== with doubles. Use NormalizeDouble() or tolerance
- 4-digit vs 5-digit brokers: 1 pip = 1 point (4-digit) or 10 points (5-digit). Always detect
- Reverse loop for closing: Iterate
OrdersTotal()-1 down to 0 when closing orders (MQL4)
- ECN brokers: Some require two-step:
OrderSend() without SL/TP, then OrderModify()
- Filling policy (MQL5): Always detect via
SYMBOL_FILLING_MODE, never hardcode FOK
- WebRequest limitations: Synchronous/blocking, not available in indicators or Strategy Tester
- Trade context busy (MQL4): Only one EA can trade at a time per terminal
- Array indexing: Series arrays index 0 = newest bar. Use
ArraySetAsSeries() to control
Project Structure (Recommended)
MQL5/ (or MQL4/)
├── Experts/
│ └── MyEA/
│ └── MyEA.mq5 // EA entry point
├── Indicators/
│ └── MyIndicator.mq5
├── Scripts/
│ └── MyScript.mq5
├── Include/
│ ├── Core/
│ │ ├── CTradeManager.mqh // Order execution + retries
│ │ ├── CRiskManager.mqh // Position sizing + drawdown
│ │ └── CSignalBase.mqh // Signal interface
│ ├── Communication/
│ │ ├── CHttpClient.mqh // WebRequest wrapper
│ │ └── CJsonHelper.mqh // JSON build/parse
│ ├── UI/
│ │ └── CPanel.mqh // Trading panel
│ └── Utils/
│ ├── CTimeFilter.mqh // Session/time filters
│ └── CSymbolHelper.mqh // Multi-market helpers
└── Libraries/
For simpler projects, a single-file EA with inline functions is acceptable.
Code Style Conventions
- Prefix member variables with
m_ (e.g., m_magicNumber)
- Prefix global variables with
g_ (e.g., g_isInitialized)
- Use
input for user parameters, not extern
- Always use
#property strict in MQL4
- Normalize all prices before sending to server:
NormalizeDouble(price, Digits)
- Always check return values of
OrderSelect(), OrderSend(), trade operations
- Comment magic numbers and explain non-obvious trading logic
Official Documentation
1---
2name: mql-developer
3description: >
4 Comprehensive MQL4/MQL5 development for MetaTrader 4 and MetaTrader 5 platforms.
5 Use when writing, reviewing, debugging, or architecting: Expert Advisors (EAs),
6 custom indicators, scripts, libraries (.mqh), graphical panels, or any MQL code.
7 Also use for: order/position management, risk management, backtesting strategies,
8 communication with external APIs (WebRequest, REST, JSON), inter-program communication,
9 code protection/licensing, and MQL4-to-MQL5 migration. Covers the full MQL ecosystem
10 including trading automation, technical analysis, UI panels, and server integration.
11---1213
14# MQL Developer
15
16Guide for professional MQL4/MQL5 development on MetaTrader platforms.
17
18## Quick Reference Navigation
19
20Load the appropriate reference file based on the task:
21
22| Task | Reference File |
23|------|---------------|
24| MQL4 syntax, types, functions, predefined vars | [references/mql4-reference.md](references/mql4-reference.md) |
25| MQL5 syntax, OOP, CTrade, Standard Library | [references/mql5-reference.md](references/mql5-reference.md) |
26| Project structure, EA architecture, design patterns | [references/architecture-patterns.md](references/architecture-patterns.md) |
27| Orders, positions, risk management, trailing stops | [references/trading-operations.md](references/trading-operations.md) |
28| Custom indicators, UI panels, scripts, chart objects | [references/indicators-and-ui.md](references/indicators-and-ui.md) |
29| WebRequest, JSON, REST API, Node.js integration | [references/external-communication.md](references/external-communication.md) |
30| Strategy Tester, optimization, walk-forward, Monte Carlo | [references/backtesting.md](references/backtesting.md) |
31| Code protection, licensing, anti-decompilation | [references/security-licensing.md](references/security-licensing.md) |
32
33### Search Patterns for Large References
34
35For targeted lookup in large files, grep for these section headers:
36
37**mql4-reference.md:** `Data Types`, `Variables`, `Operators`, `Arrays`, `Strings`, `Program Types`, `Predefined Variables`, `Technical Indicator Functions`, `Order Management`, `Market Information`, `Account Functions`, `Preprocessor`, `Error Handling`, `Common Gotchas`, `File Operations`, `WebRequest`, `Utility Functions`, `Global Terminal Variables`
38
39**architecture-patterns.md:** `Project Structure`, `Simple Single-File`, `Modular EA`, `State Machine`, `Multi-Timeframe`, `Multi-Symbol`, `Singleton`, `Strategy Pattern`, `Observer`, `Include File Design`, `Complete Templates`
40
41**mql5-reference.md:** `OOP Features`, `Trade Functions`, `CTrade`, `Native Trade`, `Event Handlers`, `Standard Library`, `Key Enumerations`, `SQLite`, `Sockets`, `Resources`, `OpenCL`
42
43## MQL4 vs MQL5 Key Differences
44
45| Aspect | MQL4 | MQL5 |
46|--------|------|------|
47| Paradigm | Procedural (C-like) | Full OOP (C++-like) |
48| Trade model | Orders only (`OrderSend`) | Orders + Deals + Positions (`CTrade`) |
49| Account model | Hedging only | Netting + Hedging |
50| Indicator buffers | Max 8 | Max 512 |
51| Draw styles | 6 basic | 18 (basic + color) |
52| Standard Library | Minimal | Comprehensive |
53| Database | None | SQLite built-in |
54| Sockets | None | TCP + TLS |
55| OpenCL | No | Yes |
56
57## Core Workflow
58
59### Creating an Expert Advisor
60
611. Define strategy signal logic (entry/exit conditions)
622. Choose architecture: simple (single-file) or modular (Signal + Trade + Risk + Filter)
633. Implement order/position management with proper error handling and retries
644. Add risk management (position sizing, drawdown control)
655. Add filters (time, spread, volatility)
666. Backtest with Strategy Tester (Open Prices first, then Every Tick)
677. Walk-forward validate and Monte Carlo test
68
69### Creating a Custom Indicator
70
711. Choose window: `indicator_chart_window` or `indicator_separate_window`
722. Define buffers and plots (`indicator_buffers`, `indicator_plots` in MQL5)
733. Implement `OnCalculate()` with efficient recalculation using `prev_calculated`
744. Set draw styles, colors, labels
755. Handle multi-timeframe data if needed
76
77### Communicating with External APIs
78
791. Whitelist URL in Tools > Options > Expert Advisors
802. Use `WebRequest()` for REST calls (POST/GET)
813. Build JSON manually (MQL has no native JSON)
824. Parse response with string functions
835. Use `EventSetTimer()` for polling patterns
846. Handle network errors with retries
85
86## Critical Gotchas
87
88- **Double comparison**: Never use `==` with doubles. Use `NormalizeDouble()` or tolerance
89- **4-digit vs 5-digit brokers**: 1 pip = 1 point (4-digit) or 10 points (5-digit). Always detect
90- **Reverse loop for closing**: Iterate `OrdersTotal()-1` down to `0` when closing orders (MQL4)
91- **ECN brokers**: Some require two-step: `OrderSend()` without SL/TP, then `OrderModify()`
92- **Filling policy (MQL5)**: Always detect via `SYMBOL_FILLING_MODE`, never hardcode FOK
93- **WebRequest limitations**: Synchronous/blocking, not available in indicators or Strategy Tester
94- **Trade context busy (MQL4)**: Only one EA can trade at a time per terminal
95- **Array indexing**: Series arrays index 0 = newest bar. Use `ArraySetAsSeries()` to control
96
97## Project Structure (Recommended)
98
99```
100MQL5/ (or MQL4/)
101├── Experts/
102│ └── MyEA/
103│ └── MyEA.mq5 // EA entry point
104├── Indicators/
105│ └── MyIndicator.mq5
106├── Scripts/
107│ └── MyScript.mq5
108├── Include/
109│ ├── Core/
110│ │ ├── CTradeManager.mqh // Order execution + retries
111│ │ ├── CRiskManager.mqh // Position sizing + drawdown
112│ │ └── CSignalBase.mqh // Signal interface
113│ ├── Communication/
114│ │ ├── CHttpClient.mqh // WebRequest wrapper
115│ │ └── CJsonHelper.mqh // JSON build/parse
116│ ├── UI/
117│ │ └── CPanel.mqh // Trading panel
118│ └── Utils/
119│ ├── CTimeFilter.mqh // Session/time filters
120│ └── CSymbolHelper.mqh // Multi-market helpers
121└── Libraries/
122```
123
124For simpler projects, a single-file EA with inline functions is acceptable.
125
126## Code Style Conventions
127
128- Prefix member variables with `m_` (e.g., `m_magicNumber`)
129- Prefix global variables with `g_` (e.g., `g_isInitialized`)
130- Use `input` for user parameters, not `extern`
131- Always use `#property strict` in MQL4
132- Normalize all prices before sending to server: `NormalizeDouble(price, Digits)`
133- Always check return values of `OrderSelect()`, `OrderSend()`, trade operations
134- Comment magic numbers and explain non-obvious trading logic
135
136## Official Documentation
137
138- MQL4: https://docs.mql4.com/
139- MQL5: https://www.mql5.com/en/docs
140- MQL5 Articles: https://www.mql5.com/en/articles
141- MQL5 Code Base: https://www.mql5.com/en/code