================================================================================ LIVE_TRADING_ENABLED — Reality-Check Bericht ================================================================================ Datum: 2026-05-09 Kontext: G10-4.0 Stop-Rule Schnell-Check Status: read-only Audit, keine Mutation, keine Secrets ausgegeben Auslöser: Fund "LIVE_TRADING_ENABLED=true" in .env während G10-4.0 Audit ================================================================================ -------------------------------------------------------------------------------- 1. DEFINITION / PARSING -------------------------------------------------------------------------------- Aspekt | Befund ------------------------------------+--------------------------------------------------- Definition | trading/config/settings.py:35 — | LIVE_TRADING_ENABLED: bool = | os.getenv('LIVE_TRADING_ENABLED','false').lower()=='true' Default in Settings | false (Settings-Klassendefault) Ist-Wert (Container, Bot-active .env)| LIVE_TRADING_ENABLED=true Bool-Parsing korrekt | OK — Standard .lower() == 'true', robust gegen Case-Varianten dotenv-Source | trading/config/settings.py:12 | load_dotenv(dotenv_path=Path(__file__).parent.parent/'.env', | override=True) | -> /trading/.env wird gelesen | (Container-volume /home/node/.openclaw/workspace/trading/.env) Host-.env (/projekte/Steve-TradingBot/.env) | enthält ANDERE Keys (ANTHROPIC_API_KEY, GUI_DB_*, | Telegram, WP_*) — NICHT die Bot-Trading-Flags. | Bot liest NICHT aus dieser Datei. Verwandte Flags | BINANCE_TESTNET (bool, default true), | PAPER_TRADING (bool, default true), | BINANCE_TESTNET_URL (const) -------------------------------------------------------------------------------- 2. READ-SITES (production code, ohne tests/docs) -------------------------------------------------------------------------------- # | Datei:Zeile | Kontext | Was wird gegated? | Order? | Mainnet? | G10? --+---------------------------------------+----------------------------------+-----------------------------------------------------+--------+----------+------ 1 | main.py:1116-1123 | Bot-Start-Gate | Bot exit(1) wenn false. Pflicht-Flag für jeden | nein | nein | optional | | | Start, sonst stoppt Bot vor Trader-Init. | | | 2 | main.py:360 | Testnet-Observation-Threshold-Cap| Score-Threshold-Floor capping (nur Decision-Threshold,| nein | nein | nein | | | kein Order-Routing). Aktiv wenn LIVE_TRADING_ENABLED| | | | | | && BINANCE_TESTNET. | | | 3 | main.py:481 | analog #2 (TESTNET-obs) | wie #2 | nein | nein | nein 4 | main.py:1085 | Logger-Anzeige | rein log/UI (Live-Routing ENABLED/DISABLED string) | nein | nein | nein 5 | multi_strategy_runner.py:151-152 | MultiStrategyRunner.can_run() | Multi-Strategy-Execution-Gate. False -> kein | indirekt| nein | nein | | | Multi-Strategy-Exec. Kombiniert mit BINANCE_TESTNET=|(Multi- | | | | | true Pflicht (Z. 149). | Strat) | | 6 | dashboard.py:916, 1101, 1148, 1168 | UI-Status-Display | nur Anzeige | nein | nein | nein 7 | settings.py:35 | Definition | parsing | nein | nein | nein KEINE Read-Site setzt Exchange-Endpoint. KEINE Read-Site routet Orders nach Mainnet. -------------------------------------------------------------------------------- 3. ORDER-ROUTING — die zentrale Sicherheitsfrage -------------------------------------------------------------------------------- Verantwortliche Variable | Was sie genau tut | Beleg -------------------------+----------------------------------------------------+------------------------------------------- BINANCE_TESTNET | EINZIGE Variable, die zwischen Testnet/Mainnet | live_trade.py:58-59: | routet. | self._is_testnet = s.BINANCE_TESTNET | | exchange_id = 'binance_testnet' | | if self._is_testnet else 'binance' | | -> ccxt-Exchange-Auswahl LIVE_TRADING_ENABLED | Bot-Start-Gate + Multi-Strategy-Exec-Gate. | main.py:1116 exit(1); | KEIN Einfluss auf Routing. | multi_strategy_runner.py:151 | | Trader bleibt LiveTrader unabhängig vom Wert. PAPER_TRADING | Aktiviert in main.py legacy-single-strategy- | main.py:1124 from execution.live_trade (--paper) | Branches mit "if settings.PAPER_TRADING:". ABER: | import LiveTrader; paper_trader = LiveTrader() | ruft paper_trader.execute_buy() auf — und | Variablenname Legacy, Klasse ist Live. | paper_trader ist Phase-L tatsächlich eine | Mit BINANCE_TESTNET=true gehen Orders nur | LiveTrader-Instance! | an Testnet-Sandbox. Wird bei LIVE_TRADING_ENABLED=true echter LiveTrader verwendet? Ja — aber Phase L verwendet LiveTrader IMMER, unabhängig vom Wert. Bot startet nur nicht, wenn LIVE_TRADING_ENABLED=false. Kann LIVE_TRADING_ENABLED=true trotz --paper Mainnet-Orders ermöglichen? Nein. Mainnet-Routing wird ausschließlich durch BINANCE_TESTNET=false aktiviert. Mit BINANCE_TESTNET=true (aktuell gesetzt) instanziert LiveTrader.__init__ den ccxt-Exchange als 'binance_testnet' (Sandbox-Endpoint https://testnet.binance.vision). Welche Variable entscheidet zwischen PaperTrader und LiveTrader? KEINE. Phase L hat PaperTrader aus dem aktiven Pfad entfernt; LiveTrader ist immer der Trader. Die PAPER_TRADING/--paper-Logik schaltet zwischen Code-Branches im main-Loop, nicht zwischen Trader-Klassen. Welche Variable entscheidet zwischen Binance Testnet und Mainnet? Ausschließlich BINANCE_TESTNET. (true -> binance_testnet, false -> binance Mainnet) Gibt es einen Pfad, der bei LIVE_TRADING_ENABLED=true BINANCE_TESTNET überschreibt? Nein. Kein einziger Code-Pfad mutiert BINANCE_TESTNET zur Laufzeit. LIVE_TRADING_ENABLED und BINANCE_TESTNET sind unabhängig; werden nur kombiniert ausgewertet (z.B. "if LIVE_TRADING_ENABLED and BINANCE_TESTNET:"), nie gegeneinander. ZUSATZFUND (kein Sicherheits-Risiko): scanner/data_fetcher.py:117 loggt: "Binance Mainnet Modus (anonym — Public OHLCV/Ticker)" Das ist ein READ-ONLY public-data-Pfad ohne API-Keys (Z. 113: "KEINE Keys an Mainnet-Instance") — wird verwendet, weil Testnet-Preise für die Marktanalyse unbrauchbar sind. KEINE Trading-Calls über diese Mainnet-Instance. -------------------------------------------------------------------------------- 4. AKTUELLER RUNTIME-ZUSTAND -------------------------------------------------------------------------------- Aspekt | Wert ------------------------------------+--------------------------------------------------- Bot-cmdline | python3 main.py --paper | (PID 14381, seit 2026-05-09 04:31:26 UTC) LIVE_TRADING_ENABLED (.env) | true BINANCE_TESTNET (.env) | true PAPER_TRADING (.env) | true BOT_ENVIRONMENT (.env) | nicht gesetzt (Worker-only flag, nicht für Bot) BINANCE_API_KEY | vorhanden in .env (non-empty) — Wert NICHT ausgelesen BINANCE_SECRET | vorhanden in .env (non-empty) — Wert NICHT ausgelesen Bot proc-env (/proc/14381/environ) | Flags NICHT gesetzt (Bot lädt sie via python-dotenv | mit override=True in os.environ zur Modul-Init-Zeit; | nicht via Shell-Export) Bot-Logs (Routing-Aussage) | Erwartetes Statement (main.py:1085): | "TESTNET-Connection: USDT-Saldo X | Live-Routing ENABLED" | In jüngsten Logs nur: | "Binance Mainnet Modus (anonym — Public OHLCV/Ticker)" | für data_fetcher (Public-Read, keysless). | KEIN Mainnet-Trade-Statement. Aktive Exchange-Klasse | binance_testnet (per live_trade.py:58-60, weil | BINANCE_TESTNET=true) — Mainnet-Endpoint NICHT aktiv Multi-Strategy aktiv? | per multi_strategy_runner.can_run() Gates: | MULTI_STRATEGY_ENABLED=true | && !MULTI_STRATEGY_DRY_RUN | && BINANCE_TESTNET | && LIVE_TRADING_ENABLED | && trader != None Kein Hinweis auf Mainnet-Order-Pfad in den Logs. Public-Read-Pfad zu Mainnet (data_fetcher) ist erwartet und keysless. -------------------------------------------------------------------------------- 5. BEWERTUNG G10-4 MAINNET-GUARD -------------------------------------------------------------------------------- Ist Settings.LIVE_TRADING_ENABLED als G10-4 Mainnet-Guard geeignet? NEIN. LIVE_TRADING_ENABLED=true ist NORMALER Bot-Run-State (sonst startet der Bot überhaupt nicht). Eine G10-4-Apply-Reject-Logik vom Typ "if Settings.LIVE_TRADING_ENABLED: reject" würde JEDEN Apply blockieren, weil das Flag immer true ist, wenn der Bot läuft. SICHERER MAINNET-GUARD FÜR G10-4 (Defense-in-Depth, alle Layer Pflicht): Layer | Bedingung | Ort ------+------------------------------------------+-------------------------------------------- L1 | Settings.BINANCE_TESTNET == True | Bot-Side, Pre-Apply-Check im Handler L2 | BOT_ENVIRONMENT == "testnet" | Worker-side env, bereits enforced (G10-3b) L3 | command.payload.environment == "testnet" | Handler-side, bereits enforced (G10-3b) L4 | profile.environment == "paper" | PHP-side hard-restrict, bereits enforced (G10-2/3) L5 | Settings.LIVE_TRADING_ENABLED == True | Bot-Side, NICHT als Mainnet-Guard, sondern als (opt.)| | "Bot ist im Run-State"-Sanity-Check. | | Verhindert Apply gegen heruntergefahrenen Bot. Die kritische Mainnet-Reject-Bedingung in G10-4-Handler-Code MUSS sein: if not Settings.BINANCE_TESTNET: raise ValueError( "validation/mainnet_blocked_g10_4_phase_1_disallows_mainnet_apply" ) (positives Test-Pattern: "testnet must be on", nicht "live must be off") -------------------------------------------------------------------------------- 6. RISIKO-KLASSIFIKATION -------------------------------------------------------------------------------- KLASSIFIKATION: B) Verwirrend aber sicher. - LIVE_TRADING_ENABLED=true ist erwarteter Run-State; der Name suggeriert "Mainnet-Live-Trading", die tatsächliche Bedeutung ist "Bot ist nicht im hard-disabled-Modus". - Mainnet-Routing wird AUSSCHLIESSLICH durch BINANCE_TESTNET=false getriggert. Aktuell BINANCE_TESTNET=true -> Mainnet zuverlässig blockiert. - --paper-Flag blockiert Trade-Execution NICHT zuverlässig im Phase-L-Design — es schaltet zwischen Code-Branches, nicht zwischen Trader-Klassen. Kombiniert mit BINANCE_TESTNET=true ist das aber unkritisch (Orders gehen an Sandbox). - Kein Code-Pfad mutiert BINANCE_TESTNET runtime. - Keine Secrets in Logs/Output sichtbar geworden während dieses Audits. G10-4 darf weitergehen, sobald der Mainnet-Guard von LIVE_TRADING_ENABLED=false-Reject auf BINANCE_TESTNET=true-Required umgebaut ist. -------------------------------------------------------------------------------- 7. EMPFEHLUNG -------------------------------------------------------------------------------- Frage | Empfehlung ----------------------------+------------------------------------------------------------- .env ändern? | NEIN. LIVE_TRADING_ENABLED=true ist erforderlich für | Bot-Run; ändert man's auf false, stoppt der Bot. | Kein Action-Item. G10-4 Guard ändern? | JA, ZWINGEND. Ursprünglicher Scope ist falsch; korrekter | Guard ist BINANCE_TESTNET=true-Required (positiv-Test), | kombiniert mit Worker-env, Payload-env und Profile-env | (Defense-in-Depth, 4 Layer). Neues Flag einführen? | NICHT NÖTIG. Die existierenden Flags reichen — sie | bedeuten nur etwas anderes als ihre Namen suggerieren. | Reine Doku-/Code-Schicht. LIVE_TRADING_ENABLED | NEIN, aber als "Bot-Live-State"-Sanity-Check (Layer L5) ignorieren? | verwenden, nicht als Mainnet-Guard. Apply gegen einen | heruntergefahrenen Bot würde Sinn-frei sein. Naming-Cleanup? | OPTIONAL, niedrige Priorität. Phase-L hat | paper_trader = LiveTrader() | und LIVE_TRADING_ENABLED als "Bot-On-Switch" — die Namen | sind irreführend, eine Umbenennung ist eine eigene | Cleanup-Phase, NICHT G10-4-blocking. Falls gewünscht | später als Bug-Quality-Phase einplanen. -------------------------------------------------------------------------------- BOUNDARY-BESTÄTIGUNGEN -------------------------------------------------------------------------------- Check | Stand -------------------------------------+---------------------------------------------------- .env mutiert | nein, mtime 1777991334 unverändert Bot restartet | nein, PID 14381 stable seit 2026-05-09 04:31 UTC Worker gestartet | nein Orders erzeugt | nein G10-Apply ausgeführt | nein Mainnet-Pfad aktiviert | nein, BINANCE_TESTNET=true Push | nein, repo hat kein remote Secrets in Output | KEINE — BINANCE_API_KEY/BINANCE_SECRET nur als | Existenz-Boolean berichtet, nie als Wert runtime_config.json mutiert | nein, nicht existent live_portfolio.json mutiert | hash drift durch laufenden Bot, NICHT durch dieses Audit Stop-Regeln getriggert | nein, alle 4: | - LIVE_TRADING_ENABLED aktiviert kein Mainnet | - BINANCE_TESTNET blockt zuverlässig | - --paper ist verwirrend aber unkritisch in | Kombi mit Testnet | - keine Secrets im Output -------------------------------------------------------------------------------- KURZFASSUNG -------------------------------------------------------------------------------- LIVE_TRADING_ENABLED=true ist der Bot-On-Switch (kein Mainnet-Gate). Mainnet wird ausschließlich durch BINANCE_TESTNET=true blockiert (aktuell so, sicher). G10-4-Scope-Korrektur: Mainnet-Guard auf BINANCE_TESTNET=true-Required umstellen, ein 4-Layer-Defense- in-Depth (Settings + Worker-env + Payload-env + Profile-env) mit LIVE_TRADING_ENABLED=true als optionalem L5-Run-State-Check. ================================================================================ ENDE DES BERICHTS ================================================================================