pyflakes eingebunden — zwei echte Fehler in core/trader.py gefunden
Auf die Frage nach einem Lint-Modul: pyflakes installiert und als Stufe A2 in tools/check_nfalle.py eingebunden. py_compile prueft nur die SYNTAX; ein Tippfehler in einem NAMEN ist syntaktisch einwandfrei — und dieses Projekt hat sehr viele breite except-Exception-Bloecke, in denen ein NameError unsichtbar bleibt. Beim ERSTEN Lauf zwei echte Fehler, beide in core/trader.py, beide nutzten log. (den Namen gibt es dort nicht, nur log_trade/log_hist): · _broker_offset_s(): der NameError lief in das except-pass UND nahm die darunter stehende Zuweisung self._boff = int(off) mit -> ein echter Broker-Zeitzonen-Wechsel waere nie uebernommen worden, dauerhaft und lautlos. Ausgerechnet der Zweig, der als Deployment-Drift Fall 4 gebaut wurde (falscher Offset -> Time-Stop-Alter negativ). · modify_sltp(): steht NICHT in einem try -> der Fehler lief bis in /api/sltp. Der Broker hatte SL/TP bereits geaendert, der User bekam trotzdem eine Fehlermeldung, und set_sltp kam nie bis trail.deactivate() — das Trailing blieb an und haette die Handeingabe zurueckgezogen. Seit dem Initial-Commit drin. Beide behoben (log_trade). Zusaetzlich die Annotation 'HistoryLogger | None' ueber if TYPE_CHECKING sauber importiert (String-Annotation, kein Laufzeit-Import, kein Zirkel). Projektweit jetzt 0 undefinierte Namen. Schweregrad-Trennung ist Absicht: nur undefined name / syntax error werden gemeldet, die ~105 kosmetischen Hinweise unterdrueckt. Auch 'redefinition of unused' bleibt draussen — es trifft das legitime Muster hook = None + bedingtes def hook (in zwei Backtests geprueft, beide korrekt). Eine Pruefung mit Dauer-Treffern wird ignoriert, und mit ihr die eine echte. Backtest-Dateien nicht angefasst (Zahlen). Neustart verifiziert, Log sauber. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
394786b312
commit
e69907edbe
+32
-3
@@ -8,6 +8,7 @@ loggt Trades in die HistoryLogger-DB.
|
||||
from __future__ import annotations
|
||||
import threading
|
||||
import time
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import MetaTrader5 as mt5
|
||||
|
||||
@@ -22,6 +23,14 @@ from core.mt5_utils import (
|
||||
)
|
||||
from core.logger import get_logger
|
||||
|
||||
# ⚠ NUR für die Typ-Annotation `'HistoryLogger | None'` (String, wird zur Laufzeit
|
||||
# nie ausgewertet). Unter TYPE_CHECKING importiert = kein Laufzeit-Import und damit
|
||||
# auch kein Zirkel-Risiko. Vorher meldete pyflakes hier zu Recht einen undefinierten
|
||||
# Namen — und eine Prüfung, die dauerhaft einen bekannten Treffer ausgibt, wird
|
||||
# irgendwann ignoriert.
|
||||
if TYPE_CHECKING: # pragma: no cover
|
||||
from core.history import HistoryLogger
|
||||
|
||||
log_trade = get_logger("trade")
|
||||
log_hist = get_logger("hist")
|
||||
|
||||
@@ -673,8 +682,18 @@ class TradeManager:
|
||||
stale = (now + self._boff) - tick.time
|
||||
if stale <= _BROKER_TICK_FRESH_S and -12 * 3600 <= off <= 14 * 3600:
|
||||
if off != self._boff and self._boff_logged != off:
|
||||
log.info(f"Broker-Zeitzone neu erkannt: "
|
||||
f"{self._boff / 3600:+.1f} h → {off / 3600:+.1f} h")
|
||||
# ⚠ war `log.` — diesen Namen gibt es in dieser Datei NICHT
|
||||
# (nur `log_trade`/`log_hist`). Gefunden 2026-08-07 mit
|
||||
# pyflakes. Folge war schwerer als ein fehlender Logeintrag:
|
||||
# der NameError lief in das `except Exception: pass` unten,
|
||||
# und die Zuweisung `self._boff = int(off)` DARUNTER wurde
|
||||
# dabei übersprungen → ein echter Broker-Zeitzonen-Wechsel
|
||||
# wäre nie übernommen worden, dauerhaft und lautlos.
|
||||
# Genau der Fall, für den dieser Zweig 2026-08-01 gebaut
|
||||
# wurde (Deployment-Drift Fall 4).
|
||||
log_trade.info(f"Broker-Zeitzone neu erkannt: "
|
||||
f"{self._boff / 3600:+.1f} h → "
|
||||
f"{off / 3600:+.1f} h")
|
||||
self._boff_logged = off
|
||||
self._boff = int(off)
|
||||
except Exception:
|
||||
@@ -873,7 +892,17 @@ class TradeManager:
|
||||
with self._lock:
|
||||
self.sl = round(new_sl, si.digits)
|
||||
self.tp = round(new_tp, si.digits)
|
||||
log.info(f"Manuelles SLTP: SL={self.sl} · TP={self.tp} (Ticket {pos.ticket})")
|
||||
# ⚠⚠ war `log.` — den Namen gibt es hier nicht (nur `log_trade`/
|
||||
# `log_hist`). Seit dem Initial-Commit drin, gefunden 2026-08-07 mit
|
||||
# pyflakes. Die Stelle steht NICHT in einem `try`, der NameError lief
|
||||
# also bis in `/api/sltp` durch — mit drei Folgen: (1) der Broker hatte
|
||||
# SL/TP bereits geändert, (2) der User bekam trotzdem eine Fehlermeldung,
|
||||
# (3) `set_sltp` kam nie bis `trail.deactivate()`, das Trailing blieb an
|
||||
# und hätte die Handeingabe beim nächsten Tick zurückgezogen — genau das,
|
||||
# was die User-Vorgabe verhindern soll. (Aufgefangen hat es nur die
|
||||
# separate Extern-Erkennung in `trailing._do_modify`, einen Tick später.)
|
||||
log_trade.info(f"Manuelles SLTP: SL={self.sl} · TP={self.tp} "
|
||||
f"(Ticket {pos.ticket})")
|
||||
return None
|
||||
|
||||
def snapshot(self):
|
||||
|
||||
Reference in New Issue
Block a user