MqlCIByLeo/Src/Py/launcher.py

112 lines
3.3 KiB
Python
Raw Permalink Normal View History

2026-03-10 07:54:52 -05:00
# Copyright 2026, Niquel Mendoza.
# https://www.mql5.com/es/users/nique_372
# launcher.py
2026-03-09 23:18:02 +00:00
import subprocess
2026-03-10 06:44:01 -05:00
import argparse
2026-03-10 07:54:52 -05:00
import os
import datetime
import time
import sys
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
# Construccion del archivo config
def BuildConfig(args) -> str:
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
#print(f"Expert recibido: {args.expert}")
#print(f"Expert Params recibido: {args.expert_params}")
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
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))
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
# lo abrimos
path = args.config_out
with open(path, "w", encoding='utf-16', newline='\r\n') as f:
f.write("\n".join(lines))
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
return path
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
# 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()
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
config_path = BuildConfig(args)
2026-03-09 23:18:02 +00:00
2026-03-09 19:47:18 -05:00
2026-03-10 07:54:52 -05:00
#--- 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"
2026-03-10 00:21:37 +00:00
2026-03-10 07:54:52 -05:00
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()
2026-03-09 23:18:02 +00:00
2026-03-10 07:54:52 -05:00
# 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
2026-03-09 23:18:02 +00:00
)
2026-03-10 07:54:52 -05:00
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)