English Русский 中文 Deutsch 日本語 Português
preview
Integración de las API de los brókers con los Asesores Expertos usando MQL5 y Python

Integración de las API de los brókers con los Asesores Expertos usando MQL5 y Python

MetaTrader 5Ejemplos |
207 6
Clemence Benjamin
Clemence Benjamin

Introducción

Hoy exploraremos cómo establecer una conexión perfecta entre nuestros asesores expertos de MetaTrader 5 y los brókers externos mediante la integración de API. El objetivo principal es abordar el problema de la insuficiencia de fondos en las cuentas de negociación, permitiendo recargas automáticas cuando los saldos caen por debajo de un umbral establecido. Este enfoque aborda de manera eficaz cuestiones críticas relacionadas con la gestión de fondos, mejorando tanto la eficiencia como la seguridad en las operaciones de negociación.

Por lo general, seguimos una rutina que consiste en iniciar sesión en el portal de nuestra cuenta de corredor para realizar diversas transacciones y operaciones. Aunque este es el enfoque tradicional, existe una potente función llamada API (Application Programming Interface) que nos permite hacer mucho más y optimizar nuestro enfoque. Para algunos de ustedes, este término puede resultarles familiar. Sin embargo, para los demás, lo desglosaré en secciones fáciles de entender para asegurarme de que todos estén en sintonía:

  1. ¿Qué es una API?
  2. Uso de las API
  3. Acceso a las API
  4. Documentación de la API

Exploremos estos aspectos en detalle:

1. ¿Qué es una API?

Una API (Application Programming Interface) permite interacciones externas con un sistema de software. En este contexto, nos brinda la posibilidad de realizar operaciones en nuestras cuentas de corredores directamente en el servidor, sin necesidad de iniciar sesión manualmente.

Curiosamente, las API existen desde la década de 1940, pero cobraron impulso en la década de 1970 y se generalizaron después del año 2000.

2. Uso de las API

Las API facilitan la comunicación entre aplicaciones de software y sistemas. Estas son algunas de las áreas de aplicación más comunes:

  • Servidores web
  • Aplicaciones móviles

Las API permiten un acceso fluido a los datos desde diversas fuentes, tales como:

  • Plataformas de redes sociales
  • Almacenamiento en la nube
  • Pasarelas de pago
  • Estaciones meteorológicas
  • Acciones y mercados financieros

API

API como puente entre ordenadores externos y servidores en la nube.


3. Acceso a las API

Para utilizar una API, normalmente es necesario:

  • Obtenga una clave API del proveedor.
  • Estudia la documentación de la API para integrarla correctamente.
  • Incluya la clave API como parámetro en sus solicitudes de autenticación y autorización.
