d081edfbd3
Neuer Abschnitt "Automatisierter Handel" im Dashboard mit Zustandsanzeige und Start/Pause-Knopf, dazu GET und POST /control/trading. Funktioniert in beiden Modi, simuliert wie echt. Pausiert unterbindet ausschließlich neue Einstiege - Marktdaten, Signalauswertung, Labeling und Training laufen weiter, damit der Datenstrom ins Modell nie abreißt. Auf identischen Daten: aktiv 99 Beobachtungen bei 9 Trades, pausiert 90 Beobachtungen bei 0 Trades - der Unterschied sind genau die Trade-Labels, die ohne Handel nicht entstehen. - Offene Positionen bleiben unter Stop- und Ziel-Überwachung. Ein pausierter Bot lässt niemanden ungeschützt im Markt stehen. - Neu: trading.autostart (Standard true, bisheriges Verhalten) und trading.require_confirmation_for_live. Nebenbei behoben - Bei aktiver Notbremse (Tagesverlust, Drawdown) wurden bisher gar keine Signale mehr ausgewertet. Der Bot hörte damit ausgerechnet in der interessantesten Phase auf zu lernen. Jetzt läuft die Auswertung durch, nur der Kauf unterbleibt. - describe_config meldete "Steuerung möglich", während sie eine Zeile später abgeschaltet wurde. Übersicht und Schutzlogik teilen sich jetzt dieselbe Prüffunktion (control_effective / control_is_unsafe). Absicherung für Echtgeld - Starten im Live-Modus verlangt die Bestätigung START_LIVE_TRADING im Body (HTTP 428 ohne sie); das Dashboard fragt sie per Dialog ab. Pausieren geht immer ohne Bestätigung - anhalten muss schnell gehen. - Live-Modus mit offenem Port und ohne control_token wird nicht bedient: Die Steuerung wird beim Start abgeschaltet, der Bot läuft normal weiter. Sonst könnte jeder im Netz echten Handel starten. Bewusst nicht enthalten: ein Umschalter zwischen Paper und Live zur Laufzeit. Der bräuchte einen neuen Broker, andere Zugangsdaten und eine neue Kapitalbasis - und würde bedeuten, dass ein Web-Klick aus einer Simulation echten Handel macht. 174 Tests (21 neue), ruff sauber. Im gebauten Container geprüft: 401 ohne Token, 200 mit, idempotentes Pausieren, 400 bei kaputtem Payload, und im Live-Start mit ungültigen Dummy-Schlüsseln greift die Abschaltung der Steuerung.
153 lines
8.2 KiB
YAML
153 lines
8.2 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
|
||
|
||
# ─────────────────────────── 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)
|