Capítulo 3: Conceptos Fundamentales de Programación
3.1. Variables y Tipos de Datos
En MQL5, las variables son contenedores que almacenan datos que pueden ser utilizados en el programa. Antes de usar una variable, es necesario declarar su tipo de dato.
Tipos de Datos Comunes en MQL5:
- Enteros (
int): Números sin decimales. - Reales (
double): Números con decimales. - Cadenas de texto (
string): Texto encerrado entre comillas dobles. - Booleanos (
bool): Pueden tener los valorestrueofalse.
Ejemplo práctico: Declaramos variables de diferentes tipos y mostramos sus valores.
//+------------------------------------------------------------------+
//| Ejemplo de Variables |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Declaración de variables
int cuentaPosiciones = 0; // Variable entera
double precioActual = 1.23456; // Variable real
string simbolo = "EURUSD"; // Variable de texto
bool esDiaHabil = true; // Variable booleana
// Mostrar valores en la ventana de resultados
Print("Número de posiciones: ", cuentaPosiciones);
Print("Precio actual del ", simbolo, ": ", DoubleToString(precioActual, _Digits));
Print("¿Es día hábil?: ", esDiaHabil ? "Sí" : "No");
}
Explicación del Código:
- Usamos
Print()para mostrar los valores de las variables. - La función
DoubleToString()convierte un número real en una cadena formateada con la precisión adecuada.
3.2. Operadores Aritméticos, Lógicos y Relacionales
Los operadores permiten realizar cálculos y comparaciones en MQL5. Aquí te presentamos algunos de los más comunes:
Operadores Aritméticos
Realizan operaciones matemáticas básicas:
+: Suma-: Resta*: Multiplicación/: División%: Módulo (resto de la división)
Ejemplo práctico: Calculamos el promedio móvil simple de dos precios.
//+------------------------------------------------------------------+
//| Ejemplo de Operadores Aritméticos |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
double precio1 = 1.1234;
double precio2 = 1.1245;
// Calcular el promedio
double promedio = (precio1 + precio2) / 2;
// Mostrar el resultado
Print("Promedio de precios: ", DoubleToString(promedio, _Digits));
}
Operadores Relacionales
Se usan para comparar valores y devuelven un resultado booleano (true o false):
==: Igual a!=: No igual a<: Menor que>: Mayor que<=: Menor o igual que>=: Mayor o igual que
Ejemplo práctico: Verificamos si el precio actual supera un nivel clave.
//+------------------------------------------------------------------+
//| Ejemplo de Operadores Relacionales |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
double precioActual = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double nivelClave = 1.1200;
if (precioActual > nivelClave) {
Print("El precio actual supera el nivel clave.");
} else {
Print("El precio actual está por debajo del nivel clave.");
}
}
Operadores Lógicos
Permiten combinar condiciones y tomar decisiones más complejas:
&&: Y lógico (ambas condiciones deben ser verdaderas)||: O lógico (al menos una condición debe ser verdadera)!: Negación lógica (invierte el valor booleano)
Ejemplo práctico: Comprobamos si el mercado está en horas específicas.
//+------------------------------------------------------------------+
//| Ejemplo de Operadores Lógicos |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
int horaActual = Hour();
if ((horaActual >= 8 && horaActual <= 17) || (horaActual == 22)) {
Print("El mercado está abierto.");
} else {
Print("El mercado está cerrado.");
}
}
3.3. Estructuras de Control: if, for, while, switch
Las estructuras de control permiten ejecutar bloques de código bajo ciertas condiciones o repetir acciones múltiples veces.
if
Se utiliza para tomar decisiones basadas en una condición.
Ejemplo práctico: Decidimos abrir una posición larga o corta según el cruce de medias móviles.
//+------------------------------------------------------------------+
//| Ejemplo de if |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
double fastMA = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE, 0);
double slowMA = iMA(_Symbol, _Period, 50, 0, MODE_SMA, PRICE_CLOSE, 0);
if (fastMA > slowMA) {
Print("Señal de compra detectada.");
} else if (fastMA < slowMA) {
Print("Señal de venta detectada.");
} else {
Print("No hay señales claras.");
}
}
for
Se usa para iterar un bloque de código un número específico de veces.
Ejemplo práctico: Calculamos el total de volumen negociado en los últimos 10 ticks.
//+------------------------------------------------------------------+
//| Ejemplo de for |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
double totalVolumen = 0;
for (int i = 0; i < 10; i++) {
totalVolumen += CopyTickVolume(_Symbol, i, 1)[0];
}
Print("Total de volumen en los últimos 10 ticks: ", totalVolumen);
}
while
Se emplea para ejecutar un bloque de código mientras se cumpla una condición.
Ejemplo práctico: Esperamos hasta que el precio alcance un objetivo.
//+------------------------------------------------------------------+
//| Ejemplo de while |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
double precioObjetivo = 1.1250;
double precioActual = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
while (precioActual < precioObjetivo) {
Sleep(1000); // Esperar 1 segundo
precioActual = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
}
Print("El precio ha alcanzado el objetivo.");
}
switch
Se utiliza para seleccionar una acción entre varias opciones posibles.
Ejemplo práctico: Determinamos el tipo de orden según un parámetro de entrada.
//+------------------------------------------------------------------+
//| Ejemplo de switch |
//+------------------------------------------------------------------+
#property strict
input int tipoOrden = 0; // 0: Compra, 1: Venta
void OnStart() {
switch (tipoOrden) {
case 0:
Print("Tipo de orden: Compra");
break;
case 1:
Print("Tipo de orden: Venta");
break;
default:
Print("Tipo de orden no válido");
}
}
Interactividad: Ejercicios Prácticos
Ejercicio 1: Crea un script que calcule el promedio móvil simple de los últimos 20 precios de cierre del EURUSD y muestre el resultado.
Ver solución:Ocultar solución//+------------------------------------------------------------------+
//| Script para calcular el SMA de los últimos 20 precios de cierre |
//+------------------------------------------------------------------+
void OnStart() {
// Definir el número de períodos para el SMA
int periods = 20;
// Crear un array para almacenar los precios de cierre
double closePrices[];
// Copiar los últimos 'periods' precios de cierre en el array
int copied = CopyClose("EURUSD", PERIOD_CURRENT, 0, periods, closePrices);
if (copied < periods) {
Print("Error: No se pudieron copiar suficientes precios de cierre.");
return;
}
// Calcular el promedio móvil simple (suma de precios / número de períodos)
double sum = 0;
for (int i = 0; i < periods; i++) {
sum += closePrices[i];
}
double sma = sum / periods;
// Mostrar el resultado en la ventana de resultados
Print("El SMA de los últimos ", periods, " precios de cierre es: ", DoubleToString(sma, _Digits));
}
Explicación del Código
- Definición del Número de Períodos:
- Se define una variable
periodscon el valor20, que representa el número de precios de cierre que se utilizarán para calcular el SMA.
- Se define una variable
- Copiar Precios de Cierre:
- La función
CopyClose()se utiliza para copiar los últimos20precios de cierre del símbolo"EURUSD"en el arrayclosePrices[]. - El parámetro
PERIOD_CURRENTindica que se usará el período actual del gráfico. - Si no se pueden copiar suficientes precios (por ejemplo, si hay menos de 20 velas disponibles), el script muestra un mensaje de error y termina.
- La función
- Cálculo del SMA:
- Se inicializa una variable
sumen0para acumular la suma de los precios de cierre. - Un bucle
forrecorre el arrayclosePrices[]y suma todos los valores. - Finalmente, se calcula el SMA dividiendo la suma entre el número de períodos (
sum / periods).
- Se inicializa una variable
- Mostrar el Resultado:
- El resultado del SMA se imprime en la ventana de resultados usando la función
Print(). El valor se formatea con_Digitspara mostrar la precisión adecuada del símbolo.
- El resultado del SMA se imprime en la ventana de resultados usando la función
Resultado Esperado
Al ejecutar este script en un gráfico de EURUSD, obtendrás un resultado similar al siguiente en la ventana de resultados:
El SMA de los últimos 20 precios de cierre es: 1.1050
Interpretación del Cambio
Este ejercicio demuestra cómo calcular un Promedio Móvil Simple (SMA) utilizando datos históricos de precios. El SMA es una herramienta básica en el análisis técnico y se utiliza para suavizar fluctuaciones en los precios y detectar tendencias. Este script:
- Copia los últimos 20 precios de cierre.
- Calcula el promedio de esos precios.
- Muestra el resultado en la ventana de resultados.
Casos Prácticos
Este script puede ser utilizado para:
- Entender el Funcionamiento del SMA: Aprender cómo se calcula manualmente un indicador básico como el SMA.
- Integrar en Estrategias: Usar este cálculo como base para desarrollar EAs o indicadores personalizados.
- Practicar Programación Básica: Familiarizarse con funciones como
CopyClose()y estructuras de control (for).
Breve Explicación Adicional
El SMA es uno de los indicadores más simples pero útiles en trading. Al calcular el promedio de los últimos N precios de cierre, elimina el ruido a corto plazo y resalta la dirección general del mercado. Este script es un buen punto de partida para aprender a trabajar con datos históricos en MQL5.
¡Espero que esta solución te ayude a entender cómo calcular y usar el SMA en tus proyectos de MQL5! 🚀
Ejercicio 2: Escribe un programa que verifique si el precio actual está dentro de un rango específico (por ejemplo, entre 1.1200 y 1.1300).
Ver solución:Ocultar solución//+------------------------------------------------------------------+
//| Script para verificar si el precio actual está dentro de un rango|
//+------------------------------------------------------------------+
void OnStart() {
// Definir los límites del rango
double lowerBound = 1.1200; // Límite inferior del rango
double upperBound = 1.1300; // Límite superior del rango
// Obtener el precio actual del símbolo
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // Usamos el precio Bid como referencia
// Verificar si el precio actual está dentro del rango
if (currentPrice >= lowerBound && currentPrice <= upperBound) {
Print("El precio actual (", DoubleToString(currentPrice, _Digits), ") está dentro del rango [",
DoubleToString(lowerBound, _Digits), " - ", DoubleToString(upperBound, _Digits), "].");
} else {
Print("El precio actual (", DoubleToString(currentPrice, _Digits), ") está fuera del rango [",
DoubleToString(lowerBound, _Digits), " - ", DoubleToString(upperBound, _Digits), "].");
}
}
Explicación del Código
- Definición del Rango:
- Se definen dos variables,
lowerBoundyupperBound, que representan los límites inferior y superior del rango (1.1200y1.1300en este caso).
- Se definen dos variables,
- Obtención del Precio Actual:
- La función
SymbolInfoDouble()se utiliza para obtener el precio actual del símbolo. En este caso, usamosSYMBOL_BIDpara obtener el precio de venta (Bid). - El resultado se almacena en la variable
currentPrice.
- La función
- Verificación del Rango:
- Se utiliza una estructura condicional (
if-else) para verificar si el precio actual está dentro del rango definido. - La condición
currentPrice >= lowerBound && currentPrice <= upperBoundcomprueba si el precio está entre los límites.
- Se utiliza una estructura condicional (
- Mostrar el Resultado:
- Si el precio está dentro del rango, se imprime un mensaje indicando que el precio está dentro del rango.
- Si no, se imprime un mensaje indicando que el precio está fuera del rango.
- Los valores se formatean con
_Digitspara mostrar la precisión adecuada del símbolo.
Resultado Esperado
Al ejecutar este script en un gráfico de EURUSD, obtendrás resultados similares a los siguientes en la ventana de resultados:
- Si el precio actual es
1.1250:
El precio actual (1.1250) está dentro del rango [1.1200 - 1.1300].
- Si el precio actual es
1.1180:
El precio actual (1.1180) está fuera del rango [1.1200 - 1.1300].
Interpretación del Cambio
Este ejercicio muestra cómo verificar si el precio actual de un símbolo está dentro de un rango específico. Esto puede ser útil en varias situaciones:
- Alertas de Precio: Crear alertas cuando el precio entra o sale de un rango determinado.
- Estrategias de Trading: Implementar estrategias basadas en rangos de precios, como operaciones de rango o breakout.
- Validación de Condiciones: Asegurarse de que ciertas condiciones se cumplan antes de abrir o cerrar posiciones.
Casos Prácticos
Este script puede ser utilizado para:
- Crear Alertas Automáticas: Notificar al trader cuando el precio entre o salga de un rango específico.
- Implementar Estrategias de Rango: Desarrollar EAs que operen solo cuando el precio esté dentro de un rango definido.
- Practicar Programación Básica: Familiarizarse con funciones como
SymbolInfoDouble()y estructuras condicionales (if-else).
Breve Explicación Adicional
El concepto de trabajar con rangos de precios es fundamental en trading. Muchas estrategias se basan en identificar zonas de soporte y resistencia, o en operar dentro de rangos laterales. Este script es un buen punto de partida para aprender a trabajar con precios actuales y validar condiciones específicas en MQL5.
¡Espero que esta solución te ayude a entender cómo verificar rangos de precios en tus proyectos de MQL5! 🚀
Ejercicio 3: Utiliza un bucle for para calcular el total de volumen negociado en los últimos 50 ticks.
//+----------------------------------------------------------------------------+
//| Script para calcular el total de volumen negociado en los últimos 50 ticks |
//+----------------------------------------------------------------------------+
void OnStart() {
// Definir el número de ticks a analizar
int numTicks = 50;
// Crear un array para almacenar los volúmenes de los ticks
long tickVolumes[];
// Copiar los volúmenes de los últimos 'numTicks' ticks en el array
int copied = CopyTickVolume(_Symbol, PERIOD_CURRENT, 0, numTicks, tickVolumes);
if (copied < numTicks) {
Print("Error: No se pudieron copiar suficientes ticks.");
return;
}
// Calcular el total de volumen negociado usando un bucle for
long totalVolume = 0;
for (int i = 0; i < numTicks; i++) {
totalVolume += tickVolumes[i];
}
// Mostrar el resultado en la ventana de resultados
Print("El total de volumen negociado en los últimos ", numTicks, " ticks es: ", totalVolume);
}
Explicación del Código
- Definición del Número de Ticks:
- Se define una variable
numTickscon el valor50, que representa el número de ticks que se analizarán.
- Se define una variable
- Copiar Volúmenes de Ticks:
- La función
CopyTickVolume()se utiliza para copiar los volúmenes de los últimos50ticks del símbolo actual (_Symbol) en el arraytickVolumes[]. - El parámetro
PERIOD_CURRENTindica que se usará el período actual del gráfico. - Si no se pueden copiar suficientes ticks (por ejemplo, si hay menos de 50 ticks disponibles), el script muestra un mensaje de error y termina.
- La función
- Calcular el Total de Volumen:
- Se inicializa una variable
totalVolumeen0para acumular el volumen total. - Un bucle
forrecorre el arraytickVolumes[]y suma todos los valores de volumen.
- Se inicializa una variable
- Mostrar el Resultado:
- El resultado del volumen total se imprime en la ventana de resultados usando la función
Print().
- El resultado del volumen total se imprime en la ventana de resultados usando la función
Resultado Esperado
Al ejecutar este script en un gráfico activo, obtendrás un resultado similar al siguiente en la ventana de resultados:
El total de volumen negociado en los últimos 50 ticks es: 1234567
El valor exacto dependerá del volumen negociado en los últimos 50 ticks del símbolo en el que se ejecute el script.
Interpretación del Cambio
Este ejercicio demuestra cómo utilizar un bucle for para procesar datos históricos y calcular un valor acumulado, en este caso, el volumen total negociado en los últimos 50 ticks. Esto puede ser útil para:
- Análisis de Liquidez: Evaluar la actividad del mercado en un período corto de tiempo.
- Detección de Patrones: Identificar momentos de alta o baja actividad en el mercado.
- Validación de Condiciones: Usar el volumen como parte de una estrategia de trading automatizada.
Casos Prácticos
Este script puede ser utilizado para:
- Monitorear Actividad del Mercado: Detectar cambios significativos en el volumen que puedan indicar eventos importantes.
- Desarrollar Estrategias Basadas en Volumen: Implementar EAs que tomen decisiones basadas en el volumen negociado.
- Practicar Programación Básica: Familiarizarse con funciones como
CopyTickVolume()y estructuras de control (for).
Breve Explicación Adicional
El volumen es un indicador clave en el análisis técnico porque refleja la liquidez y la intensidad del interés del mercado en un activo. Este script es un buen punto de partida para aprender a trabajar con datos de volumen en MQL5 y usarlos en tus proyectos de trading automatizado.
¡Espero que esta solución te ayude a entender cómo calcular y utilizar el volumen negociado en tus proyectos de MQL5! 🚀
Conclusión: En este capítulo, hemos explorado los conceptos fundamentales de programación en MQL5, incluyendo variables, operadores y estructuras de control. Estos elementos son la base para desarrollar programas más avanzados como Expert Advisors y scripts personalizados.
En el próximo capítulo, profundizaremos en cómo trabajar con datos del mercado y gestionar órdenes en tiempo real.
¡Sigue practicando y perfeccionando tus habilidades en MQL5!
