9f10f9000e
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.
156 lines
8.4 KiB
YAML
156 lines
8.4 KiB
YAML
# ─────────────────────────────────────────────────────────────────────────────
|
||
# TradeMind – Beispielkonfiguration
|
||
#
|
||
# Kopieren nach config/config.yaml und anpassen:
|
||
# cp config/config.example.yaml config/config.yaml
|
||
#
|
||
# ${VAR} wird durch die Umgebungsvariable VAR ersetzt (leer = nicht gesetzt)
|
||
# ${VAR:-wert} nutzt "wert" als Rückfallwert
|
||
# TRADEMIND__A__B überschreibt zusätzlich den Schlüssel a.b (z. B. TRADEMIND__RISK__MAX_OPEN_POSITIONS=5)
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
# paper = simulierte Ausführung auf echten Live-Kursen; das Modell trainiert mit ← Standard
|
||
# backtest = historische Daten im Schnelldurchlauf
|
||
# live = echte Orders (erfordert live_confirmation + API-Schlüssel)
|
||
mode: ${TRADEMIND_MODE:-paper}
|
||
|
||
log_level: ${TRADEMIND_LOG_LEVEL:-INFO}
|
||
|
||
# Muss für mode: live wörtlich auf I_UNDERSTAND_THE_RISK stehen. Sicherheitsnetz gegen
|
||
# versehentlichen Echtgeldhandel.
|
||
live_confirmation: ${TRADEMIND_LIVE_CONFIRMATION}
|
||
|
||
# ─────────────────────────────── Börsenanbindung ────────────────────────────
|
||
# id: jede von ccxt unterstützte Börse. Liste anzeigen mit: trademind exchanges
|
||
# binance · binanceus · kraken · krakenfutures · coinbase · bybit · okx
|
||
# kucoin · bitget · gate · mexc · bitstamp · bitfinex · huobi · cryptocom · …
|
||
exchange:
|
||
id: ${TRADEMIND_EXCHANGE:-binance}
|
||
api_key: ${TRADEMIND_API_KEY}
|
||
api_secret: ${TRADEMIND_API_SECRET}
|
||
# Passphrase – nötig bei OKX, KuCoin, Coinbase Advanced, Bitget
|
||
password: ${TRADEMIND_API_PASSWORD}
|
||
# true = Testnet/Sandbox der Börse (soweit unterstützt). Für die ersten Live-Tests dringend empfohlen.
|
||
sandbox: ${TRADEMIND_SANDBOX:-true}
|
||
enable_rate_limit: true
|
||
timeout_ms: 20000
|
||
options:
|
||
defaultType: spot # spot | swap | future – je nach Börse
|
||
|
||
# ──────────────────────────────── Marktauswahl ──────────────────────────────
|
||
market:
|
||
# Alle Symbole müssen dieselbe Quote-Währung haben (hier USDT).
|
||
symbols:
|
||
- BTC/USDT
|
||
- ETH/USDT
|
||
timeframe: 5m # 1m 3m 5m 15m 30m 1h 2h 4h 6h 8h 12h 1d 3d 1w
|
||
history_bars: 500 # Kerzen pro Abfrage (Indikatoren brauchen ≥ 140)
|
||
poll_interval_seconds: 20 # wie oft nach einer neuen Kerze gesehen wird
|
||
|
||
# ───────────────────── Simulation (Modus paper und backtest) ────────────────
|
||
paper:
|
||
starting_balance: 10000
|
||
quote_currency: USDT
|
||
fee_rate: 0.001 # 0,1 % Taker-Gebühr pro Seite
|
||
slippage_bps: 5 # 5 Basispunkte Ausführungsnachteil
|
||
max_volume_participation: 0.1 # max. 10 % des Kerzenvolumens pro Order
|
||
|
||
# ────────────────────────── Automatisierter Handel ──────────────────────────
|
||
trading:
|
||
# true = der Bot handelt ab dem Start automatisch (bisheriges Verhalten)
|
||
# false = er sammelt Daten und lernt, eröffnet aber erst nach Freigabe im Dashboard
|
||
# Positionen. Für den ersten Live-Einsatz die sicherere Wahl.
|
||
autostart: true
|
||
# Nur mode: live – Start des Handels über das Dashboard verlangt die ausdrückliche
|
||
# Bestätigung START_LIVE_TRADING. Pausieren geht immer ohne Bestätigung.
|
||
require_confirmation_for_live: true
|
||
|
||
# ──────────────────────────────── Risikoregeln ──────────────────────────────
|
||
risk:
|
||
max_position_pct: 0.20 # je Position, gemessen an der Equity
|
||
max_total_exposure_pct: 0.60 # Summe aller Positionen
|
||
max_open_positions: 3
|
||
stop_loss_atr_mult: 2.0 # Stop = Einstieg − 2 × ATR (0 = kein Stop)
|
||
take_profit_atr_mult: 3.0 # Ziel = Einstieg + 3 × ATR (0 = kein Ziel)
|
||
trailing_stop_atr_mult: 0.0 # > 0 aktiviert den nachziehenden Stop
|
||
max_holding_bars: 0 # 0 = unbegrenzt
|
||
max_daily_loss_pct: 0.05 # Notbremse bis zum nächsten UTC-Tag
|
||
max_drawdown_pct: 0.25 # Notbremse bis zum Neustart (schließt Positionen)
|
||
min_notional: 10 # kleinste sinnvolle Ordergröße in Quote-Währung
|
||
cooldown_bars_after_exit: 3 # Pause pro Symbol nach einem Ausstieg
|
||
|
||
# ───────────────────────────────── Strategie ───────────────────────────────
|
||
strategy:
|
||
# adaptive = Regelwerk erzeugt Signale, das Lernmodell filtert sie
|
||
# rules = nur das Regelwerk, kein Lernen
|
||
name: adaptive
|
||
|
||
rules:
|
||
fast_ema: 12
|
||
slow_ema: 26
|
||
rsi_period: 14
|
||
rsi_oversold: 35
|
||
rsi_overbought: 70
|
||
atr_period: 14
|
||
trend_filter_period: 100 # 0 = Trendfilter aus
|
||
min_holding_bars: 3 # Signalausstiege erst danach; Stop/Ziel gelten immer
|
||
|
||
learner:
|
||
enabled: true
|
||
model_path: /data/models/adaptive.npz
|
||
entry_threshold: 0.55 # ab welcher Gewinnwahrscheinlichkeit gehandelt wird
|
||
exploration_rate: 0.05 # Anteil bewusst gegen das Modell gehandelter Signale
|
||
learning_rate: 0.02
|
||
l2: 0.0001
|
||
replay_size: 5000
|
||
batch_size: 64
|
||
train_every_n_samples: 5
|
||
warmup_samples: 200 # bis dahin entscheidet allein das Regelwerk
|
||
label_horizon_bars: 12 # Bewertungsfenster für ein Signal
|
||
label_target_bps: 30 # 30 bps = 0,3 % Kursziel gilt als Treffer
|
||
trade_sample_weight: 3.0 # echte Trades zählen dreifach gegenüber Shadow-Labels
|
||
# Einstiegssignale sind selten. Zusätzliche Stichproben des Marktzustands verkürzen die
|
||
# Aufwärmphase von Wochen auf Tage (0 = aus).
|
||
background_sample_every_n_bars: 10
|
||
background_sample_weight: 0.5
|
||
# Beim Start ein noch untrainiertes Modell aus der Kurshistorie vorlernen, damit der Bot
|
||
# nach Sekunden einsatzbereit ist statt nach Tagen (0 = aus).
|
||
bootstrap_bars: 3000
|
||
freeze_in_live: false # true = im Live-Modus nicht weiterlernen
|
||
save_every_n_updates: 50
|
||
|
||
# ───────────────────────────────── Persistenz ───────────────────────────────
|
||
storage:
|
||
database_path: /data/trademind.sqlite3
|
||
# Im Dashboard geänderte Werte. Liegt im beschreibbaren Datenvolume, weil diese Datei
|
||
# hier üblicherweise read-only eingehängt ist. Löschen = alle Änderungen zurücksetzen.
|
||
overrides_path: /data/config.overrides.yaml
|
||
|
||
# ─────────────────────────── Status-Server / Monitoring ─────────────────────
|
||
server:
|
||
enabled: true
|
||
host: 0.0.0.0
|
||
port: 8080
|
||
enable_metrics: true # /metrics im Prometheus-Textformat
|
||
|
||
# Steuerbefehle im Dashboard: historisches Nachtraining anstoßen und das
|
||
# kontinuierliche Lernen ein-/ausschalten. Auf false setzen für rein lesenden Betrieb.
|
||
enable_control: true
|
||
# Schützt ALLE Steuerbefehle (Header X-TradeMind-Token). Lesende Endpunkte bleiben offen.
|
||
# Dringend empfohlen, sobald der Port nicht nur lokal erreichbar ist.
|
||
control_token: ${TRADEMIND_CONTROL_TOKEN}
|
||
|
||
# ──────────────────────────────── Benachrichtigungen ────────────────────────
|
||
notifications:
|
||
# Slack- oder Discord-Webhook (leer lassen = aus)
|
||
webhook_url: ${TRADEMIND_WEBHOOK_URL}
|
||
notify_on_trade: true
|
||
notify_on_risk_halt: true
|
||
|
||
# ───────────────────────────── Backtest-Voreinstellungen ────────────────────
|
||
backtest:
|
||
bars: 5000
|
||
start: # z. B. 2024-01-01T00:00:00Z – überschreibt bars
|
||
end:
|
||
csv_dir: # OHLCV aus CSV statt von der Börse (Spalten: timestamp,open,high,low,close,volume)
|