Capítulo 7: Manipulación de Símbolos y Cuentas
En este capítulo, exploraremos cómo trabajar con múltiples símbolos y obtener información sobre la cuenta en MQL5. Estos conceptos son fundamentales para desarrollar estrategias que operen en varios instrumentos financieros y adapten sus parámetros según las características del broker.
7.1. Trabajo con Múltiples Símbolos (SymbolsTotal(), SymbolName())
Cuando trabajamos con múltiples símbolos, es importante poder acceder a todos los instrumentos disponibles en el mercado y obtener información específica sobre cada uno. Las funciones SymbolsTotal() y SymbolName() nos permiten listar y consultar los símbolos disponibles.
Ejemplo Práctico: Listado de Todos los Símbolos Disponibles
A continuación, mostramos cómo listar todos los símbolos disponibles en el terminal:
//+------------------------------------------------------------------+
//| Script para listar todos los símbolos disponibles |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
int totalSymbols = SymbolsTotal(true); // Obtener el número total de símbolos disponibles (incluyendo ocultos)
Print("Número total de símbolos disponibles: ", totalSymbols);
if (totalSymbols > 0) {
Print("Lista de símbolos:");
for (int i = 0; i < totalSymbols; i++) {
string symbol = SymbolName(i, true); // Obtener el nombre del símbolo
Print("Símbolo ", i + 1, ": ", symbol);
}
} else {
Print("No hay símbolos disponibles.");
}
}
Explicación del código:
- Usamos
SymbolsTotal(true)para obtener el número total de símbolos disponibles, incluidos los ocultos. - Iteramos sobre cada símbolo usando un bucle
fory obtenemos su nombre conSymbolName(i, true). - Mostramos una lista de todos los símbolos disponibles en la ventana de resultados.
Importancia de la Normalización de Precios y Lotes
Al trabajar con diferentes brokers, es crucial normalizar precios y lotes para evitar errores al enviar órdenes. Los brokers pueden tener diferentes reglas para el tamaño mínimo de lote, incremento de lote y precisión de precios.
Ejemplo Práctico: Normalización de Precios y Lotes
A continuación, mostramos cómo normalizar un precio y un volumen para un símbolo específico:
//+------------------------------------------------------------------+
//| Script para normalizar precios y lotes |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
string symbol = "EURUSD"; // Símbolo
double price = 1.23456789; // Precio no normalizado
double volume = 0.123456; // Volumen no normalizado
// Obtener la precisión del precio (_Digits) y el paso de lote
int digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS); // Número de dígitos después del punto decimal
double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); // Paso mínimo de lote
// Normalizar el precio y el volumen
double normalizedPrice = NormalizeDouble(price, digits); // Normalizar el precio
double normalizedVolume = MathCeil(volume / lotStep) * lotStep; // Ajustar el volumen al paso de lote
Print("Datos no normalizados:");
Print("Precio: ", price, ", Volumen: ", volume);
Print("Datos normalizados:");
Print("Precio: ", DoubleToString(normalizedPrice, digits), ", Volumen: ", normalizedVolume);
}
Explicación del código:
- Usamos
SymbolInfoInteger(symbol, SYMBOL_DIGITS)para obtener la precisión del precio del símbolo. - Usamos
SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP)para obtener el paso mínimo de lote del símbolo. - Normalizamos el precio usando
NormalizeDoubley ajustamos el volumen al paso de lote utilizandoMathCeil.
7.2. Información sobre la Cuenta (AccountInfoInteger(), AccountInfoDouble())
Las funciones AccountInfoInteger() y AccountInfoDouble() permiten obtener información detallada sobre la cuenta, como el saldo, margen libre, apalancamiento y otros parámetros importantes.
Ejemplo Práctico: Obtención de Información de la Cuenta
A continuación, mostramos cómo obtener y mostrar información clave sobre la cuenta:
//+------------------------------------------------------------------+
//| Script para obtener información de la cuenta |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Obtener información de la cuenta
long accountNumber = AccountInfoInteger(ACCOUNT_LOGIN); // Número de cuenta
string accountCurrency = AccountInfoString(ACCOUNT_CURRENCY); // Moneda de la cuenta
double balance = AccountInfoDouble(ACCOUNT_BALANCE); // Saldo actual
double equity = AccountInfoDouble(ACCOUNT_EQUITY); // Patrimonio actual
double freeMargin = AccountInfoDouble(ACCOUNT_FREEMARGIN); // Margen libre
int leverage = AccountInfoInteger(ACCOUNT_LEVERAGE); // Apalancamiento
// Mostrar la información en la ventana de resultados
Print("Información de la cuenta:");
Print("Número de cuenta: ", accountNumber);
Print("Moneda de la cuenta: ", accountCurrency);
Print("Saldo: ", DoubleToString(balance, 2), " ", accountCurrency);
Print("Patrimonio: ", DoubleToString(equity, 2), " ", accountCurrency);
Print("Margen libre: ", DoubleToString(freeMargin, 2), " ", accountCurrency);
Print("Apalancamiento: 1:", leverage);
}
Explicación del código:
- Usamos
AccountInfoInteger,AccountInfoDoubleyAccountInfoStringpara obtener diferentes parámetros de la cuenta. - Mostramos la información en la ventana de resultados con formato legible.
Interactividad: Ejercicios Prácticos
Ejercicio 1: Modifica el ejemplo de listado de símbolos para filtrar solo los pares de divisas (Forex).
Ver solución:Ocultar solución//+------------------------------------------------------------------+
//| Script para listar solo los pares de divisas (Forex) |
//| |
//| Propósito: Filtrar y mostrar solo los símbolos que corresponden |
//| a pares de divisas en el mercado Forex. |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
int totalSymbols = SymbolsTotal(true); // Obtener el número total de símbolos disponibles (incluyendo ocultos)
Print("Número total de símbolos disponibles: ", totalSymbols);
if (totalSymbols > 0) {
Print("Lista de pares de divisas (Forex):");
for (int i = 0; i < totalSymbols; i++) {
string symbol = SymbolName(i, true); // Obtener el nombre del símbolo
// Verificar si el símbolo pertenece al grupo Forex
if (SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE) == TRADE_CALC_MODE_FOREX) {
Print("Símbolo ", i + 1, ": ", symbol);
}
}
} else {
Print("No hay símbolos disponibles.");
}
}
Explicación del Código
- Obtención del Número Total de Símbolos:
- Usamos
SymbolsTotal(true)para obtener el número total de símbolos disponibles en el terminal, incluidos los ocultos.
- Usamos
- Filtrado de Pares de Divisas (Forex):
- Iteramos sobre todos los símbolos utilizando un bucle
for. - Para cada símbolo, verificamos si pertenece al grupo Forex usando la función
SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE). Esta función devuelve el modo de cálculo de trading del símbolo. - Si el modo de cálculo es
TRADE_CALC_MODE_FOREX, significa que el símbolo es un par de divisas.
- Iteramos sobre todos los símbolos utilizando un bucle
- Mostrar los Pares de Divisas:
- Si un símbolo cumple con la condición de ser un par de divisas, lo mostramos en la ventana de resultados.
Resultado Esperado
Cuando ejecutes este script, verás un mensaje similar al siguiente en la ventana de resultados:
Número total de símbolos disponibles: 500
Lista de pares de divisas (Forex):
Símbolo 1: EURUSD
Símbolo 2: GBPUSD
Símbolo 3: USDJPY
Símbolo 4: AUDUSD
...
Si no hay símbolos disponibles o no se encuentran pares de divisas, se mostrará un mensaje como este:
No hay símbolos disponibles.
Caso Práctico
Este tipo de script puede ser útil para traders que desean automatizar estrategias específicas para pares de divisas. Al filtrar solo los símbolos relevantes, puedes:
- Reducir el tiempo de procesamiento al trabajar con menos instrumentos.
- Implementar estrategias de trading exclusivamente para Forex sin preocuparte por otros tipos de instrumentos (como acciones o criptomonedas).
¡Espero que este ejemplo te sea útil para entender cómo filtrar y trabajar con símbolos específicos en MQL5!
Ejercicio 2: Escribe un script que calcule el porcentaje de margen utilizado (used margin %) basado en el margen libre y el margen total.
//+------------------------------------------------------------------+
//| Script para calcular el porcentaje de margen utilizado |
//| |
//| Propósito: Calcular y mostrar el porcentaje de margen utilizado |
//| basado en el margen libre y el margen total. |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
// Obtener el margen libre y el margen total desde la cuenta
double freeMargin = AccountInfoDouble(ACCOUNT_FREEMARGIN); // Margen libre
double totalMargin = AccountInfoDouble(ACCOUNT_MARGIN); // Margen total (usado + libre)
// Verificar si el margen total es mayor que cero para evitar divisiones por cero
if (totalMargin > 0) {
// Calcular el margen utilizado
double usedMargin = totalMargin - freeMargin;
// Calcular el porcentaje de margen utilizado
double usedMarginPercentage = (usedMargin / totalMargin) * 100;
// Mostrar los resultados en la ventana de resultados
Print("Margen Libre: ", DoubleToString(freeMargin, 2), " USD");
Print("Margen Total: ", DoubleToString(totalMargin, 2), " USD");
Print("Margen Utilizado: ", DoubleToString(usedMargin, 2), " USD");
Print("Porcentaje de Margen Utilizado: ", DoubleToString(usedMarginPercentage, 2), " %");
} else {
// Si el margen total es cero, mostrar un mensaje de advertencia
Print("El margen total es cero. No se puede calcular el porcentaje de margen utilizado.");
}
}
Explicación del Código
- Obtención del Margen Libre y Total:
- Usamos
AccountInfoDouble(ACCOUNT_FREEMARGIN)para obtener el margen libre disponible en la cuenta. - Usamos
AccountInfoDouble(ACCOUNT_MARGIN)para obtener el margen total (que incluye tanto el margen utilizado como el libre).
- Usamos
- Cálculo del Margen Utilizado:
- El margen utilizado se calcula restando el margen libre del margen total:
usedMargin = totalMargin - freeMargin.
- El margen utilizado se calcula restando el margen libre del margen total:
- Cálculo del Porcentaje de Margen Utilizado:
- Calculamos el porcentaje de margen utilizado dividiendo el margen utilizado entre el margen total y multiplicando por 100:
usedMarginPercentage = (usedMargin / totalMargin) * 100.
- Calculamos el porcentaje de margen utilizado dividiendo el margen utilizado entre el margen total y multiplicando por 100:
- Validación para Evitar Divisiones por Cero:
- Antes de realizar el cálculo, verificamos que el margen total sea mayor que cero para evitar errores matemáticos.
- Mostrar Resultados:
- Mostramos el margen libre, el margen total, el margen utilizado y el porcentaje de margen utilizado en la ventana de resultados con una precisión de dos decimales.
Resultado Esperado
Cuando ejecutes este script, verás un mensaje similar al siguiente en la ventana de resultados:
Margen Libre: 5000.00 USD
Margen Total: 10000.00 USD
Margen Utilizado: 5000.00 USD
Porcentaje de Margen Utilizado: 50.00 %
Si el margen total es cero, se mostrará un mensaje como este:
El margen total es cero. No se puede calcular el porcentaje de margen utilizado.
Caso Práctico
Este tipo de script es útil para traders que desean monitorear su uso de margen y gestionar mejor sus riesgos. Al conocer el porcentaje de margen utilizado, puedes:
- Evaluar si estás cerca del nivel de margen de llamada (margin call).
- Ajustar el tamaño de tus posiciones para evitar ser liquidado.
- Implementar estrategias automáticas que cierren posiciones si el margen utilizado supera cierto umbral.
¡Espero que este ejemplo te sea útil para entender cómo trabajar con información de la cuenta en MQL5!
Ejercicio 3: Crea un script que verifique si el saldo de la cuenta es suficiente para abrir una posición con un tamaño de lote dado.
Ver solución:Ocultar solución//+------------------------------------------------------------------+
//| Script para verificar si el saldo es suficiente para abrir una posición |
//| |
//| Propósito: Verificar si el saldo de la cuenta permite abrir una |
//| posición con un tamaño de lote específico. |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
string symbol = "EURUSD"; // Símbolo a analizar
double lotSize = 0.1; // Tamaño de lote deseado
double balance = AccountInfoDouble(ACCOUNT_BALANCE); // Saldo actual de la cuenta
double requiredMargin = 0.0; // Margen requerido para abrir la posición
// Verificar si el símbolo existe en el mercado
if (!SymbolExists(symbol)) {
Print("El símbolo ", symbol, " no está disponible.");
return;
}
// Calcular el margen requerido para abrir la posición
requiredMargin = CalculateRequiredMargin(symbol, lotSize);
// Comparar el saldo con el margen requerido
if (balance >= requiredMargin) {
Print("Saldo suficiente para abrir una posición.");
Print("Saldo actual: ", DoubleToString(balance, 2), " USD");
Print("Margen requerido: ", DoubleToString(requiredMargin, 2), " USD");
} else {
Print("Saldo insuficiente para abrir una posición.");
Print("Saldo actual: ", DoubleToString(balance, 2), " USD");
Print("Margen requerido: ", DoubleToString(requiredMargin, 2), " USD");
}
}
// Función para calcular el margen requerido para abrir una posición
double CalculateRequiredMargin(string symbol, double lotSize) {
double contractSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE); // Tamaño del contrato
double marginRate = SymbolInfoDouble(symbol, SYMBOL_MARGIN_INITIAL); // Tasa de margen inicial
double askPrice = SymbolInfoDouble(symbol, SYMBOL_ASK); // Precio de compra actual
// Calcular el margen requerido: (tamaño de lote * tamaño del contrato * precio) * tasa de margen
double requiredMargin = (lotSize * contractSize * askPrice) * marginRate;
return requiredMargin;
}
Explicación del Código
- Verificación del Símbolo:
- Usamos
SymbolExists(symbol)para asegurarnos de que el símbolo (EURUSDen este caso) esté disponible en el mercado.
- Usamos
- Cálculo del Margen Requerido:
- Definimos una función
CalculateRequiredMarginque calcula el margen necesario para abrir una posición basándose en:- El tamaño del contrato (
SYMBOL_TRADE_CONTRACT_SIZE). - La tasa de margen inicial (
SYMBOL_MARGIN_INITIAL). - El precio actual de compra (
SYMBOL_ASK).
- El tamaño del contrato (
- La fórmula utilizada es: Margen requerido=(Taman˜o de lote×Taman˜o del contrato×Precio)×Tasa de margen.
- Definimos una función
- Comparación del Saldo con el Margen Requerido:
- Obtenemos el saldo actual de la cuenta usando
AccountInfoDouble(ACCOUNT_BALANCE). - Comparamos el saldo con el margen requerido:
- Si el saldo es mayor o igual al margen requerido, mostramos un mensaje indicando que hay suficiente saldo.
- Si el saldo es menor, mostramos un mensaje indicando que no hay suficiente saldo.
- Obtenemos el saldo actual de la cuenta usando
- Mostrar Resultados:
- Mostramos tanto el saldo actual como el margen requerido en la ventana de resultados para que el trader pueda tomar decisiones informadas.
Resultado Esperado
Cuando ejecutes este script, verás un mensaje similar al siguiente en la ventana de resultados:
- Si hay suficiente saldo:
Saldo suficiente para abrir una posición.
Saldo actual: 10000.00 USD
Margen requerido: 500.00 USD
- Si no hay suficiente saldo:
Saldo insuficiente para abrir una posición.
Saldo actual: 1000.00 USD
Margen requerido: 2000.00 USD
Caso Práctico
Este tipo de script es extremadamente útil para traders que desean automatizar la gestión de riesgos y evitar errores al enviar órdenes con saldo insuficiente. Algunas aplicaciones prácticas incluyen:
- Prevenir el envío de órdenes que podrían causar una llamada de margen.
- Ajustar automáticamente el tamaño de lote según el saldo disponible.
- Implementar estrategias de trading que solo operen cuando el saldo sea suficiente.
¡Espero que este ejemplo te sea útil para entender cómo trabajar con información financiera y tomar decisiones basadas en datos reales en MQL5!
Conclusión: En este capítulo, hemos aprendido cómo trabajar con múltiples símbolos, normalizar precios y lotes, y obtener información detallada sobre la cuenta en MQL5. Estos conceptos son esenciales para desarrollar estrategias robustas que se adapten a diferentes condiciones de mercado y brokers.
En el próximo capítulo, profundizaremos en la creación de indicadores personalizados, lo que nos permitirá implementar análisis técnicos avanzados.
¡Sigue practicando y perfeccionando tus habilidades en MQL5!
