Konfiguration im Dashboard änderbar machen

Neuer Abschnitt "Konfiguration" im Dashboard, aus dem pydantic-Schema erzeugt:
76 Felder in 13 Bereichen mit Kurzbeschreibung, typgerechtem Eingabefeld und den
Grenzen aus dem Modell. 70 davon sind änderbar, 45 greifen sofort, 31 sind als
neustartpflichtig markiert. Dazu GET und POST /control/config sowie
/control/config/reset.

Overlay statt Direktschreiben
- config.yaml ist im Container read-only eingehängt. Änderungen landen deshalb in
  /data/config.overrides.yaml und werden beim Start über die Basiskonfiguration
  gelegt. Rangfolge: YAML, dann ${ENV}, dann TRADEMIND__-Variablen, dann Overlay.
- Gespeichert wird nur, was vom Basiswert abweicht. Ein auf den Ausgangswert
  zurückgestelltes Feld verschwindet wieder aus dem Overlay, damit spätere
  Änderungen an config.yaml dort erneut durchschlagen.
- Beschädigte oder ungültige Overlays werden protokolliert und ignoriert, statt
  den Start zu blockieren.

Übernehmen zur Laufzeit
- apply_config hängt die Laufzeitobjekte auf die neuen Teilkonfigurationen um
  (Risiko, Strategie, Regelwerk, Lernmodell, Paper-Broker, Notifier, Log-Level).
- Was nur beim Aufbau ausgewertet wird - Börsenclient, Symbole, Timeframe,
  Startkapital, Datenbank, Socket - meldet der Store als neustartpflichtig.

Nebenbei behoben: Der Handels-Loop las Abfrageintervall und Historienlänge nur
einmal vor der Schleife. Eine Änderung an poll_interval_seconds hätte nie
gegriffen; beide werden jetzt je Durchlauf frisch gelesen.

Drei Ausnahmen von "komplett", bewusst gesetzt
- exchange.api_key/api_secret/password/uid werden maskiert angezeigt und nicht
  entgegengenommen. Sonst könnte jeder mit Zugriff auf den Port die
  Börsenschlüssel auslesen oder austauschen.
- mode lässt sich zwischen paper und backtest umstellen, nicht auf live.
- live_confirmation ist nicht schreibbar.
Zusammen verhindern sie, dass sich der Bot über das Netz schrittweise auf
Echtgeldhandel umstellen lässt.

222 Tests (36 neue), ruff sauber. Darunter Prüfungen, dass Geheimnisse in keiner
Antwort auftauchen und dass Tippfehler in RESTART_REQUIRED oder NON_WRITABLE
auffallen. Im Browser durchgeklickt: Änderung sofort wirksam, neustartpflichtige
Felder korrekt gemeldet und nach Neustart aktiv, Zurücksetzen einzeln und
komplett, alle Schutzregeln mit HTTP 400 samt lesbarer Begründung.
This commit is contained in:
Tobias Zimmermann
2026-08-23 13:25:33 +02:00
parent 4551339632
commit 9f10f9000e
9 changed files with 1133 additions and 4 deletions
+52
View File
@@ -386,6 +386,55 @@ die Shadow-Labels aus dem Marktgeschehen laufen unverändert weiter.
> könnte jeder im Netz echten Handel starten. Mit Token oder auf `127.0.0.1` steht sie
> wieder zur Verfügung.
### Konfiguration
Der Abschnitt **Konfiguration** zeigt alle 76 Felder, nach Bereichen gruppiert, mit
Kurzbeschreibung und den Grenzen aus dem Schema. 70 davon sind direkt änderbar.
Weil `config.yaml` im Container read-only eingehängt ist, landen Änderungen als Overlay in
`/data/config.overrides.yaml` und werden beim Start über die Basiskonfiguration gelegt.
Die Rangfolge, von schwach nach stark:
1. `config.yaml`
2. `${ENV}`-Platzhalter darin
3. `TRADEMIND__ABSCHNITT__SCHLUESSEL`-Umgebungsvariablen
4. Overlay aus dem Dashboard
Gespeichert wird nur, was vom Basiswert abweicht — stellst du ein Feld auf seinen
Ausgangswert zurück, verschwindet es wieder aus dem Overlay und spätere Änderungen an
`config.yaml` schlagen dort wieder durch. Einzelne Felder oder alles auf einmal lassen sich
über die Knöpfe zurücksetzen; die Overlay-Datei zu löschen hat denselben Effekt.
Jedes Feld ist markiert, wenn es **einen Neustart braucht** (31 Felder — Börsenclient,
Symbole, Timeframe, Datenbank, Socket und alles andere, was nur beim Aufbau ausgewertet
wird). Der Rest greift sofort: Risikoregeln, Strategie-Parameter, Lernmodell, Gebühren und
Slippage der Simulation, Abfrageintervall, Benachrichtigungen, Log-Level.
Ungültige Eingaben werden abgelehnt, bevor irgendetwas übernommen wird — inklusive
feldübergreifender Regeln:
```
HTTP 400 — Ungültige Werte strategy.rules: strategy.rules.fast_ema muss kleiner als slow_ema sein
```
> **Drei Felder sind bewusst ausgenommen** und bleiben der Konfigurationsdatei
> beziehungsweise der Umgebung vorbehalten:
>
> | Feld | Grund |
> |---|---|
> | `exchange.api_key` / `api_secret` / `password` / `uid` | Werden nie ausgeliefert (maskiert als „gesetzt"/„nicht gesetzt") und nicht entgegengenommen. Sonst könnte jeder mit Zugriff auf den Port die Börsenschlüssel auslesen oder austauschen. |
> | `mode: live` | Wechsel zwischen `paper` und `backtest` geht; auf Echtgeld umstellen nicht. |
> | `live_confirmation` | Sonst wäre die Live-Freigabe aus dem Netz setzbar. |
>
> Zusammen verhindert das, dass jemand über das Dashboard schrittweise auf Echtgeldhandel
> umstellt.
Per HTTP:
```bash
curl -X POST localhost:8080/control/config -H 'Content-Type: application/json' -H "X-TradeMind-Token: $TOKEN" -d '{"risk.max_open_positions": 5, "strategy.learner.entry_threshold": 0.6}'
```
### Training
Im Abschnitt **Training** stehen zwei Bedienelemente:
@@ -414,6 +463,9 @@ curl -X POST localhost:8080/control/train/history -H 'Content-Type: application/
| Endpunkt | Methode | Wirkung |
|--------------------------------|---------|--------------------------------------------|
| `/control/config` | GET | Alle Felder mit Wert, Typ, Grenzen und Markierungen |
| `/control/config` | POST | `{"risk.max_open_positions": 5}` — ändern und sichern |
| `/control/config/reset` | POST | `{}` oder `{"paths": [...]}` — Overlay verwerfen |
| `/control/trading` | GET | Zustand des automatisierten Handels |
| `/control/trading` | POST | `{"enabled": true}` — Handel starten/pausieren (live zusätzlich `"confirm"`) |
| `/control/training` | GET | Zustand des letzten/laufenden Trainings |