Initial commit: TradeMind – Krypto-Trading-Bot mit Lernmodus

Per Podman deploybarer Bot, der Käufe und Verkäufe simuliert ausführt und sich
aus den Ergebnissen weiter antrainiert.

Aufbau
- Einheitliche Bar-Verarbeitung für paper, backtest und live; ausgetauscht werden
  nur Datenquelle und Broker.
- Börsenanbindung über ccxt: rund 100 Börsen allein über exchange.id erreichbar.
  Zugangsdaten kommen über ENV-Platzhalter, der Live-Modus ist doppelt abgesichert.
- Paper-Broker mit Gebühren, Slippage, Börsenpräzision und Volumengrenzen.
- Online trainierte logistische Regression bewertet jedes Einstiegssignal. Sie lernt
  aus realen Trade-Ergebnissen, aus Shadow-Labels aller Kandidaten – auch der
  abgelehnten – und aus Hintergrund-Stichproben; beim Kaltstart wird sie aus der
  Kurshistorie vorgelernt.
- Risikomanagement: Positions- und Exposure-Grenzen, ATR-Stops, Cooldown sowie
  Tagesverlust- und Drawdown-Notbremsen.
- SQLite-Persistenz, HTTP-Status mit Prometheus-Metriken und Dashboard, Webhooks.

Deployment
- Containerfile (zweistufig, non-root UID 10001), podman-compose, systemd-Quadlet.
- Modell und Datenbank liegen im Volume /data und überleben Neustarts.

128 Tests, ruff sauber. Verifiziert gegen echte Marktdaten sowie im gebauten
Container inklusive Healthcheck und Zustandswiederherstellung.
This commit is contained in:
Tobias Zimmermann
2026-08-22 08:53:04 +02:00
commit 65ed73977e
40 changed files with 7033 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
# syntax=docker/dockerfile:1
# ─────────────────────────────────────────────────────────────────────────────
# TradeMind Container-Image
#
# podman build --format docker -t trademind:latest -f Containerfile .
#
# --format docker ist nötig, damit die HEALTHCHECK-Anweisung ins Image übernommen wird;
# das OCI-Format kennt sie nicht. podman-compose und die Quadlet-Einheit bringen den
# Healthcheck ohnehin selbst mit, dort ist das Format egal.
# ─────────────────────────────────────────────────────────────────────────────
# ---------- Stufe 1: Abhängigkeiten in ein virtuelles Environment installieren
FROM docker.io/library/python:3.12-slim AS builder
ENV PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PYTHONDONTWRITEBYTECODE=1
WORKDIR /build
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Erst die Metadaten kopieren so bleibt der Dependency-Layer über Codeänderungen hinweg gültig.
COPY pyproject.toml README.md ./
COPY src/trademind/__init__.py ./src/trademind/__init__.py
RUN pip install --upgrade pip setuptools wheel && pip install .
# Jetzt den vollständigen Quellcode und das Paket selbst installieren.
COPY src/ ./src/
RUN pip install --no-deps .
# ---------- Stufe 2: schlankes Laufzeit-Image
FROM docker.io/library/python:3.12-slim AS runtime
LABEL org.opencontainers.image.title="TradeMind" \
org.opencontainers.image.description="Selbstlernender Krypto-Trading-Bot (Paper, Backtest, Live)" \
org.opencontainers.image.source="https://github.com/tlt-turbo/trademind" \
org.opencontainers.image.licenses="MIT"
ENV PATH="/opt/venv/bin:$PATH" \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
TRADEMIND_CONFIG=/config/config.yaml \
TZ=UTC
# Nicht-Root-Benutzer; UID/GID 10001 kollidiert selten mit Host-Benutzern.
RUN groupadd --gid 10001 trademind \
&& useradd --uid 10001 --gid 10001 --create-home --home-dir /home/trademind trademind \
&& mkdir -p /data/models /config \
&& chown -R 10001:10001 /data /config
COPY --from=builder /opt/venv /opt/venv
COPY --chown=10001:10001 config/config.example.yaml /config/config.example.yaml
USER 10001:10001
WORKDIR /home/trademind
# /data hält SQLite-Datenbank und trainiertes Modell als Volume einhängen, sonst
# gehen Lernfortschritt und Historie beim Neustart verloren.
VOLUME ["/data"]
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s --start-period=45s --retries=3 \
CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=4).status==200 else 1)"
ENTRYPOINT ["trademind"]
CMD ["run", "--config", "/config/config.yaml"]