Referencia de Programación MQL5 — Tu Guía Rápida para EAs
Respuesta rápida: MQL5 es el lenguaje para crear EAs en MT5. En la mayoría de sistemas usarás repetidamente manejadores (OnInit/OnTick), handles de indicadores + CopyBuffer, y ejecución de órdenes con OrderSend usando MqlTradeRequest/MqlTradeResult.
Si solo necesitas lo esencial ahora:
- Flujo de indicadores: crear handle -> comprobar
BarsCalculated->CopyBuffer - Flujo de órdenes: construir
MqlTradeRequest->OrderSend-> revisarretcode - Datos base:
_Symbol,_Point,_Digits,ENUM_TIMEFRAMES
Al desarrollar Asesores Expertos necesitas una referencia rápida y precisa — no un tutorial largo. Esta página resume la documentación oficial de MQL5 en una guía práctica: tipos de datos, operadores, indicadores, OrderSend y conceptos esenciales. Guárdala y salta a la sección que necesites.
Todos los ejemplos siguen la sintaxis de MetaQuotes Language 5 y están listos para adaptar a tus EAs.
Guías relacionadas: Configuración del entorno MQL5 · Construye tu primer EA · EA avanzado: Multi-Timeframe y filtros · EA de scalping en MT5
Tipos de Datos — Lo Que Usarás Cada Día
MQL5 usa tipos similares a C++. Según Tipos de datos MQL5:
| Tipo | Uso | Ejemplo |
|---|---|---|
int | Números enteros (cuentas, períodos) | int period = 14; |
double | Precios, volúmenes, valores de indicadores | double price = 1.0850; |
string | Nombres de símbolos, comentarios | string sym = _Symbol; |
bool | Valores verdadero/falso | bool canTrade = true; |
datetime | Marcas de tiempo | datetime t = TimeCurrent(); |
long, ulong | Tickets, números mágicos | ulong ticket = 12345; |
Ejemplo — Declaraciones típicas en un EA:
input int InpPeriod = 14; // Período RSI
input double InpLotSize = 0.1; // Tamaño de lote
input int InpMagic = 12345; // Número mágico
double askPrice;
double rsiBuffer[];
int maHandle = INVALID_HANDLE;
Operadores y Bucles — Flujo de Control
Según Operadores MQL5: if, for, while, switch, break, continue.
Ejemplo — Iterar posiciones y cerrar por magic:
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket <= 0) continue;
if(PositionGetInteger(POSITION_MAGIC) != InpMagic) continue;
// ... lógica de cierre
}
Arrays — Dinámicos y Serie Temporal
Los arrays guardan OHLC, buffers de indicadores y datos personalizados. Usa ArraySetAsSeries(array, true) para que el índice 0 = barra actual.
Ejemplo — Copiar valores de MA con CopyBuffer:
double maBuffer[];
ArraySetAsSeries(maBuffer, true);
int copied = CopyBuffer(maHandle, 0, 0, 3, maBuffer);
if(copied > 0)
double maNow = maBuffer[0]; // Valor MA en barra actual
Indicadores Técnicos — Handle + CopyBuffer
Según Indicadores Técnicos MQL5: Crea un handle en OnInit(), luego usa CopyBuffer() para leer valores.
iMA — Media Móvil
int iMA(string symbol, ENUM_TIMEFRAMES period, int ma_period, int ma_shift, ENUM_MA_METHOD method, ENUM_APPLIED_PRICE applied_price);
Ejemplo — EMA 20 períodos en Cierre:
maHandle = iMA(_Symbol, PERIOD_CURRENT, 20, 0, MODE_EMA, PRICE_CLOSE);
if(maHandle == INVALID_HANDLE) return(INIT_FAILED);
// En OnTick: CopyBuffer(maHandle, 0, 0, 1, maBuffer);
iRSI — Índice de Fuerza Relativa
int iRSI(string symbol, ENUM_TIMEFRAMES period, int ma_period, ENUM_APPLIED_PRICE applied_price);
Ejemplo — RSI 14 períodos:
rsiHandle = iRSI(_Symbol, PERIOD_CURRENT, 14, PRICE_CLOSE);
// CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer); — RSI en índice 0
CopyBuffer — Obtener Datos del Indicador
Según CopyBuffer:
int CopyBuffer(int indicator_handle, int buffer_num, int start_pos, int count, double buffer[]);
Devuelve el número de elementos copiados o -1 en error. Posición 0 = barra actual con ArraySetAsSeries(buffer, true).
OrderSend — Ejecutar Operaciones
OrderSend() envía solicitudes de trading. Rellena MqlTradeRequest y recibe el resultado en MqlTradeResult.
Campos clave de MqlTradeRequest:
| Campo | Propósito |
|---|---|
action | TRADE_ACTION_DEAL, TRADE_ACTION_PENDING, etc. |
symbol | Símbolo de trading |
volume | Tamaño del lote |
price | Precio de ejecución (Ask para Compra, Bid para Venta) |
sl, tp | Stop Loss, Take Profit |
type | ORDER_TYPE_BUY, ORDER_TYPE_SELL |
deviation | Deslizamiento máximo en puntos |
magic | Identificador del EA |
Ejemplo — Abrir orden de compra a mercado:
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = 0.1;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.deviation = 10;
request.magic = 12345;
if(OrderSend(request, result))
Print("Orden enviada. Operación: ", result.deal);
else
Print("OrderSend falló: ", GetLastError());
Orden vs Operación vs Posición
Según Funciones de Trading MQL5:
- Orden — Instrucción al bróker (mercado o pendiente)
- Operación (Deal) — Compra/venta ejecutada
- Posición — Obligación abierta (contratos en cartera)
Usa PositionsTotal(), PositionGetTicket(i), PositionGetDouble(POSITION_VOLUME) para posiciones abiertas. OrdersTotal() y OrderGetTicket(i) para órdenes pendientes.
Timeframes — ENUM_TIMEFRAMES
Según Timeframes del Gráfico:
| Constante | Descripción |
|---|---|
| PERIOD_M1 | 1 minuto |
| PERIOD_M5 | 5 minutos |
| PERIOD_H1 | 1 hora |
| PERIOD_H4 | 4 horas |
| PERIOD_D1 | 1 día |
| PERIOD_W1 | 1 semana |
| PERIOD_MN1 | 1 mes |
| PERIOD_CURRENT | Timeframe del gráfico |
Usa PERIOD_CURRENT o 0 en funciones de indicadores para el gráfico actual.
Variables Predefinidas
| Variable | Significado |
|---|---|
_Symbol | Símbolo actual del gráfico |
_Point | Tamaño del punto |
_Digits | Número de decimales |
_Period | Timeframe actual |
Referencia Rápida — Funciones Frecuentes
| Función | Propósito |
|---|---|
SymbolInfoDouble(sym, SYMBOL_ASK) | Ask actual |
SymbolInfoDouble(sym, SYMBOL_BID) | Bid actual |
NormalizeDouble(price, digits) | Redondear precio para orden |
OrderCheck(request) | Validar antes de OrderSend |
BarsCalculated(handle) | Comprobar si indicador está listo |
IndicatorRelease(handle) | Liberar indicador en OnDeinit |
Próximos Pasos — Construye tu Primer EA
Usa esta referencia mientras programas. En el siguiente tutorial, Construye tu primer EA, combinarás estos elementos en un EA de cruce de medias móviles con reglas reales de entrada y salida.
Consejo extra: ¿Prefieres un atajo visual? Prueba AlfaTactix Strategy Builder gratis — la misma herramienta sin código que usan traders profesionales para diseñar estrategias de forma visual y exportar MQL5 listo para producción. Añade indicadores (iMA, iRSI, lógica CopyBuffer), reglas de entrada y gestión de riesgo con una interfaz visual — luego genera código limpio que puedes refinar en MetaEditor. Prototipa en minutos, no en horas.