3cd12b67aa
Neuer Abschnitt "Training" im Dashboard mit zwei Bedienelementen und den zugehörigen Endpunkten /control/train/history, /control/train/live und /control/training. Historisches Nachtraining - Kerzenanzahl je Symbol wählbar (500 bis 50 000), Fortschritt und Ergebnis werden im Dashboard angezeigt. - Läuft mit derselben Logik wie ein Backtest, aber ohne zu handeln, und speichert das Modell anschließend. - Handelsdurchlauf und Nachtraining teilen sich einen Mutex, damit sie nicht gleichzeitig auf Modell und Portfolio zugreifen. Die rechenintensive Schleife läuft in einem Worker-Thread, damit der Status-Server antwortbereit bleibt. - Ein zweiter Start wird abgelehnt, solange einer eingereiht ist oder läuft. Kontinuierliches Lernen - Schalter für das Online-Lernen im laufenden Betrieb. Ausgeschaltet handelt der Bot weiter, verändert das Modell aber nicht mehr. Label-Trennung - Vorgemerkte Labels tragen jetzt ein Tag. Ein Nachtraining darf die offenen Labels des Live-Betriebs weder auflösen noch verwerfen; ohne die Trennung würden sie gegen historische Kurse ausgewertet und das Modell mit falschen Ergebnissen gefüttert. - score() liest die Gewichte unter dem Lock, damit ein parallel laufendes Training keinen halb aktualisierten Vektor sichtbar macht. Absicherung - server.control_token (TRADEMIND_CONTROL_TOKEN) schützt alle Steuerbefehle über den Header X-TradeMind-Token; lesende Endpunkte bleiben offen. Ohne Token warnt der Bot beim Start, wenn der Port nicht nur lokal erreichbar ist. - server.enable_control: false entfernt die Routen vollständig. 153 Tests (25 neue), ruff sauber. Im gebauten Container geprüft: 202/409 beim Anstoßen, 401 ohne und mit falschem Token, +1099 Beobachtungen in 4,3 s bei weiterlaufendem Handels-Loop ohne Fehler.
52 lines
1.1 KiB
TOML
52 lines
1.1 KiB
TOML
[build-system]
|
||
requires = ["setuptools>=68", "wheel"]
|
||
build-backend = "setuptools.build_meta"
|
||
|
||
[project]
|
||
name = "trademind"
|
||
version = "0.1.0"
|
||
description = "Selbstlernender Krypto-Trading-Bot mit Paper-Trading, Backtest und Live-Modus"
|
||
readme = "README.md"
|
||
requires-python = ">=3.11"
|
||
license = { text = "MIT" }
|
||
|
||
dependencies = [
|
||
"ccxt>=4.3.0",
|
||
"numpy>=1.26",
|
||
"PyYAML>=6.0",
|
||
"pydantic>=2.6",
|
||
"aiohttp>=3.9",
|
||
]
|
||
|
||
[project.optional-dependencies]
|
||
dev = [
|
||
"pytest>=8.0",
|
||
"pytest-asyncio>=0.23",
|
||
"pytest-aiohttp>=1.0",
|
||
"ruff>=0.4",
|
||
]
|
||
|
||
[project.scripts]
|
||
trademind = "trademind.cli:main"
|
||
|
||
[tool.setuptools.packages.find]
|
||
where = ["src"]
|
||
|
||
[tool.pytest.ini_options]
|
||
testpaths = ["tests"]
|
||
asyncio_mode = "auto"
|
||
filterwarnings = ["ignore::DeprecationWarning"]
|
||
|
||
[tool.ruff]
|
||
line-length = 110
|
||
target-version = "py311"
|
||
|
||
[tool.ruff.lint]
|
||
select = ["E", "F", "I", "UP", "B"]
|
||
# UP042: str+Enum ist bewusst gewählt – es serialisiert ohne Sonderbehandlung nach JSON.
|
||
ignore = ["B008", "UP042"]
|
||
|
||
[tool.ruff.lint.per-file-ignores]
|
||
# server.py enthält das eingebettete Dashboard (HTML/CSS/JS) als String.
|
||
"src/trademind/server.py" = ["E501"]
|