Capítulo 5: Trabajando con Datos del Mercado
En este capítulo, exploraremos cómo acceder y manipular datos del mercado en MQL5. Estos datos son fundamentales para desarrollar estrategias de trading automatizadas, ya que permiten analizar precios históricos, obtener información sobre símbolos y trabajar con fechas y horas.
5.1. Acceso a Precios Históricos (CopyRates, CopyTicks)
MQL5 proporciona funciones poderosas para obtener datos históricos de precios, como CopyRates y CopyTicks. Estas funciones te permiten recuperar barras o ticks de diferentes temporalidades y símbolos.
CopyRates
La función CopyRates se utiliza para obtener datos de barras históricas (como apertura, cierre, máximo y mínimo) para un símbolo específico y una temporalidad determinada.
Ejemplo práctico: Obtener las últimas 10 barras del EURUSD en la temporalidad H1.
//+------------------------------------------------------------------+
//| Ejemplo de uso de CopyRates |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Definir variables
string symbol = "EURUSD"; // Símbolo
ENUM_TIMEFRAMES timeframe = PERIOD_H1; // Temporalidad (H1)
int count = 10; // Número de barras a obtener
// Crear un array para almacenar los datos
MqlRates rates[];
// Copiar las barras históricas
if (CopyRates(symbol, timeframe, 0, count, rates) > 0) {
Print("Se obtuvieron ", ArraySize(rates), " barras.");
// Mostrar detalles de cada barra
for (int i = 0; i < ArraySize(rates); i++) {
PrintFormat("Barra %d - Apertura: %.5f, Máximo: %.5f, Mínimo: %.5f, Cierre: %.5f",
i, rates[i].open, rates[i].high, rates[i].low, rates[i].close);
}
} else {
Print("Error al obtener las barras. Código de error: ", GetLastError());
}
}
Explicación del código:
- Usamos
CopyRatespara obtener las últimas 10 barras del EURUSD en la temporalidad H1. - Los datos se almacenan en un array de tipo
MqlRates, donde cada elemento contiene información sobre una barra (apertura, cierre, máximo, mínimo, volumen, etc.). - Iteramos sobre el array para mostrar los valores de cada barra.
CopyTicks
La función CopyTicks se utiliza para obtener ticks históricos de un símbolo específico. Un tick representa un cambio en el precio de compra o venta.
Ejemplo práctico: Obtener los últimos 5 ticks del EURUSD.
//+------------------------------------------------------------------+
//| Ejemplo de uso de CopyTicks |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Definir variables
string symbol = "EURUSD"; // Símbolo
int count = 5; // Número de ticks a obtener
// Crear un array para almacenar los ticks
MqlTick ticks[];
// Copiar los ticks históricos
if (CopyTicks(symbol, ticks, count, COPY_TICKS_ALL) > 0) {
Print("Se obtuvieron ", ArraySize(ticks), " ticks.");
// Mostrar detalles de cada tick
for (int i = 0; i < ArraySize(ticks); i++) {
PrintFormat("Tick %d - Tiempo: %s, Ask: %.5f, Bid: %.5f",
i, TimeToString(ticks[i].time), ticks[i].ask, ticks[i].bid);
}
} else {
Print("Error al obtener los ticks. Código de error: ", GetLastError());
}
}
Explicación del código:
- Usamos
CopyTickspara obtener los últimos 5 ticks del EURUSD. - Los datos se almacenan en un array de tipo
MqlTick, donde cada elemento contiene información sobre un tick (tiempo, precio de compra, precio de venta, etc.). - Iteramos sobre el array para mostrar los valores de cada tick.
5.2. Uso de Funciones como SymbolInfo(), MarketInfo()
Las funciones SymbolInfo() y MarketInfo() permiten obtener información detallada sobre los símbolos disponibles en el mercado, como spreads, precios actuales y límites de lotes.
SymbolInfo()
La función SymbolInfo() es la preferida en MQL5 para obtener información sobre símbolos, ya que reemplaza a MarketInfo() en versiones anteriores.
Ejemplo práctico: Obtener información sobre el EURUSD.
//+------------------------------------------------------------------+
//| Ejemplo de uso de SymbolInfo |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
string symbol = "EURUSD"; // Símbolo
// Verificar si el símbolo existe
if (SymbolExists(symbol)) {
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK); // Precio de compra
double bid = SymbolInfoDouble(symbol, SYMBOL_BID); // Precio de venta
int spread = SymbolInfoInteger(symbol, SYMBOL_SPREAD); // Spread actual
Print("Información sobre ", symbol);
Print("Precio de compra (Ask): ", DoubleToString(ask, _Digits));
Print("Precio de venta (Bid): ", DoubleToString(bid, _Digits));
Print("Spread: ", spread, " pips");
} else {
Print("El símbolo ", symbol, " no está disponible.");
}
}
Explicación del código:
- Usamos
SymbolInfoDoubleySymbolInfoIntegerpara obtener información sobre el precio de compra (SYMBOL_ASK), precio de venta (SYMBOL_BID) y spread (SYMBOL_SPREAD) del EURUSD. - Mostramos los resultados en la ventana de resultados.
MarketInfo()
Aunque MarketInfo() sigue estando disponible en MQL5 por razones de compatibilidad con MQL4, se recomienda usar SymbolInfo() siempre que sea posible.
5.3. Manipulación de Tiempo y Fechas (TimeCurrent(), TimeLocal())
En MQL5, el manejo de tiempo y fechas es crucial para desarrollar estrategias basadas en horarios específicos o para registrar eventos.
TimeCurrent()
La función TimeCurrent() devuelve la hora actual del servidor del broker.
Ejemplo práctico: Mostrar la hora actual del servidor.
//+------------------------------------------------------------------+
//| Ejemplo de uso de TimeCurrent |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
datetime serverTime = TimeCurrent(); // Obtener la hora actual del servidor
Print("Hora actual del servidor: ", TimeToString(serverTime, TIME_DATE | TIME_SECONDS));
}
TimeLocal()
La función TimeLocal() devuelve la hora actual del sistema local.
Ejemplo práctico: Comparar la hora del servidor con la hora local.
//+------------------------------------------------------------------+
//| Ejemplo de uso de TimeLocal |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
datetime serverTime = TimeCurrent(); // Hora del servidor
datetime localTime = TimeLocal(); // Hora local
Print("Hora del servidor: ", TimeToString(serverTime, TIME_DATE | TIME_SECONDS));
Print("Hora local: ", TimeToString(localTime, TIME_DATE | TIME_SECONDS));
}
Interactividad: Ejercicios Prácticos
Ejercicio 1: Modifica el ejemplo de CopyRates para obtener las últimas 20 barras del GBPUSD en la temporalidad D1.
//+------------------------------------------------------------------+
//| Script para obtener las últimas 20 barras del GBPUSD en D1 |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Definir variables
string symbol = "GBPUSD"; // Símbolo a analizar
ENUM_TIMEFRAMES timeframe = PERIOD_D1; // Temporalidad diaria (D1)
int count = 20; // Número de barras a obtener
// Crear un array para almacenar los datos de las barras
MqlRates rates[];
// Usar CopyRates para obtener las barras históricas
if (CopyRates(symbol, timeframe, 0, count, rates) > 0) {
Print("Se obtuvieron ", ArraySize(rates), " barras del símbolo ", symbol, " en la temporalidad D1.");
// Mostrar detalles de cada barra
for (int i = 0; i < ArraySize(rates); i++) {
// Formatear y mostrar los datos de cada barra
PrintFormat("Barra %d - Tiempo: %s, Apertura: %.5f, Máximo: %.5f, Mínimo: %.5f, Cierre: %.5f",
i, TimeToString(rates[i].time, TIME_DATE | TIME_SECONDS),
rates[i].open, rates[i].high, rates[i].low, rates[i].close);
}
} else {
// Mostrar mensaje de error si no se pudieron obtener las barras
Print("Error al obtener las barras. Código de error: ", GetLastError());
}
}
Explicación del Código
- Definición de Variables:
symbol: Especificamos el símboloGBPUSDcomo el instrumento financiero del que queremos obtener datos.timeframe: Seleccionamos la temporalidadPERIOD_D1, que corresponde a gráficos diarios.count: Indicamos que queremos obtener las últimas 20 barras.
- Uso de
CopyRates:- La función
CopyRatesse utiliza para recuperar datos históricos de barras. Le pasamos el símbolo (GBPUSD), la temporalidad (D1), el desplazamiento (0para empezar desde la última barra disponible) y el número de barras (20).
- La función
- Almacenamiento en un Array:
- Los datos obtenidos se almacenan en un array de tipo
MqlRates. Cada elemento del array representa una barra y contiene información como la hora, precio de apertura, máximo, mínimo, cierre y volumen.
- Los datos obtenidos se almacenan en un array de tipo
- Iteración sobre el Array:
- Utilizamos un bucle
forpara recorrer el array y mostrar los detalles de cada barra en la ventana de resultados. Para formatear las fechas, usamosTimeToStringcon la máscaraTIME_DATE | TIME_SECONDS.
- Utilizamos un bucle
- Gestión de Errores:
- Si
CopyRatesno puede obtener las barras solicitadas, mostramos un mensaje de error junto con el código de error correspondiente utilizandoGetLastError().
- Si
Resultado Esperado
Cuando ejecutes este script, verás un mensaje similar al siguiente en la ventana de resultados:
Se obtuvieron 20 barras del símbolo GBPUSD en la temporalidad D1.
Barra 0 - Tiempo: 2023.10.06 00:00, Apertura: 1.23456, Máximo: 1.23789, Mínimo: 1.23123, Cierre: 1.23567
Barra 1 - Tiempo: 2023.10.05 00:00, Apertura: 1.23234, Máximo: 1.23678, Mínimo: 1.22987, Cierre: 1.23456
...
Barra 19 - Tiempo: 2023.09.16 00:00, Apertura: 1.24567, Máximo: 1.24890, Mínimo: 1.24234, Cierre: 1.24678
Este tipo de información es útil para desarrollar estrategias basadas en análisis técnico o para realizar backtesting en diferentes temporalidades.
¡Espero que este ejemplo te sea útil para entender cómo trabajar con datos históricos en MQL5!
Ejercicio 2: Escribe un script que muestre el spread actual de tres símbolos diferentes (por ejemplo, EURUSD, GBPJPY y AUDCAD).
Ver solución:Ocultar solución//+------------------------------------------------------------------+
//| Script para mostrar el spread actual de tres símbolos |
//| |
//| Propósito: Mostrar el spread actual de EURUSD, GBPJPY y AUDCAD |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Definir los símbolos a analizar
string symbols[3] = {"EURUSD", "GBPJPY", "AUDCAD"};
// Iterar sobre cada símbolo y obtener su spread
for (int i = 0; i < ArraySize(symbols); i++) {
string symbol = symbols[i]; // Obtener el símbolo actual
// Verificar si el símbolo existe en el mercado
if (SymbolExists(symbol)) {
// Obtener el spread actual del símbolo
int spread = SymbolInfoInteger(symbol, SYMBOL_SPREAD);
// Mostrar el spread en la ventana de resultados
Print("Spread actual de ", symbol, ": ", spread, " pips");
} else {
// Mostrar un mensaje si el símbolo no está disponible
Print("El símbolo ", symbol, " no está disponible.");
}
}
}
Explicación del Código
- Definición de Símbolos:
- Creamos un array llamado
symbolsque contiene los nombres de los tres símbolos que queremos analizar:EURUSD,GBPJPYyAUDCAD.
- Creamos un array llamado
- Iteración sobre los Símbolos:
- Usamos un bucle
forpara recorrer cada símbolo en el array. - En cada iteración, asignamos el símbolo actual a la variable
symbol.
- Usamos un bucle
- Verificación de Existencia del Símbolo:
- Antes de intentar obtener información sobre el símbolo, verificamos si está disponible en el mercado usando la función
SymbolExists.
- Antes de intentar obtener información sobre el símbolo, verificamos si está disponible en el mercado usando la función
- Obtención del Spread:
- Si el símbolo existe, utilizamos
SymbolInfoIntegercon el parámetroSYMBOL_SPREADpara obtener el spread actual en pips.
- Si el símbolo existe, utilizamos
- Mostrar el Spread:
- Usamos la función
Printpara mostrar el spread actual del símbolo en la ventana de resultados.
- Usamos la función
- Gestión de Errores:
- Si un símbolo no está disponible en el mercado, mostramos un mensaje informativo indicando que el símbolo no está presente.
Resultado Esperado
Cuando ejecutes este script, verás un mensaje similar al siguiente en la ventana de resultados:
Spread actual de EURUSD: 1.2 pips
Spread actual de GBPJPY: 1.5 pips
Spread actual de AUDCAD: 1.8 pips
Si alguno de los símbolos no está disponible en tu cuenta o en el terminal MetaTrader 5, verás un mensaje como este:
El símbolo AUDCAD no está disponible.
Caso Práctico
Este tipo de script puede ser útil para traders que desean monitorear los spreads de varios pares de divisas antes de ejecutar operaciones. Los spreads más bajos generalmente indican costos de trading más bajos, lo que puede ser importante para estrategias de scalping o day trading.
¡Espero que este ejemplo te sea útil para entender cómo trabajar con múltiples símbolos y obtener información relevante en MQL5!
Ejercicio 3: Crea un script que verifique si el mercado está abierto durante ciertas horas (por ejemplo, entre las 8:00 y las 17:00).
Ver solución:Ocultar solución//+------------------------------------------------------------------+
//| Script para verificar si el mercado está abierto en ciertas horas|
//| |
//| Propósito: Comprobar si la hora actual está dentro del rango |
//| especificado (8:00 a 17:00). |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Definir el rango de horas para verificar si el mercado está abierto
int horaInicio = 8; // Hora de inicio del rango (8:00)
int horaFin = 17; // Hora de fin del rango (17:00)
// Obtener la hora actual del servidor
datetime tiempoActual = TimeCurrent();
int horaActual = Hour(tiempoActual); // Extraer solo la hora del tiempo actual
// Verificar si la hora actual está dentro del rango especificado
if (horaActual >= horaInicio && horaActual < horaFin) {
Print("El mercado está ABIERTO. Hora actual: ", TimeToString(tiempoActual, TIME_DATE | TIME_SECONDS));
} else {
Print("El mercado está CERRADO. Hora actual: ", TimeToString(tiempoActual, TIME_DATE | TIME_SECONDS));
}
}
Explicación del Código
- Definición del Rango de Horas:
- Usamos dos variables enteras,
horaInicioyhoraFin, para definir el rango de horas durante el cual queremos verificar si el mercado está abierto (en este caso, de 8:00 a 17:00).
- Usamos dos variables enteras,
- Obtención de la Hora Actual:
- La función
TimeCurrent()obtiene la hora actual del servidor del broker. - La función
Hour()extrae solo la hora del valor devuelto porTimeCurrent().
- La función
- Verificación del Rango de Horas:
- Utilizamos una condición
ifpara comprobar si la hora actual (horaActual) está dentro del rango especificado (horaInicio<=horaActual<horaFin). - Si la hora actual está dentro del rango, mostramos un mensaje indicando que el mercado está abierto.
- Si no está dentro del rango, mostramos un mensaje indicando que el mercado está cerrado.
- Utilizamos una condición
- Mostrar la Hora Actual:
- Usamos la función
TimeToString()con la máscaraTIME_DATE | TIME_SECONDSpara formatear y mostrar la hora actual en un formato legible.
- Usamos la función
Resultado Esperado
Cuando ejecutes este script, verás un mensaje similar al siguiente en la ventana de resultados:
- Si la hora actual está dentro del rango (por ejemplo, 10:30):
El mercado está ABIERTO. Hora actual: 2023.10.10 10:30:00
- Si la hora actual está fuera del rango (por ejemplo, 19:45):
El mercado está CERRADO. Hora actual: 2023.10.10 19:45:00
Caso Práctico
Este tipo de script puede ser útil para traders que desean automatizar estrategias basadas en horarios específicos. Por ejemplo:
- Evitar abrir posiciones fuera de las horas de alta liquidez.
- Programar notificaciones cuando el mercado esté abierto o cerrado.
- Limitar la ejecución de ciertas operaciones a horarios comerciales específicos.
¡Espero que este ejemplo te sea útil para entender cómo trabajar con tiempos y fechas en MQL5!
Conclusión: En este capítulo, hemos aprendido cómo acceder y manipular datos del mercado en MQL5, incluyendo precios históricos, información sobre símbolos y gestión de tiempo y fechas. Estos conceptos son fundamentales para desarrollar estrategias de trading automatizadas efectivas.
En el próximo capítulo, profundizaremos en la gestión de posiciones y órdenes, lo que nos permitirá implementar lógicas comerciales más avanzadas.
¡Sigue practicando y perfeccionando tus habilidades en MQL5!
