
Integración de Discord con MetaTrader 5: Creación de un robot comercial con notificaciones en tiempo real
Introducción
La capacidad de supervisar y controlar a distancia la actividad comercial resulta cada vez más importante en los mercados actuales, que cambian con gran rapidez. Una de las posibles soluciones para implementar dicha función de supervisión remota sería la integración de las notificaciones de Discord con MetaTrader 5. Recibiendo notificaciones en la aplicación Discord, podrá monitorear sus actividades en tiempo real desde cualquier lugar. En este artículo, usaremos un ejemplo real de un bot comercial aleatorio para ilustrar las ideas y los pasos de implementación. Así, estableceremos una conexión fiable entre MetaTrader 5 y la plataforma Discord, con ayuda de la cual podrá recibir notificaciones en tiempo real sobre transacciones, cambios en el mercado y otras alertas.
En este artículo, veremos qué ajustes deberemos realizar en la plataforma para permitir dicha integración. En concreto, veremos los ajustes de WebRequest que permiten vincular la plataforma a otros recursos como Discord y otros servicios de mensajería instantánea. También veremos cómo configurar un servidor de Discord para poder recibir notificaciones de MetaTrader 5.
El material presentado en este artículo requiere algunos conocimientos previos de programación MQL5 y una buena comprensión de los principios de funcionamiento de la plataforma.
Configuración de Discord y MetaTrader 5
Deberemos añadir estos dos https y asegurarnos de que la URL especificada permite solicitudes web:
Además de crear y copiar el webhook, también necesitaremos configurar un servidor (o utilizar el que ya tengamos en Discord).
Ejemplo de código del asesor experto
En el asesor, no deberemos olvidarnos de insertar el enlace WebHook.
#include <Trade/Trade.mqh> CTrade trade; // Discord webhook URL - Replace with your webhook URL string discord_webhook = "https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXXXXXXXX"; // Strategy Parameters
*** Desconocemos por qué, pero hay que cambiar el webhook de discordapp.com a discord.com.
He aquí cómo hemos configurado los parámetros básicos de Discord de nuestro asesor experto de MetaTrader 5:
string discord_webhook = "https://discord.com/api/webhooks/your-webhook-url"; input group "Discord Settings" input string DiscordBotName = "MT5 Trading Bot"; input color MessageColor = clrBlue; input bool SendPriceUpdates = true;
El vínculo más importante entre Discord y nuestro asesor experto de MetaTrader 5 es la dirección de URL de webhook. Además, hemos incluido entradas que los usuarios pueden personalizar para cambiar el aspecto y el comportamiento del bot. Estas características ofrecen flexibilidad de integración, lo que permite a los tráders modificar el sistema para adaptarlo a sus necesidades.
El paso más importante para garantizar una conexión fiable entre MetaTrader 5 y Discord será el procedimiento de activación. En este punto necesitaremos confirmar que el webhook de Discord funciona correctamente y que el EA tiene las credenciales necesarias para enviar peticiones web. En este proceso de verificación se incluyen varias pruebas importantes:int OnInit() { Print("Initialization step 1: Checking WebRequest permissions..."); if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) { Print("Error: WebRequest is not allowed. Please allow in Tool -> Options -> Expert Advisors"); return INIT_FAILED; } string test_message = "{\"content\":\"Test message from MT5\"}"; string headers = "Content-Type: application/json\r\n"; char data[], result[]; ArrayResize(data, StringToCharArray(test_message, data, 0, WHOLE_ARRAY, CP_UTF8) - 1); int res = WebRequest( "POST", discord_webhook, headers, 5000, data, result, headers ); if(res == -1) { Print("Make sure these URLs are allowed: https://discord.com/*, https://discordapp.com/*"); return INIT_FAILED; } return(INIT_SUCCEEDED); }
Para que las alertas de Discord resulten informativas y estéticamente agradables, deberemos dar el formato correcto a los mensajes. Como Discord admite el formato Markdown, podremos organizar nuestros mensajes para resaltar la información importante. Hemos implementado un método minucioso de formateo de los datos de las operaciones que permite comprender rápida y fácilmente los detalles específicos de cada transacción:
string FormatTradeMessage(TradeInfo& tradeInfo) { string message = "**New " + tradeInfo.type + " Signal Alert!**\n"; message += "Symbol: " + tradeInfo.symbol + "\n"; message += "Type: " + tradeInfo.type + "\n"; message += "Price: " + DoubleToString(tradeInfo.price, _Digits) + "\n"; message += "Lots: " + DoubleToString(tradeInfo.lots, 2) + "\n"; message += "Stop Loss: " + DoubleToString(tradeInfo.sl, _Digits) + "\n"; message += "Take Profit: " + DoubleToString(tradeInfo.tp, _Digits) + "\n"; message += "Time: " + TimeToString(TimeCurrent()); return message; }
El procesamiento adecuado de los caracteres especiales resulta crucial al trabajar con datos JSON en MetaTrader 5 para evitar línea JSON incorrectas que puedan provocar la entrega de mensajes fallidos. Parte de nuestra implementación supone un robusto método de escape JSON que puede procesar todos los caracteres especiales comunes:
string EscapeJSON(string text) { string escaped = text; StringReplace(escaped, "\\", "\\\\"); StringReplace(escaped, "\"", "\\\""); StringReplace(escaped, "\n", "\\n"); StringReplace(escaped, "\r", "\\r"); StringReplace(escaped, "\t", "\\t"); return escaped; }
La función SendDiscordMessage posibilita la entrega fiable de mensajes de MetaTrader 5 a Discord a través de la API webhook de Discord. En esencia, esta función toma como parámetros una línea de mensaje y una bandera de error opcional, convirtiéndolos en una petición HTTP con el formato adecuado que los servidores de Discord puedan entender y procesar.
La función comienza con una comprobación de seguridad verificando si las peticiones web están activadas mediante el indicador isWebRequestEnabled. Este paso de verificación impedirá cualquier intento de comunicación cuando la plataforma MetaTrader 5 no disponga de los permisos necesarios, evitando así posibles cuelgues o caídas del sistema. Si las peticiones web no están habilitadas, la función retornará inmediatamente false, indicando que el mensaje no puede enviarse.
Al construir un mensaje, la función utilizará etiquetas visuales para mejorar la legibilidad. Esta añadirá ❌ para mensajes de error o ✅ para mensajes de éxito. Estas señales visuales permitirán a los tráders conocer rápidamente lo esencial de las notificaciones con solo un vistazo en su canal de Discord.
A continuación, el mensaje se empaquetará en una carga útil JSON, que seguirá el formato esperado por la API de Discord. La función EscapeJSON (llamada en la construcción carga útil) juega un papel importante aquí, garantizando que los caracteres especiales en el mensaje no rompan la estructura JSON. Esto incluye el procesamiento de las comillas, los saltos de línea y otros caracteres especiales que, de otro modo, podrían causar errores de análisis.
La función establece los encabezados HTTP correctos, indicando específicamente que el tipo de contenido es JSON. Esta información del encabezado resulta crucial porque indica a los servidores de Discord cómo interpretar los datos entrantes. El encabezado Content-Type está configurado como application/json, que supone el estándar para las comunicaciones API REST.
Un aspecto técnico consiste en convertir una cadena de caracteres en un array de caracteres. Esta conversión es necesaria porque la función WebRequest en MetaTrader 5 espera datos binarios, no líneas simples. La función ArrayResize ofrece el tamaño correcto del array de caracteres para almacenar el mensaje convertido, considerando la codificación UTF-8, necesaria para procesar correctamente los caracteres especiales y los emoji.
La interacción real se produce llamando a la función WebRequest, que envía una solicitud POST a la dirección URL del webhook de Discord. La función incluye varios parámetros importantes:
- Un valor de tiempo de espera de 5000 milisegundos (5 segundos) para evitar bloqueos del sistema si los servidores de Discord tardan en responder.
- Los encabezados y datos previamente preparados
- Los arrays para almacenar los datos de respuesta y los encabezados
La función monitorea el éxito de la entrega de los mensajes a través de los códigos de respuesta HTTP. Un código de respuesta 200 o 204 indicará que la entrega se ha realizado correctamente (200 indica éxito con contenido devuelto, 204 indica éxito sin contenido). En caso de éxito, la función actualizará la marca temporal lastMessageTime, que puede utilizarse para limitar la velocidad, y retornará true, lo cual indica que la entrega se ha realizado correctamente.
En los casos en que el mensaje no se envíe (esto se indicará mediante cualquier código de respuesta distinto de 200 o 204), la función retornará false, permitiendo que el código de llamada gestione el error de la forma correspondiente. Este mecanismo de gestión de errores le permite implementar una lógica de reintento o métodos de notificación alternativos en caso de que falle la comunicación con Discord.
Esta implementación crea un canal de comunicación robusto y fiable entre MetaTrader 5 y Discord, procesando todas las complejidades de la interacción entre plataformas y ofreciendo al código de llamada una clara retroalimentación sobre el éxito/fracaso. La atención prestada al correcto procesamiento de errores, la codificación de caracteres y el cumplimiento de la API hacen de esta función un componente básico fiable del sistema de integración de Discord.
bool SendDiscordMessage(string message, bool isError = false) { if(!isWebRequestEnabled) return false; message = (isError ? "❌ " : "✅ ") + message; string payload = "{\"content\":\"" + EscapeJSON(message) + "\"}"; string headers = "Content-Type: application/json\r\n"; char post[], result[]; ArrayResize(post, StringToCharArray(payload, post, 0, WHOLE_ARRAY, CP_UTF8) - 1); int res = WebRequest( "POST", discord_webhook, headers, 5000, post, result, headers ); if(res == 200 || res == 204) { lastMessageTime = TimeCurrent(); return true; } return false; }
Hemos puesto en práctica la integración de Discord implementando un método básico de comercio aleatorio. Esta táctica demuestra cómo combinar con éxito la lógica comercial con las alertas de Discord, aunque su objetivo principal sea ilustrativo:
void PlaceRandomTrade() { bool isBuy = (MathRand() % 2) == 1; double price = isBuy ? SymbolInfoDouble(_Symbol, SYMBOL_ASK) : SymbolInfoDouble(_Symbol, SYMBOL_BID); int slPoints = 50 + (MathRand() % 100); int tpPoints = 50 + (MathRand() % 100); double sl = isBuy ? price - slPoints * _Point : price + slPoints * _Point; double tp = isBuy ? price + tpPoints * _Point : price - tpPoints * _Point; TradeInfo tradeInfo; tradeInfo.symbol = _Symbol; tradeInfo.type = isBuy ? "BUY" : "SELL"; tradeInfo.price = price; tradeInfo.lots = LotSize; tradeInfo.sl = sl; tradeInfo.tp = tp; string message = FormatTradeMessage(tradeInfo); if(SendDiscordMessage(message)) { trade.SetExpertMagicNumber(magicNumber); bool success = isBuy ? trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LotSize, price, sl, tp, "Random Strategy Trade") : trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, LotSize, price, sl, tp, "Random Strategy Trade"); if(success) { SendDiscordMessage("✅ Trade executed successfully! Ticket: " + IntegerToString(trade.ResultOrder())); } } }
Las actualizaciones periódicas del mercado pueden ser muy útiles para los tráders que deseen seguir la evolución de los precios sin tener que estar constantemente pendientes de su plataforma de negociación. Hemos implementado una función de actualización de precios que actualiza Discord de forma regular:
void SendPriceUpdate() { if(!SendPriceUpdates) return; if(TimeCurrent() - lastMessageTime < 300) return; string message = "```\n"; message += "Price Update for " + _Symbol + "\n"; message += "Bid: " + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits) + "\n"; message += "Ask: " + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits) + "\n"; message += "Spread: " + DoubleToString(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD), 0) + " points\n"; message += "```"; SendDiscordMessage(message); }
Cuando el asesor experto termina, la implementación contiene las siguientes rutinas de limpieza relevantes:
void OnDeinit(const int reason) { SendDiscordMessage("```\nEA stopped. Reason code: " + IntegerToString(reason) + "```"); }
Ejemplo de resultado
En este ejemplo de integración, cabe destacar:
La gestión de la seguridad y los webhooks
Hay una serie de factores importantes que debemos tener en cuenta a la hora de integrar Discord en nuestro entorno de trabajo. La seguridad está por encima de todo. Como cualquier persona con acceso a la URL del webhook puede publicar mensajes en nuestro canal de Discord, deberemos operar como si lo hiciéramos con datos confidenciales. Para proteger la URL del webhook, recomendamos utilizar métodos de encriptación o colocarla en un archivo de configuración seguro.
Otro factor importante a considerar es la fiabilidad de la red. La API de Discord puede bloquearse ocasionalmente o encontrar limitaciones de velocidad, y las conexiones a Internet pueden resultar inestables. Para hacer frente a estas circunstancias, nuestra solución deberá incluir funciones eficaces de gestión de errores y reintento. Y esto implicará la necesidad de mantener una cola de mensajes para repetir los intentos fallidos y aplicar un método de retardo exponencial para los mismos.
Rendimiento
Igualmente importante resultará mejorar el rendimiento, sobre todo de los sistemas comerciales de alta frecuencia. Las alertas de Discord son útiles, pero no deberían afectar al funcionamiento de nuestra lógica comercial. Para gestionar las interacciones de Discord sin interferir con sus actividades principales de ventas, consideraremos la posibilidad de crear un hilo independiente o utilizar una cola de mensajes asíncrona.
Hay varias formas de mejorar nuestra experiencia comercial con Discord. Por ejemplo, podemos necesitar indicadores de rendimiento en tiempo real, como estadísticas comerciales y cálculos de pérdidas y ganancias, además de alertas del sistema de gestión de riesgos que indiquen cuándo se han alcanzado determinados niveles de exposición. El análisis del mercado se actualizará en función del rendimiento de su nuestro plan comercial. También deberemos supervisar el estado del sistema, incluidos los índices de error y la conexión de comandos personalizados basados en Discord que permiten cambiar parámetros o comprobar el estado de nuestro sistema comercial.Para poner en práctica estos añadidos, tendremos que pensar detenidamente cómo organizar los distintos tipos de información y cómo estructurar los mensajes. Podemos utilizar el estilo de marcado de Discord para crear mensajes visualmente únicos para distintos tipos de notificaciones, lo cual facilitará la rápida identificación de la información importante.
En cualquier caso, siempre es buena idea encontrar un equilibrio entre ofrecer información útil y evitar la sobrecarga de información al añadir nuevas funciones. Piense en sus notificaciones más importantes. Podría tener sentido desactivar ciertos tipos de notificaciones o direcciones URL de webhooks individuales para diferentes categorías de mensajes.
Ejemplos de uso
He aquí algunos posibles usos en el mundo real de esta integración de Discord:
- Gestión de portafolios: seguimiento de múltiples métodos de negociación en diferentes cuentas
- Notificación de peligros: notificación inmediata cuando se superen los niveles establecidos
- Recepción de actualizaciones frecuentes sobre los resultados de la estrategia y las condiciones del mercado
- Intercambio de investigaciones de mercado y señales comerciales con el equipo de negociación
El planteamiento que hemos comentado ofrece a estas aplicaciones una base sólida y también permite personalizarlas fácilmente para satisfacer requisitos específicos. Comprender los aspectos técnicos de la integración, así como los requisitos reales de los tráders que utilizarán el sistema, resulta fundamental para una implementación eficaz.
Mantener la integración de Discord funcionando de forma fiable requiere pruebas y supervisión periódicas. Y esto implica controlar la velocidad de entrega de los mensajes, hacer un seguimiento de las comunicaciones fallidas y garantizar que todas las alertas importantes se envían a tiempo. Considere la posibilidad de implantar sistemas de registro que monitoreen toda la correspondencia de Discord y cualquier error que se produzca: esto le permitirá encontrar y solucionar rápidamente cualquier problema que surja.
Los únicos límites a las múltiples opciones de ampliación y mejora de la comunicación serán la propia creatividad y los requisitos comerciales. Podemos crear un potente sistema de comunicación que mejore nuestras operaciones comerciales y nos mantenga informados de las actividades comerciales desde cualquier lugar del mundo empezando por esta sólida base y añadiendo gradualmente funciones basadas en los comentarios y el uso en el mundo real.
Control y mantenimiento
Recuerde que disponer de los recursos y conocimientos adecuados resulta tan importante para negociar con eficacia como contar con métodos sólidos. La integración de Discord supone una herramienta vital para los tráders modernos, ya que establece un vínculo importante entre nuestro sistema comercial automatizado y la capacidad para supervisar al instante las condiciones del mercado y reaccionar ante ellas.
Conclusión
Como conclusión, queremos decir que la integración de Discord con MetaTrader 5 supone otra solución útil que ofrece a los tráders la posibilidad de supervisar las circunstancias del mercado y reaccionar ante ellas. Las ventajas de las notificaciones en tiempo real, la comunicación entre los miembros del equipo y las capacidades de supervisión remota lo hacen muy útil y cómodo. No obstante, el lector necesitará tiempo y conocimientos para ponerlo en práctica. También deberá tener mucho cuidado y prestar atención a la seguridad, la fiabilidad de la red y la optimización del rendimiento. La posibilidad de usar funciones avanzadas como las notificaciones de voz, las instrucciones interactivas y la clasificación de alertas basada en el aprendizaje automático abre aún más oportunidades para mejorar el rendimiento de las transacciones a medida que ambas plataformas siguen evolucionando. Independientemente de dónde se encuentren, los tráders podrán mantener un mayor control sobre sus operaciones y asegurarse de no perderse nunca los movimientos importantes del mercado o las señales comerciales gracias a la conexión entre los sistemas de negociación automatizados y la comunicación en tiempo real. Archivo | Ruta |
---|---|
Discord_examples.mq5 | Guarde en la siguiente carpeta: MQL5/Experts/ |
Atentamente, Javier S. Gastón de Iriarte Cabrera
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/16682
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.





- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso