diff --git a/bots/Dockerfile b/bots/Dockerfile index ab5191ad..d9907120 100644 --- a/bots/Dockerfile +++ b/bots/Dockerfile @@ -6,6 +6,8 @@ WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt +# mt5linux 1.1.x nutzt Python-3.12-Syntax und hat eine andere Server-CLI. +# 0.1.9 passt zum gmag11-Server; seine uralten Pins (numpy 1.21 …) daher --no-deps. RUN pip install --no-deps mt5linux==0.1.9 COPY *.py ./ diff --git a/bots/mcp_server.py b/bots/mcp_server.py index ec42773f..79b5e25d 100644 --- a/bots/mcp_server.py +++ b/bots/mcp_server.py @@ -45,6 +45,9 @@ logging.basicConfig( ) log = logging.getLogger("mt5-mcp") +# Sekunden, die auf eine Antwort aus dem Wine-Python gewartet wird +RPYC_TIMEOUT = int(os.getenv("RPYC_TIMEOUT", "120")) + # --------------------------------------------------------------------------- # MT5 Bridge (abstraction over mock / live) # --------------------------------------------------------------------------- @@ -251,6 +254,7 @@ class LiveBridge(MT5Bridge): if self._rpyc_conn is None or self._rpyc_conn.closed: try: self._rpyc_conn = rpyc.classic.connect(self.rpyc_host, self.rpyc_port) + self._rpyc_conn._config['sync_request_timeout'] = RPYC_TIMEOUT self._rpyc_conn.execute("import MetaTrader5 as mt5") self._rpyc_conn.execute("from datetime import datetime, timedelta") self._rpyc_conn.execute("mt5.initialize()") @@ -265,6 +269,9 @@ class LiveBridge(MT5Bridge): try: from mt5linux import MetaTrader5 as MT5 self.mt5 = MT5(host=self.rpyc_host, port=self.rpyc_port) + # initialize() mit Login startet/verbindet das Terminal unter Wine und + # dauert oft >30s (RPyC-Default) -> sonst "result expired" + self.mt5._MetaTrader5__conn._config['sync_request_timeout'] = RPYC_TIMEOUT # Broker-Login aus Umgebungsvariablen (bots.env) – leer = Terminal-Login verwenden kwargs = {} if os.getenv("MT5_LOGIN"): @@ -283,6 +290,7 @@ class LiveBridge(MT5Bridge): self.connected = True return True except ImportError as e: + # Kann auch von der Windows-Seite kommen (z.B. MetaTrader5 vs. numpy 2) log.error(f"ImportError: {e}") return False except Exception as e: @@ -487,7 +495,7 @@ class LiveBridge(MT5Bridge): vol = grouped.count() idx = ohlc_open.index.intersection(ohlc_close.index) - idx = idx.intersection(ohlc_high.index).intersection(ohlc_low.index) + idx = idx.intersection(ohlhigh.index).intersection(ohlc_low.index) idx = idx[-bars:] if len(idx) == 0: @@ -966,7 +974,7 @@ async def mcp_tools(): { "name": "get_orders", "description": "Get pending orders", - "inputSchema": {"type": "object", "properties": {}}, + "inputSchema": {"type": "object", "properties"{}}, }, ] } diff --git a/bots/requirements.txt b/bots/requirements.txt index efb84854..406ea159 100644 --- a/bots/requirements.txt +++ b/bots/requirements.txt @@ -2,8 +2,8 @@ fastapi uvicorn pydantic -# mt5linux wird im Dockerfile separat installiert -rpyc +# mt5linux wird im Dockerfile separat (0.1.9, --no-deps) installiert +rpyc>=6,<7 # muss zur rpyc-Version im MT5-Container passen pandas numpy # Live-Trader