112 lignes
Pas d'EOL
3,3 Kio
Python
112 lignes
Pas d'EOL
3,3 Kio
Python
# 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)
|
|
|
|
|