# Copyright 2026, Niquel Mendoza. # https://www.mql5.com/es/users/nique_372 # launcher.py import subprocess import argparse import os import datetime import time import sys # Construccion del archivo config def BuildConfig(args) -> str: #print(f"Expert recibido: {args.expert}") #print(f"Expert Params recibido: {args.expert_params}") lines = [ "[Common]", f"Login={args.login}", f"Server={args.server}", f"Password={args.password}", "KeepPrivate=1", "NewsEnable=0", "", "[Experts]", "AllowLiveTrading=0", "AllowDllImport=1", "Enabled=1", "Account=0", "Profile=0", "", "[StartUp]", f"Expert={args.expert}", f"Symbol={args.symbol}", f"Period={args.period}", f"ExpertParameters={args.expert_params}", f"Template=default", ] # print de las lineas print("\n".join(lines)) # lo abrimos path = args.config_out with open(path, "w", encoding='utf-16', newline='\r\n') as f: f.write("\n".join(lines)) return path # Ejeuccion principal if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--terminal_exe", type=str, required=True) # path al terminal64.exe parser.add_argument("--config_out", type=str, required=True) # donde guardar el .ini parser.add_argument("--login", type=str, required=True) parser.add_argument("--server", type=str, required=True) parser.add_argument("--password", type=str, required=True) parser.add_argument("--expert", type=str, required=True) parser.add_argument("--symbol", type=str, default="EURUSD") parser.add_argument("--period", type=str, default="M1") parser.add_argument("--expert_params", type=str, required=True) args = parser.parse_args() config_path = BuildConfig(args) #--- Eliminar log de hoy si existe today = datetime.datetime.now().strftime("%Y%m%d") log_path : str = f"/home/leoxd/.mt5/drive_c/Program Files/MetaTrader 5/MQL5/Logs/{today}.log" if os.path.exists(log_path): os.remove(log_path) print(f"Log eliminado: {log_path}") else: print(f"Log no existe, nada que eliminar: {log_path}") #--- Correr mt5 env = os.environ.copy() # env config env["WINEPREFIX"] = "/home/leoxd/.mt5" env["DISPLAY"] = ":10.0" # Asegurado con .0 env["WINEDEBUG"] = "-all,err+all" # Solo muestra errores críticos env["WINE_DRIVER"] = "x11" env["QT_QPA_PLATFORM"] = "xcb" # IMPORTANTE: Deshabilita el modo de red protegido de MetaTrader env["MT5_TERMINAL_DISABLE_UI_LOCK"] = "1" # corremos result = subprocess.run(["winepath", "-w", config_path], capture_output=True, text=True, env=env) win_config_path = result.stdout.strip() print(f"Lanzando MT5: {args.terminal_exe}") # Lanzar proceso sin esperar a que termine process = subprocess.Popen( ["wine", args.terminal_exe, "/portable", f"/config:{win_config_path}"], env=env, stdout=sys.stdout, stderr=sys.stderr, text=True ) print(f"MT5 lanzado exitosamente con PID: {process.pid}") print("Launcher finalizado. El monitoreo queda a cargo del reviser.") # No usamos .wait(), salimos inmediatamente para liberar el proceso sys.exit(0)