La clave API es fundamental para identificar su aplicación o usuario, al tiempo que garantiza un acceso seguro.

    4. Documentación de la API

    Cada API viene con su propia guía de usuario y especificaciones. Aquí se explica cómo interactuar con la API de manera eficaz. Por ejemplo, la documentación de la API de Telegram difiere significativamente de la de la API de un bróker, como la API de Deriv Broker.

    Al comprender y utilizar las API, podemos optimizar nuestras operaciones, automatizar procesos y mejorar la eficiencia en la gestión de nuestras cuentas de corredores. Profundicemos en cada aspecto y exploremos su aplicación práctica.

    A continuación se incluye una lista de las secciones principales de nuestro debate:


    Resumen de este debate

    En este artículo, exploraremos el uso de MQL5 con la API de un bróker para facilitar operaciones fluidas en la gestión de fondos. Nuestro objetivo es descubrir el enorme potencial que ofrecen los asesores expertos en MQL5. Dado que MQL5 por sí solo no puede interactuar directamente con servidores web, utilizaremos bibliotecas de lenguajes externos, como Python o Node.js, dependiendo de las capacidades de la API del bróker. Para este debate, nos centraremos en Deriv.com como nuestro bróker elegido.

    Ventajas de este enfoque

    • Transferencias automáticas de fondos: El EA automatizará la transferencia de las ganancias obtenidas en la cuenta de operaciones a una cuenta segura.
    • Recarga de la cuenta de operaciones: Recargará el saldo de la cuenta de operaciones si el capital cae por debajo de un umbral predefinido.
    • Operaciones continuas: Al alojar el EA en un servidor virtual, el sistema puede funcionar las 24 horas del día, los 7 días de la semana, con capacidades de gestión de fondos prácticamente ilimitadas.

    Retos y consideraciones

    • Riesgo de agotamiento de los fondos: Los fondos reservados pueden agotarse si el EA continúa recargándose sin generar beneficios constantes.
    • Necesidad de una gestión sólida de los fondos: Debe implementarse un sistema sofisticado de gestión de fondos para detener las operaciones si se superan determinados umbrales de pérdidas o capital.

    En las siguientes secciones, profundizaremos en las características de la API del bróker Deriv, desarrollaremos código Python para permitir una interacción fluida con la API e integraremos esta solución con un EA MQL5 diseñado para una gestión de fondos eficiente y fiable, todo ello presentado en instrucciones sencillas y paso a paso para facilitar su comprensión y aplicación.

    API básica de flujo bidireccional del EA al bróker

    Flujo bidireccional entre MQL5 y el bróker


    API de Deriv (bróker)

    Deriv.com es un popular bróker que admite MetaTrader 5 y ofrece acceso a la API para operaciones automatizadas. Puede encontrar información detallada en la documentación de la API de Deriv. Para empezar, sigue los pasos que se indican en su sitio web para registrarte y obtener acceso a la API.

    Con fines educativos, deberá crear una aplicación en el Panel de control de la API de Deriv. Durante este proceso, seleccione una cuenta de demostración y genere un token de API con el nivel de acceso adecuado. Para esta presentación, recomiendo elegir el nivel de acceso Trade API, ya que permite realizar operaciones como recargar los fondos de su cuenta demo. Evita seleccionar el nivel de acceso de administrador a menos que estés seguro de que puedes gestionarlo de forma segura, ya que este nivel otorga control total sobre tu cuenta. Mantenga siempre su token API privado y seguro para evitar el acceso no autorizado.

    Una vez creado el token API, los siguientes pasos consisten en configurar un cliente WebSocket de Python e integrarlo con MQL5 para desarrollar un programa capaz de gestionar las operaciones de la cuenta.

    Operaciones clave

    Las funciones principales que pretendemos alcanzar con nuestro programa son:

    • Depositar fondos desde su cuenta Deriv a su cuenta Deriv en MetaTrader 5.
    • Interconexión con la API de Deriv para una gestión fluida de los fondos.

    La documentación de la API de Deriv proporciona instrucciones detalladas para realizar estas operaciones en la sección API de MetaTrader 5. Como parte de este proceso, obtendrá dos valores críticos:

    • ID de la aplicación: Identifica su aplicación en la plataforma Deriv.
    • Token API: Concede acceso para realizar las acciones especificadas.

    Con estos valores, podemos proceder a desarrollar el cliente WebSocket de Python e integrarlo con MQL5 para implementar nuestro sistema de gestión de fondos.

    Usted y la seguridad de su API

    La seguridad es un tema fundamental que no se puede pasar por alto. Del mismo modo que proteges tu teléfono contra el acceso no autorizado, es igualmente esencial proteger tus claves API de otras personas. Del mismo modo que proteges tu teléfono contra el acceso no autorizado, es igualmente esencial proteger tus claves API de otras personas. Podrían explotar su cuenta y llevar a cabo acciones no autorizadas sin su conocimiento.

    En el contexto de Deriv, la plataforma proporciona niveles de acceso a tokens API, lo que le permite elegir los permisos que se otorgan al token. Se recomienda encarecidamente utilizar las funciones de acceso de demostración y evitar seleccionar el acceso de administrador a menos que sea absolutamente necesario. El nivel de acceso de administrador otorga control total sobre tu cuenta, lo que supone un riesgo significativo si cae en manos equivocadas.

    Este consejo no se limita a Deriv, sino que se aplica a los tokens API de cualquier servicio. Trata siempre las claves API como contraseñas: mantén su confidencialidad, guárdalas en un lugar seguro y nunca las compartas con personas en las que no confíes. Al hacerlo, minimizas el riesgo de acceso no autorizado y garantizas que tu cuenta permanezca protegida.


    Biblioteca Python para comunicaciones API Web Socket

    En primer lugar, necesitamos tener Python instalado en nuestro ordenador para poder continuar con este proyecto. A continuación, debemos instalar la biblioteca Python WebSocket para habilitar la comunicación web con la API del bróker. La API Deriv utiliza WebSocket para la comunicación de alta velocidad, por lo que es esencial configurar nuestros ordenadores en consecuencia. A continuación se muestra el comando para instalar la biblioteca Python en Windows utilizando el símbolo del sistema.

    pip install websocket-client

     Para instalar la biblioteca, abra el Símbolo del sistema en Windows e introduzca el comando anterior. Una vez completada la instalación, estará listo para comenzar a ejecutar y probar. Sin embargo, antes de continuar, daremos los siguientes pasos para desarrollar el script de Python que gestionará la comunicación entre MetaTrader 5 y la API del bróker (la API de Deriv como ejemplo).


    Script Python para establecer la comunicación entre MetaTrader 5 y la API del bróker

    He esbozado los pasos para desarrollar el script de Python. Profundicemos en la construcción de este programa antes de continuar con la creación de nuestro EA Fund Manager. Abre tu editor de código (se recomienda Notepad++) y crea un nuevo archivo. Siga nuestros pasos mientras desarrollamos el script, al que llamaremos deriv_api_handler.py. Asegúrate de anotar la ubicación de tu script, ya que lo necesitarás más adelante en el código del EA.

    1. Configuración inicial y configuración

     En primer lugar, queremos establecer las importaciones necesarias, configurar los ajustes de conexión y configurar las rutas de los archivos donde se producirá la comunicación con MQL5. Comenzamos importando las bibliotecas esenciales. Sabemos que la biblioteca json es crucial para analizar y generar datos JSON, que es el formato que se utiliza para enviar mensajes a través de WebSocket y procesar comandos. Se ha elegido la biblioteca websocket para gestionar la conexión WebSocket con la API de Deriv, y time ayuda al programa a introducir pausas en el script cuando es necesario. Por último, os le permite interactuar con el sistema de archivos, como comprobar los archivos de comandos.

    import json
    import websocket
    import time
    import os
    
    # Configuration
    API_URL = "wss://ws.binaryws.com/websockets/v3?app_id= Your app ID"   #Replace with your App ID created in Deriv API dashboard
    API_TOKEN = "Your API token"   #Replace with your actual token
    
    # File paths (Replace YourComputerName with the actual name of your computer)
    MQL5_TO_PYTHON = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt"
    PYTHON_TO_MQL5 = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/python_to_mql5.txt"
    
    • A continuación, definimos nuestra URL y token de API, ya que son las claves necesarias para autorizar nuestra conexión WebSocket con el servidor Deriv. Esta URL apunta al punto final WebSocket, y el token de la API es lo que prueba nuestra identidad ante el servidor.
    • Por último, especificamos las rutas de los archivos para interactuar con MQL5. Estos archivos actuarán como puente entre nuestro script Python y MQL5, permitiendo el intercambio de comandos y respuestas. Debemos tener cuidado al elegir rutas que sepamos que son accesibles para ambos sistemas (MQL5 y Python).

    2. Conexión WebSocket

    En esta sección del código de nuestro script establecemos una conexión segura con la API WebSocket de Deriv y autorizamos al script para que realice solicitudes.

    def connect_to_deriv():
        """Connects to Deriv's WebSocket API."""
        try:
            ws.connect(API_URL)
            ws.send(json.dumps({"authorize": API_TOKEN}))
            response = json.loads(ws.recv())
            print(f"Authorization Response: {response}")
            if response.get("error"):
                print("Authorization failed:", response["error"]["message"])
                return False
            return True
        except Exception as e:
            print(f"Error during authorization: {e}")
            return False
    • Definimos una función para gestionar la conexión WebSocket. Primero, intentamos conectarnos a la API utilizando la URL que hemos configurado anteriormente. Iniciamos la conexión con ws.connect(API_URL) y, a continuación, enviamos el mensaje de autorización que contiene nuestro token API. Esto es necesario para autenticar nuestro script con el servidor Deriv.
    • Inmediatamente, el script espera una respuesta del servidor. El servidor devolverá un objeto JSON que confirma si la conexión se ha realizado correctamente. Si contiene un error, significa que el token no era válido o que se produjo otro problema. Este manejo de errores es esencial para garantizar que el script falle correctamente.
    • Nuestra decisión de utilizar bloques try-except garantiza que el script no se bloquee si surge algún problema con la conexión o el intercambio de mensajes. Es una medida de seguridad que proporciona flexibilidad al programa para depurar y gestionar problemas sin interrumpir todo el proceso.

    3. Procesamiento de comandos

    En esta etapa, el programa interpreta los comandos recibidos y realiza las acciones adecuadas en función del tipo de comando. Una vez conectado y autenticado correctamente, el script procesará los comandos de MQL5 enviados en forma de cadena JSON, por lo que estará listo para analizarlos y gestionarlos.
    • En la función process_command , el script intenta primero analizar el comando en un diccionario Python. Esto le permite acceder fácilmente a diferentes campos del comando (como el importe del depósito). A continuación, comprueba si hay claves específicas en el JSON analizado (como «mt5_deposit»), que indican qué tipo de acción solicita MQL5 que se realice.
    • Si el comando solicita un depósito («mt5_deposit»), se llama a una función independiente mt5_deposit para gestionarlo. Este enfoque modular hace que el script sea flexible y fácil de mantener, ya que podemos añadir fácilmente otros tipos de comandos en el futuro.

    • Si el comando es desconocido o está mal formateado, devuelve un mensaje de error, lo que ayuda al sistema MQL5 a comprender qué ha fallado.

    def process_command(command):
        """Processes a command from MQL5."""
        try:
            command_data = json.loads(command)  # Parse the JSON command
            if "mt5_deposit" in command_data:
                return mt5_deposit(
                    command_data["amount"],
                    command_data["from_binary"],
                    command_data["to_mt5"]
                )
            else:
                return {"error": "Unknown command"}
        except json.JSONDecodeError:
            return {"error": "Invalid command format"}
        except Exception as e:
            return {"error": f"Unexpected error: {e}"}
    

    4. Operación de depósito

    Esta sección realiza la operación de depósito solicitada por MQL5, enviando los datos necesarios a la API de Deriv. Creamos una función específica (mt5_deposit) para realizar el depósito. Esto mantiene nuestro código organizado y aísla la lógica para gestionar los depósitos, lo que facilita su mantenimiento o ampliación.
    • Dentro de esta función, se crea un mensaje JSON que indica a Deriv que ejecute un depósito. Este mensaje incluye todos los detalles necesarios, como el importe, la cuenta de origen y la cuenta MT5 de destino. Enviar los datos correctos en el formato adecuado es fundamental para garantizar que la transacción se procese correctamente.
    • Después de enviar la solicitud de depósito, espera una respuesta del servidor. Una vez recibida la respuesta, se analiza en JSON y se devuelve. Esto permite al sistema MQL5 saber si la operación se ha realizado correctamente o ha fallado.
    • Las excepciones se gestionan en caso de que se produzca un error en la comunicación o en la operación de depósito, lo que garantiza que los errores se detecten y se notifiquen a MQL5.
    def mt5_deposit(amount, from_binary, to_mt5):
        """Performs a deposit operation to the MT5 account."""
        try:
            ws.send(json.dumps({
                "mt5_deposit": 1,
                "amount": amount,
                "from_binary": from_binary,
                "to_mt5": to_mt5
            }))
            response = ws.recv()
            return json.loads(response)
        except Exception as e:
            return {"error": f"Error during deposit operation: {e}"}
    

    5. Lectura de comandos desde MQL5

    Esta es una sección del código en la que se comprueba un comando de MQL5 y se procesa si está disponible, asegurándose de que el mismo comando no se procese repetidamente. Para leer los comandos de MQL5, comprueba si existe el archivo mql5_to_python.txt. Aquí es donde MQL5 escribe los comandos que deben procesarse. Si el archivo existe, lee su contenido. Eliminando los espacios en blanco innecesarios y comprobando la presencia de una marca de orden de bytes (BOM), para garantizar que los datos se manejan correctamente, independientemente de las inconsistencias de formato.
    • Una vez leído el comando, se imprime con fines de depuración, para poder verificar que el contenido se ha recuperado según lo esperado. Después de leer el comando, elimina el archivo, asegurándose de que el mismo comando no se vuelva a procesar en el futuro.
    • Si el archivo no existe, devuelve None, lo que indica que no hay ningún comando que procesar. Esto ayuda a evitar comprobaciones innecesarias si no hay ningún comando disponible.
    def read_command():
        """Reads a command from the MQL5 file and deletes the file after reading."""
        print(f"Checking for command file at: {MQL5_TO_PYTHON}")
        if os.path.exists(MQL5_TO_PYTHON):
            print(f"Command file found: {MQL5_TO_PYTHON}")
            with open(MQL5_TO_PYTHON, "r", encoding="utf-8") as file:
                command = file.read().strip()
            print(f"Raw Command read: {repr(command)}")
            
            # Strip potential BOM and whitespace
            if command.startswith("\ufeff"):
                command = command[1:]
            
            print(f"Processed Command: {repr(command)}")
            os.remove(MQL5_TO_PYTHON)  # Remove file after reading
            return command
        print(f"Command file not found at: {MQL5_TO_PYTHON}")
        return None
    


    6. Escribir respuestas a MQL5

    Esta parte envía la respuesta a MQL5 para que pueda realizar acciones adicionales basadas en nuestro resultado. Después de procesar un comando y obtener una respuesta, se envía de vuelta a MQL5. Esto se hace escribiendo la respuesta en el archivo python_to_mql5.txt, donde MQL5 puede leerla.
    • Para garantizar que la respuesta tenga el formato adecuado, el diccionario Python se convierte en una cadena JSON utilizando json.dumps(). Escribir esta cadena JSON en el archivo garantiza que el sistema MQL5 pueda interpretar correctamente la respuesta.
    • Este paso es fundamental porque completa el ciclo de comunicación entre Python y MQL5, lo que permite a MQL5 saber si la operación se ha realizado correctamente o ha fallado y tomar las medidas adecuadas.
    def write_response(response):
        """Writes a response to the MQL5 file."""
        with open(PYTHON_TO_MQL5, "w", encoding="utf-8") as file:
            file.write(json.dumps(response))
    


    7. Bucle principal

    Creamos un bucle continuo para leer y procesar comandos de MQL5, lo que garantiza que el sistema funcione en tiempo real. El bucle principal es el corazón del script, donde todo se une. Después de conectarse y autorizarse correctamente con la API de Deriv, entra en un bucle en el que comprueba continuamente si hay nuevos comandos. La función read_command se invoca para comprobar si hay un nuevo comando que procesar.
    • Si se encuentra un comando, se procesa y el resultado se escribe de nuevo en MQL5. Si el archivo de comando no existe o se produce un error, se gestiona correctamente mostrando un mensaje de error y saliendo del bucle.
    • El bucle es crucial para mantener un sistema receptivo. Nos aseguramos de que el script no se ejecute indefinidamente ni falle sin proporcionar información útil. Al implementar bloques try-except, protegemos el bucle de errores inesperados y nos aseguramos de que no se bloquee el script, sino que se cierre correctamente.
    if __name__ == "__main__":
        if not connect_to_deriv():
            print("Failed to authorize. Exiting.")
            exit(1)
    
        print("Connected and authorized. Waiting for commands...")
        while True:
            try:
                command = read_command()
                if command:
                    print(f"Processing command: {command}")
                    response = process_command(command)
                    print(f"Response: {response}")
                    write_response(response)
                    print("Response written. Exiting loop.")
                    break  # Exit the loop after processing one command
                else:
                    print("No command file found. Exiting.")
                    break  # Exit the loop if the command file is not found
            except Exception as e:
                print(f"Error in main loop: {e}")
                break  # Exit the loop on unexpected error
    


    Funds Manager EA

    En esta etapa, continuaremos explorando el proceso de desarrollo del EA del gestor de fondos (Fund Manager EA). Diseñaremos este EA para supervisar el saldo de la cuenta y proponer una recarga si el saldo cae por debajo de un umbral específico. La operación de recarga se activará mediante el script de Python que hemos desarrollado anteriormente. Aunque este EA no abarca todas las funcionalidades de un asesor experto de trading completo, nos centraremos en el segmento de código específico que integra las interacciones de la API del bróker. El objetivo del debate es demostrar el potencial de integración de las API de los brókeres con cualquier EA.

    Resumen del plan de desarrollo:

    Uno de los componentes clave de este EA es la implementación de la función ShellExecuteW, que se utilizará para ejecutar el script deriv_api_handler.py desde el código EA. El EA supervisará el saldo de la cuenta corriente y, si detecta que el saldo está por debajo del umbral definido, emitirá una orden para iniciar un depósito.

    Normalmente, estas operaciones se gestionan en la función OnTimer() para permitir comprobaciones periódicas y automatización durante un periodo prolongado. Sin embargo, con fines de prueba y retroalimentación inmediata, he optado por colocar estas operaciones dentro de la función OnInit(). Este enfoque garantiza que la API se pruebe inmediatamente después del lanzamiento del EA. A largo plazo, la función OnTimer() será más adecuada para supervisar continuamente el saldo de la cuenta y solicitar una recarga cuando sea necesario. 

    1. Metainformación e importación de bibliotecas

    Esta sección configura los metadatos para el Asesor Experto (EA) e importa una biblioteca del sistema para ejecutar comandos externos. La función ShellExecuteW de la biblioteca shell32.dll se utiliza para ejecutar aplicaciones externas, como un script de Python, lo que permite la comunicación con sistemas externos o API.

    //+------------------------------------------------------------------+
    //|                                             Fund Manager EA.mq5  |
    //|                                Copyright 2024, Clemence Benjamin |
    //|             https://www.mql5.com/en/users/billionaire2024/seller |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2024, Clemence Benjamin"
    #property link      "https://www.mql5.com/en/users/billionaire2024/seller"
    #property version   "1.01"
    #property description "Deposit and Withdraw funds between broker and trading account within the EA"
    
    #import "shell32.dll"
    int ShellExecuteW(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
    #import
    


    2. Parámetros de entrada para la personalización

    Aquí, los parámetros de entrada personalizables permiten a los usuarios adaptar el EA a sus necesidades específicas sin modificar el código central. Los parámetros incluyen el umbral de saldo, el importe de recarga, los ID de cuenta para transferencias de fondos y las rutas para el script y el ejecutable de Python.

    input double balance_threshold = 100000.0;  // Threshold balance for top-up
    input double top_up_amount = 100000.0;      // Amount to top-up if balance is below threshold
    input string from_binary = "CR0000000";     // Binary account ID to withdraw funds from. Replace zero with real one
    input string to_mt5 = "MTRReplace";     // MT5 account ID to deposit funds into. Replace with your MT5 acc from Deriv Broker
    input string python_script_path = "C:\\Users\\YourComputerName\\PathTo\\deriv_api_handler.py"; // Python script path
    input string python_exe = "python";         // Python executable command (ensure Python is in PATH)
    


    3. Inicialización: Verificación del saldo y depósito

    La función OnInit es el punto de entrada del EA. Primero recupera el saldo actual de la cuenta utilizando AccountInfoDouble(ACCOUNT_BALANCE). Si el saldo está por debajo del umbral especificado, el EA procede a iniciar un depósito.

    int OnInit()
      {
       double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);
       Print("Current Account Balance: ", current_balance);
    
       if(current_balance < balance_threshold)
         {
          Print("Balance is below the threshold. Attempting a deposit...");
    


    4. Escribir un comando de depósito en un archivo

    El EA crea un archivo para comunicarse con el script de Python. El archivo contiene una cadena con formato JSON que especifica el comando de depósito, incluyendo el importe, el origen y los datos de la cuenta de destino. Este archivo actúa como interfaz entre MQL5 y el sistema Python.

    string command_file = "mql5_to_python.txt";
    string command_path = TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\\Files\\" + command_file;
    int handle = FileOpen(command_file, FILE_WRITE | FILE_COMMON | FILE_TXT | FILE_ANSI);
    
    string deposit_command = StringFormat("{\"mt5_deposit\": 1, \"amount\": %.2f, \"from_binary\": \"%s\", \"req_id\": 1, \"to_mt5\": \"%s\"}", top_up_amount, from_binary, to_mt5);
    FileWrite(handle, deposit_command);
    FileClose(handle);
    Print("Deposit command written to file: ", command_path);
    


    5. Ejecutar el script Python

    Mediante la función ShellExecuteW, el EA ejecuta el script Python especificado en los parámetros de entrada. El script procesa la solicitud de depósito e interactúa con sistemas externos.

    int result = ShellExecuteW(0, "open", python_exe, python_script_path, NULL, 1);
    if(result <= 32)
      {
       Print("Failed to launch Python script. Error code: ", result);
       return(INIT_FAILED);
      }
    else
      {
       Print("Python script launched successfully.");
      }
    


    6. Comprobación de la respuesta de Python

    Después de ejecutar el script de Python, el EA comprueba si hay un archivo de respuesta. Si el archivo existe, el EA lo lee para confirmar si el depósito se ha realizado correctamente. El archivo de respuesta debe contener un mensaje de éxito para que el EA proceda en consecuencia.

    string response_file = "python_to_mql5.txt";
    if(FileIsExist(response_file, FILE_COMMON))
      {
       handle = FileOpen(response_file, FILE_READ | FILE_COMMON | FILE_TXT | FILE_ANSI);
       string response = FileReadString(handle);
       FileClose(handle);
       Print("Response from Python: ", response);
    
       if(StringFind(response, "\"status\":\"success\"") >= 0)
         {
          Print("Deposit was successful.");
         }
       else
         {
          Print("Deposit failed. Response: ", response);
         }
      }
    else
      {
       Print("Response file not found. Ensure the Python script is running and processing the command.");
      }
    


    7. Finalización de la inicialización

    Si el saldo supera el umbral, el EA omite el proceso de depósito. La inicialización finaliza con éxito y el EA entra en su fase operativa.

    else
      {
       Print("Balance is above the threshold. No deposit attempt needed.");
      }
    
    return(INIT_SUCCEEDED);
    


    8. Desinicialización 

    The OnDeinit function logs when the EA is removed or deinitialized. 

    void OnDeinit(const int reason)
      {
       Print("Expert deinitialized.");
      }
    
    


    Pruebas de demostración y resultados

    Aquí analizaremos dos pruebas:

    1. Probando el script Python (deriv_api_handler.py) en el símbolo del sistema.
    2. Prueba del EA de gestor de fondos (Fund Manager EA).

    Entremos en detalles:

    1. Probando el script Python (deriv_api_handler.py)

    Trabajé en mi script de Python utilizando una herramienta gratuita llamada Notepad++. A continuación se muestra un clip animado que muestra cómo iniciar el símbolo del sistema directamente desde el editor. Este enfoque es esencial, ya que garantiza que el símbolo del sistema se dirija a la carpeta que contiene el script, lo que facilita su ejecución directamente desde su ubicación.

    Iniciar cmd desde Notepad++

    Iniciar cmd desde Notepad++

    Una vez abierta la ventana del símbolo del sistema, puede escribir el comando para ejecutar el script. El objetivo es verificar que la autorización y el acceso a la API de Deriv se hayan realizado correctamente.

    Introduzca el siguiente comando en el símbolo del sistema y pulse Intro:

    python deriv_api_handler.py

    Respuesta con credenciales API predeterminadas:

    Con el script predeterminado que carece de credenciales válidas, recibirá la respuesta que se muestra a continuación. Es esencial que proporcione sus credenciales de trabajo (token API e ID de aplicación) para establecer la autorización y funcionalidad adecuadas.

    Error during authorization: Handshake status 401 Unauthorized -+-+- {'date': 'Thu, 15 Jan 2025 08:43:53 GMT', 'content-type': 
    'application/json;charset=UTF-8', 'content-length': '24', 'connection': 'keep-alive', 'content-language': 'en', 'upgrade': 
    'websocket', 'sec-websocket-accept': 'yfwlFELh2d3KczdgV3OT8Nolp0Q=', 'cf-cache-status': 'DYNAMIC', 'server': 'cloudflare', 'cf-ray': 
    '902cd20129b638df-HRE', 'alt-svc': 'h3=":443"; ma=86400'} -+-+- b'{"error":"InvalidAppID"}'
    Failed to authorize. Exiting.

    Respuesta con credenciales correctas:

    En el fragmento de resultado que aparece a continuación, utilizando las credenciales correctas, establecemos correctamente una conexión y autorización. A continuación, el programa comprueba si existe el archivo mql5_to_python.txt en la carpeta de archivos comunes, como se muestra a continuación. Este archivo de texto contiene la información de comandos que el script procesa y reenvía a través de una conexión WebSocket. La API envía una respuesta y, en este ejemplo, se utilizan datos de cuenta aleatorios para proteger mis credenciales. Deberá utilizar sus datos correctos para obtener resultados positivos.

    Nuestro objetivo se cumplió con éxito, ya que recibimos una respuesta y se generó un archivo python_to_mql5.txt con la respuesta de la API, que luego se comunica de vuelta a MetaTrader 5.
    Connected and authorized. Waiting for commands...
    Checking for command file at: C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt
    Command file found: C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt
    Raw Command read: '{"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}'
    Processed Command: '{"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}'
    Processing command: {"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}
    Response: {'echo_req': {'amount': 100000, 'from_binary': 'CR4000128', 'mt5_deposit': 1, 'to_mt5': 'MTR130002534'}, 'error': {'code': 'PermissionDenied', 
    'message': 'Permission denied, requires payments scope(s).'}, 'msg_type': 'mt5_deposit'}
    Response written. Exiting loop.


    2. Prueba del EA de gestor de fondos (Fund Manager EA).

    Para probar nuestro Asesor Experto (EA), lo lanzamos en MetaTrader 5. Como se mencionó anteriormente, lo diseñamos para intentar realizar un depósito durante la inicialización. Dado que estamos trabajando con una cuenta demo que tiene un capital de 10.000, he establecido el umbral de saldo en 100.000 para activar un intento de depósito si el saldo actual es inferior a este valor. A continuación se muestra una captura de pantalla animada que muestra el lanzamiento, junto con los ajustes de entrada que permiten personalizar estos valores.

    Lanzamiento del EA gestor de fondos (Fund Manager EA)

    Lanzamiento del EA gestor de fondos (Fund Manager EA)

    En la pestaña Expertos de la ventana Caja de herramientas de MetaTrader 5, puede ver el registro de todas las operaciones realizadas por el EA. A continuación, encontrará los resultados del registro.

    2025.01.14 11:49:56.012 Fund Manager EA1 (EURUSD,M1)    Current Account Balance: 10000.22
    2025.01.14 11:49:56.012 Fund Manager EA1 (EURUSD,M1)    Balance is below the threshold. Attempting a deposit...
    2025.01.14 11:49:56.013 Fund Manager EA1 (EURUSD,M1)    Deposit command written to file: C:\Users\BTA24\AppData\Roaming\MetaQuotes\Terminal\Common\Files\mql5_to_python.txt
    2025.01.14 11:49:56.097 Fund Manager EA1 (EURUSD,M1)    Python script launched successfully.
    2025.01.14 11:50:01.132 Fund Manager EA1 (EURUSD,M1)    Response file path: C:\Users\BTA24\AppData\Roaming\MetaQuotes\Terminal\Common\Files\python_to_mql5.txt
    2025.01.14 11:50:01.133 Fund Manager EA1 (EURUSD,M1)    Response from Python: {"echo_req": {"amount": 100000, "from_binary": "CR4000128", "mt5_deposit": 1,
     "to_mt5": "MTR130002534"}, "error": {"code": "PermissionDenied", "message": "Permission denied, requires payments scope(s)."}, "msg_type": "mt5_deposit"}
    2025.01.14 11:50:01.133 Fund Manager EA1 (EURUSD,M1)    Deposit failed. Response: {"echo_req": {"amount": 100000, "from_binary": "CR4000128", "mt5_deposit": 1, 
    "to_mt5": "MTR130002534"}, "error": {"code": "PermissionDenied", "message": "Permission denied, requires payments scope(s)."}, "msg_type": "mt5_deposit"}
    

    El resultado anterior demuestra una interacción satisfactoria entre el EA gestor de fondos (Fund Manager EA), el script Python y la API de Deriv. En privado, he realizado con éxito operaciones de recarga utilizando esta configuración. En este ejemplo, sin embargo, nos encontramos con un error de «Permiso denegado» porque se utilizaron credenciales aleatorias para proteger mis credenciales API personales.

    Conclusión

    Hemos integrado con éxito MQL5 y Python para interactuar con un servidor de bróker externo a través de su API. Esta solución aborda el problema de quedarse sin fondos durante el trading automatizado, especialmente en cuentas alojadas en un VPS. El EA repone automáticamente la cuenta cuando su saldo cae por debajo de un umbral establecido. Aunque nos hemos centrado en la API de Deriv, se pueden lograr integraciones similares con otras API de brókers, muchas de las cuales ofrecen funciones avanzadas y distintos niveles de acceso. A efectos de demostración, probamos el EA utilizando una cuenta vacía y verificamos su funcionalidad a través de las respuestas de la API. Puede ampliar este sistema para incluir funciones de retirada y otras características avanzadas.

    La aplicación de la API de Deriv es sencilla y facilita principalmente la gestión de los tokens API necesarios para la comunicación EA. Puedes explorar más a fondo la API para descubrir nuevas posibilidades. Se adjuntan el script de Python y los archivos del EA Fund Manager para su prueba y ampliación. No dude en compartir sus opiniones o hacer preguntas en la sección de comentarios a continuación para mantener vivo el debate.

    Traducción del inglés realizada por MetaQuotes Ltd.
    Artículo original: https://www.mql5.com/en/articles/16012

    Archivos adjuntos |
    Fernando Carreiro
    Fernando Carreiro | 17 ene 2025 en 13:54
    @Stanislav Korotky #: AFAIK, MT5 permite ejecutar scripts Python directamente desde el Navigator, justo en los gráficos normales.

    Es cierto que se puede lanzar un script Python desde el terminal a través del Navigator, pero no es cierto que operen "sobre el gráfico". Se ejecutan externamente y pueden utilizar la API de Python, pero no interactuarán directamente de ninguna manera con el gráfico ni con ningún otro componente visual del terminal MetaTrader 5.

    Clemence Benjamin
    Clemence Benjamin | 19 ene 2025 en 14:21
    Fernando Carreiro #:

    Es cierto que se puede lanzar un script Python desde el terminal a través del Navegador, pero no es cierto que operen "sobre el gráfico". Se ejecutan externamente y pueden utilizar la API de Python, pero no interactuarán directamente de ninguna manera con el gráfico ni con ningún otro componente visual del terminal MetaTrader 5.

    Estoy de acuerdo con usted, estimado señor.

    Fernando Carreiro
    Fernando Carreiro | 19 ene 2025 en 14:34
    @Clemence Benjamin #: Estoy de acuerdo con usted, estimado señor.

    Sin embargo, ¿por qué necesita la interfaz "Python" para manejar la API del broker?

    En el caso de que un corredor no ofrece MetaTrader 5, entonces usted puede utilizar MQL5 para comunicarse directamente con la API del corredor. No hay necesidad de la interfaz de Python en absoluto.

    MQL5 incluso tiene sockets de red, y puede implementar fácilmente web sockets. También puede implementar fácilmente la llamada a la API REST. Y si es necesario, también puede hacer uso de llamadas DLL.

    Por no hablar de que MQL5 es mucho más rápido que Python. En esencia, no hay necesidad de utilizar Python para acceder a la API.

    Clemence Benjamin
    Clemence Benjamin | 19 ene 2025 en 19:58
    @Fernando Carreiro #:

    Sin embargo, ¿por qué necesitas la interfaz "Python" para manejar la API del broker?

    En el caso de que un corredor no ofrece MetaTrader 5, entonces usted puede utilizar MQL5 para comunicarse directamente con la API del corredor. No hay necesidad de la interfaz de Python en absoluto.

    MQL5 incluso tiene sockets de red, y puede implementar fácilmente web sockets. También puede implementar fácilmente la llamada a la API REST. Y si es necesario, también puede hacer uso de llamadas DLL.

    Por no hablar de que MQL5 es mucho más rápido que Python. En esencia, no hay necesidad de utilizar Python para acceder a la API.

    Sí, señor. Aprecio que destaques enfoques directos y eficaces, ¡gracias por ello!

    Aunque yo no destacaría necesariamente Python como una necesidad acuciante, creo que todo se reduce a explorar cómo pueden colaborar estos lenguajes en la materia.

    En algún momento, la necesidad de integración podría surgir de forma natural

    Herman Makmur
    Herman Makmur | 6 ago 2025 en 07:06

    Hola a todos,

    Necesito hacer trabsacciones RISE/FALL en DERIV a través de MQL5 con conexión websocket....

    He encontrado este https://www.mql5.com/es/articles/10275 para recuperar los ticks del histórico pero NO para hacer el CALL/PUT (colocar orden)

    ¿Alguien me puede ayudar en esto?


    Gracias y saludos,


    Herman

    Cómo publicar código en CodeBase: Guía práctica Cómo publicar código en CodeBase: Guía práctica
    En este artículo, analizaremos el proceso de publicación de diferentes tipos de programas para el terminal en la biblioteca de código fuente MQL5 usando ejemplos reales.
    Fibonacci en Forex (Parte I): Comprobamos la relación tiempo-precio Fibonacci en Forex (Parte I): Comprobamos la relación tiempo-precio
    ¿Cómo se desplaza el mercado por una relación basada en los números de Fibonacci? Esta secuencia, en la que cada número sucesivo es igual a la suma de los dos anteriores (1, 1, 2, 3, 3, 5, 8, 13, 21...), no solo describe el crecimiento de la población de conejos. Hoy vamos a analizar la hipótesis de Pitágoras de que todo en el mundo obedece a ciertas relaciones de números....
    Algoritmo de búsqueda circular — Circle Search Algorithm (CSA) Algoritmo de búsqueda circular — Circle Search Algorithm (CSA)
    Este trabajo presenta un nuevo algoritmo metaheurístico de optimización CSA (Circle Search Algorithm) basado en las propiedades geométricas del círculo. El algoritmo usa el principio de desplazamiento de puntos por tangentes para encontrar la solución óptima combinando fases de exploración global y explotación local.
    Analizamos el código binario de los precios en bolsa (Parte II): Convirtiendo a BIP39 y escribiendo un modelo GPT Analizamos el código binario de los precios en bolsa (Parte II): Convirtiendo a BIP39 y escribiendo un modelo GPT
    Seguimos intentando descifrar los movimientos de los precios.... ¿Qué tal un análisis lingüístico del "diccionario de mercado" que obtendríamos convirtiendo el código binario de precios en BIP39? En el presente artículo, nos adentramos en un enfoque innovador del análisis de los datos bursátiles y exploramos cómo pueden aplicarse las modernas técnicas de procesamiento del lenguaje natural al lenguaje del mercado.