Cerrar todas las órdenes/posiciones para MT4/MT5
Contenido
- Cerrar todas las órdenes con MQL4
- Cerrar todas las posiciones con MQL5
- Lógica de funcionamiento al cerrar todas las posiciones con MQL5
- Posibles mejoras
- Script para cerrar todas las órdenes
- Descargar script para cerrar todas las posiciones en MT5
- Instalación del script para cerrar todas las posiciones en MT5
- Operaciones masivas en MT5 vs. Script para cerrar todas las posiciones
- Conclusión
- Discusión
- Registro de cambios
La gestión de las órdenes es una tarea fundamental cuando se trabaja con herramientas de trading y asesores expertos. En algunos casos, especialmente cuando hay un desencadenante de alguna regla de gestión de riesgos, es posible que desee cerrar todas las órdenes abiertas. Aquí, examinaremos dos funciones (una en código MQL4 y otra en código MQL5) para hacer eso, y también podrá descargar un script gratuito para cerrar todas las órdenes en MT4 (un script que puede cerrar todas las órdenes abiertas automáticamente). Un script similar llamado Cerrar todas las posiciones también está disponible para MetaTrader 5.
Cerrar todas las órdenes con MQL4
Al programar un asesor experto, todos deberíamos aplicar medidas de seguridad para protegernos de grandes pérdidas. La gestión del riesgo es un pilar fundamental de un EA. Es necesario establecer reglas para que su EA pueda cerrar todas las órdenes si se cumple alguna condición.
Algunos ejemplos que podrían desencadenar el cierre de todos las órdenes pueden ser:
- Un grupo de órdenes alcanzó el take-profit.
- La pérdida acumulada de las órdenes abiertas hace que el patrimonio o el margen se sitúen por debajo de un umbral específico.
- Está prevista la publicación de un informe que podría tener un fuerte impacto en los precios.
- Un acontecimiento inesperado provoca cambios bruscos en los tipos de cambio.
Estas son solo algunas situaciones que pueden empujarle a cerrar todas las órdenes abiertas inmediatamente. Esto se consigue con un sencillo fragmento de código MQL4.
Probablemente ya ha leído nuestra guía sobre la función OrderClose, que puede cerrar una orden en concreto en MT4. A continuación, puede ver cómo utilizarla para cerrar todas las órdenes con una función personalizada.
La siguiente función en MQL4 para cerrar todas las órdenes puede cerrar todas las órdenes a mercado abiertas en la misma ejecución.
void CloseOrders() { int total = OrdersTotal(); // Registrar en el terminal el número total de órdenes. Print(total); // Iniciar un bucle para escanear todos las órdenes. // El bucle empieza por la última, de lo contrario podría saltarse órdenes. for (int i = total - 1; i >= 0; i--) { // Si la orden no puede ser seleccionada, lanza y registra un error. if (OrderSelect(i, SELECT_BY_POS) == false) { Print("ERROR - No se ha podido seleccionar la orden - ", GetLastError()); break; } // Variable resultado: para comprobar si la operación se ha realizado correctamente o no. bool result = false; // Actualizar los tipos de cambio antes de cerrar las órdenes. RefreshRates(); // Precio de compra y venta para el símbolo de la orden. double BidPrice = MarketInfo(OrderSymbol(), MODE_BID); double AskPrice = MarketInfo(OrderSymbol(), MODE_ASK); // Cerrar la orden utilizando el precio correcto en función del tipo de orden. if (OrderType() == OP_BUY) { result = OrderClose(OrderTicket(), OrderLots(), BidPrice, Slippage); } else if (OrderType() == OP_SELL) { result = OrderClose(OrderTicket(), OrderLots(), AskPrice, Slippage); } // Si hubo un error, registrarlo. if (!result) Print("ERROR - No se ha podido cerrar la orden - ", OrderTicket(), " - Error ", GetLastError()); } }
Lógica de funcionamiento al cerrar todas las órdenes con MQL4
La lógica de la función es la siguiente
- Utilizando un bucle, escanea todos las órdenes.
- Actualiza los precios.
- Si el tipo de orden es de compra o venta a mercado, cierra la orden utilizando el precio correcto.
- Comprobar si la operación se ha realizado correctamente para cada orden y, en caso contrario, devolver un error.
Posibles mejoras
La función no es muy compleja y puede mejorarse con filtros adicionales. Por ejemplo, puede que desee aplicar alguno de los siguientes filtros:
- Cerrar solo las órdenes con beneficios.
- Cerrar solo las órdenes con pérdidas.
- Cerrar solo las órdenes de un par en concreto.
- Cerrar solo las órdenes con un número mágico específico.
- Otros filtros.
La función anterior, en una forma algo modificada, es utilizada por muchos de nuestros asesores expertos.
Script para cerrar todas las órdenes
Si desea cerrar todas las órdenes en MT4, debe hacerlo manualmente, a menos que utilice una herramienta externa.
Desafortunadamente, MT4 no permite seleccionar todas las órdenes abiertas y cerrarlas todas a la vez.
¡Pero hay una solución! Puede programar su propio script utilizando la función anterior como plantilla o puede utilizar una herramienta ya creada.
El script que se proporciona a continuación se puede copiar en su plataforma de MT4 y le permitirá cerrar todas las órdenes con solo un par de clics.
Hay una serie de parámetros de entrada para configurar el script según sus preferencias:
Además de los parámetros de filtrado, existe la opción de ordenar las órdenes antes de cerrarlas en un orden determinado. Esto le permite optar por cerrar primero las órdenes de mayor prioridad.
Una opción interesante es establecer un retraso (en milisegundos) entre los intentos de cierre para evitar sobrecargar el servidor de trading, ya que algunos brókeres de Forex no permiten tal comportamiento y pueden bloquear el trading automático en su cuenta.
También puede controlar el número de intentos que realizará el script para cerrar cada orden. Esto permite asegurar el cierre adecuado de las operaciones incluso durante periodos de alta volatilidad, cuando una orden de cierre al servidor puede fallar debido a algún error.
Descargar el script Cerrar todas las órdenes para MT4
➥ Descargar Cerrar todas las órdenes para MT4Instalación del script para cerrar todas las órdenes en MT4
Para instalar el script, siga las siguientes instrucciones:
- Descargue el archivo del script.
- Abra la carpeta de datos de MetaTrader 4 (mediante Archivo→Abrir carpeta de datos).
- Abra la carpeta MQL4.
- Copie todas las carpetas del archivo directamente en la carpeta MQL4.
- Reinicie MetaTrader 4 o actualice la lista de scripts haciendo clic derecho en la subventana Navegador de la plataforma y seleccionando Actualizar.
También puede leer unas instrucciones más detalladas sobre cómo realizar la instalación.
Asegúrese de activar permitir el comercio algorítmico o Live Trading en la pestaña Común al ejecutar este script y también en el menú de la plataforma Herramientas→Opciones→Asesores Expertos. De lo contrario, no podrá cerrar ninguna orden.
Parámetros de entrada preintroducidos
Puede introducir previamente los valores de los parámetros de entrada del script Cerrar todas las órdenes y, a continuación, guardar una copia con un nombre de archivo diferente para utilizar scripts preconfigurados siempre que los necesite sin necesidad de dedicar tiempo a la modificación de los parámetros de entrada.
De esta forma, tendrá a mano varios scripts listos para ser ejecutados (mediante un atajo de teclado, por ejemplo) en función de la situación.
Por ejemplo, hagamos una versión para cerrar solo todas las operaciones perdedoras.
Primero, necesita abrir el archivo CloseAllOrders.mq4 y localizar el parámetro de entrada OnlyInLoss:
Ahora, cambie el valor por defecto de false a true:
También tiene sentido eliminar por completo la propiedad show_inputs
en una versión preconfigurada. Esto evitará que aparezca la ventana de confirmación al iniciar el script:
La línea puede comentarse (con dos barras delante) o eliminarse por completo:
Ahora puede guardar el archivo con otro nombre para distinguirlo del script "Cerrar todas las órdenes" estándar. Por ejemplo, puede llamar a este CloseAllOrders_Losing.mq4:
Ahora es el momento de compilar el código fuente:
Ahora puede ejecutar el nuevo script como de costumbre en su MetaTrader 4 o puede hacer clic derecho sobre él y establecer una tecla de acceso rápido:
Ahora puede ejecutar este script al instante para cerrar órdenes filtradas según sus requisitos específicos lo más rápidamente posible.
Un proceso similar puede repetirse para crear scripts que cierren solo órdenes de compra o solo órdenes de venta, o un script que cierre solo órdenes con un número mágico en concreto (si necesita cerrar solo operaciones abiertas por algún EA), etc.
Cerrar todas las posiciones con MQL5
El concepto de una función que cierra todas las operaciones en MetaTrader 5 no es muy diferente de la de MetaTrader 4. La principal diferencia es que las órdenes de mercado se llaman posiciones en MT5.
Esta función de cierre de posición se puede utilizar en las mismas situaciones en las que utilizaría la función de cierre de órdenes en MetaTrader 4.
El siguiente código en MQL5 para cerrar todas las posiciones está diseñado para eliminar todas las posiciones existentes en una sola ejecución.
void ClosePositions() { Trade = new CTrade; // Un objeto CTrade para cerrar posiciones. int total = PositionsTotal(); // Registra en el terminal el número total de posiciones. Print(total); // Inicia un bucle para escanear todas las posiciones. // El bucle empieza por la última, de lo contrario podría saltarse posiciones. for (int i = total - 1; i >= 0; i--) { // Si la posición no puede ser seleccionada, lanza y registra un error. if (PositionGetSymbol(i) == "") { Print("ERROR - No se ha podido seleccionar la posición - ", GetLastError()); break; } // Variable resultado: para comprobar si la operación se ha realizado correctamente o no. bool result = Trade.PositionClose(PositionGetInteger(POSITION_TICKET), Slippage); // Si hubo un error, registrarlo. if (!result) Print("ERROR - No se ha podido cerrar la posición - ", PositionGetInteger(POSITION_TICKET), " - Error ", GetLastError()); } }
Lógica de funcionamiento al cerrar todas las posiciones con MQL5
La lógica de la función es la siguiente:
- Utilizando un bucle, escanea todas las posiciones.
- Cierra la posición.
- Comprueba si la operación se ha realizado correctamente para cada posición y, en caso contrario, devuelve un error.
Como puede ver, es mucho más sencillo en MT5 que en MT4.
Posibles mejoras
Como en el caso de la función de cierre en MQL4, esta también podría mejorarse añadiendo varios filtros y opciones de ordenación.
Script para cerrar todas las órdenes
A diferencia de MT4, MetaTrader 5 tiene una funcionalidad incorporada para cerrar posiciones de forma masiva: las operaciones masivas. Sin embargo, como puede ver, tiene sus propias limitaciones:
Puede cerrar todas las posiciones, todas las posiciones rentables, todas las posiciones perdedoras, todas las posiciones de compra, todas las posiciones de venta, todas las posiciones en el <
símbolo actual>
o todas las posiciones en la <
dirección actual>
en el <
símbolo actual>
. Además, puede utilizar el método Cerrar con X opuesta para cerrar la posición actual utilizando posiciones opuestas en el mismo símbolo (solo en el modo de cobertura).
No está mal comparado con lo que ofrece MT4, pero se puede mejorar enormemente utilizando, como mínimo, filtros adicionales y opciones de ordenación.
El script proporcionado a continuación puede ser instalado en su plataforma MT5, permitiéndole cerrar todas las posiciones en base a sus preferencias:
Como en el caso del script para MT4 anterior, el script para MT5 permite filtrar posiciones, ordenarlas, añadir un retraso y establecer un número de reintentos cuando falla un cierre.
Descargar el script Cerrar todas las posiciones para MT5
➥ Descargar Cerrar todas las posiciones para MT5Instalación del script para cerrar todas las posiciones en MT5
Para instalar el script, siga las siguientes instrucciones:
- Descargue el archivo del script.
- Abra la carpeta de datos de MetaTrader 5 (mediante Archivo→Abrir carpeta de datos).
- Navega hasta la carpeta MQL5.
- Copie todas las carpetas del archivo directamente en la carpeta MQL5.
- Reinicie MetaTrader 5 o actualice la lista de scripts haciendo clic derecho en la subventana Navegador de la plataforma y seleccionando Actualizar.
También puede leer unas instrucciones más detalladas sobre cómo realizar la instalación.
Asegúrese de activar permitir el comercio algorítmico o Live Trading en la pestaña Común al ejecutar este script y también en el menú de la plataforma Herramientas→Opciones→Asesores Expertos. De lo contrario, no podrá cerrar ninguna orden.
Parámetros de entrada preintroducidos
Al igual que con la versión MT4 del script, tiene sentido preintroducir los valores de los parámetros de entrada y guardar una copia con un nuevo nombre de archivo para utilizar dichos scripts preconfigurados sin perder tiempo en las entradas.
Puede preparar varios de estos scripts de cierre de posiciones y lanzarlos en función de la situación actual de su cuenta de trading.
Por ejemplo, hagamos una versión para cerrar posiciones con un comentario específico, ordenadas desde la mayor ganancia a la mayor pérdida con 1 reintento máximo y un retraso de 0.1 segundos entre cada intento de cierre.
Primero, necesita abrir el archivo CloseAllPositions.mq5 y localizar los respectivos parámetros de entrada:
Ahora, tiene que establecer los nuevos valores por defecto:
De esta forma, el script solo cerrará posiciones con "SuperEA" como comentario. Esto puede ser especialmente útil cuando se ejecutan diferentes asesores expertos en su cuenta y le gustaría ser capaz de cerrar sus posiciones por separado.
Al igual que con la versión MT4, ahora tiene sentido eliminar la propiedad script_show_inputs
de esta versión preconfigurada:
Puede borrar la línea o comentarla (poniendo dos barras delante):
Ahora puede guardar la copia del archivo con un nombre diferente. Por ejemplo, este puede llamarse CloseAllPositions_Comment.mq5:
Ahora necesita compilar el nuevo script en MQL5:
El nuevo script está listo para su uso: puede ejecutarlo haciendo doble clic en él en su MetaTrader 5 o puede hacer clic derecho sobre él y establecer una tecla de acceso rápido:
Ahora el script puede ejecutarse rápidamente siempre que necesite cerrar posiciones filtradas y ordenadas en función de sus necesidades.
Puede repetir el proceso descrito anteriormente para crear otras versiones del script "cerrar todas". Por ejemplo, uno que funcione solo con posiciones que tengan un número mágico en concreto (si necesita controlar las operaciones de un EA específico).
Operaciones masivas en MT5 vs. Script para cerrar todas las posiciones
A pesar de que MetaTrader 5 ofrece una funcionalidad de cierre masivo de posiciones, no es tan potente como un script dedicado a cerrar todas las posiciones. Este último tiene las siguientes ventajas en comparación con las operaciones masivas de MT5:
- Filtrar por comentario de posición.
- Filtrar por número mágico de posición.
- Ordenación antes del cierre.
- Control del deslizamiento.
- Reintentos en operaciones de cierre fallidas.
- Opción de retraso entre cierres.
- Rapidez de acceso: el script puede ejecutarse con un atajo de teclado o un simple doble clic.
- Mayor personalización, incluido el registro detallado, por ejemplo.
Conclusión
El código anterior explica cómo funciona un script de cierre de orden/posición mediante un ejemplo básico. Nuestros scripts gratuitos Cerrar todas las órdenes para MT4 y Cerrar todas las posiciones para MT5 proporcionan una herramienta lista para la eliminación filtrada de operaciones, así como ejemplos más avanzados de código fuente MQL4/MQL5 para su estudio, modificación, actualización y uso en otros programas. Con ellos, puede crear fácilmente su propio script para cerrar órdenes y posiciones en MetaTrader utilizando condiciones y filtros personalizados.
Discusión
¿Tiene alguna sugerencia o pregunta sobre este script? Siempre puede debatir sobre Cerrar todas las órdenes y Cerrar todas las posiciones con otros traders de FX y programadores de MQL4/MQL5 en nuestro foro.
Registro de cambios
1.01 — 2023-12-26
- Se ha añadido la versión para MT5 del script: Cerrar todas las posiciones.
- Se ha añadido el parámetro de número de reintentos para que el script intente cerrar operaciones continuamente.
- Se han añadido opciones de ordenación para cerrar las operaciones en un orden específico.
- Se ha cambiado el comportamiento del script para que las órdenes pendientes ya ni siquiera se procesen.