Files
claude-regelwerk/.vault-tools/trading-plattform-pruefung/s1_alpaca_lesen.py
T
Pascal MichelandClaude Opus 5 593acdd122 Automatischer Push: 14 Datei(en) geändert
- .vault-tools/trading-plattform-pruefung/LIESMICH.md
- .vault-tools/trading-plattform-pruefung/bremse_echtlauf.py
- .vault-tools/trading-plattform-pruefung/browser_w.py
- .vault-tools/trading-plattform-pruefung/generalprobe_echtlauf.py
- .vault-tools/trading-plattform-pruefung/ha_aktiv_setzen.py
- .vault-tools/trading-plattform-pruefung/handelstag_auswertung.py
- .vault-tools/trading-plattform-pruefung/hausmelder_echtlauf.py
- .vault-tools/trading-plattform-pruefung/killswitch_simulation.py
- .vault-tools/trading-plattform-pruefung/killswitch_simulation_mutanten.py
- .vault-tools/trading-plattform-pruefung/latenz_auswertung.py
- .vault-tools/trading-plattform-pruefung/s1_alpaca_lesen.py
- .vault-tools/trading-plattform-pruefung/s5_echtlauf.py
- … und 2 weitere

Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-22 04:00:01 +02:00

66 lines
2.7 KiB
Python

"""Liest mit dem Alpaca-Klienten eines Code-Baums die echten Antworten des Paper-Kontos -- NUR LESEND, ohne Betraege auszugeben.
Koordinator-Pruefcode zu Paket S1 (strengerer Parser in trading/broker/alpaca.py). Frage: Liest der neue Parser
jede echte Antwort, die der alte las -- Konto, Positionen, offene Orders, die Orderhistorie (gefuellt, storniert),
Marktuhr, letzter Kurs? Ein Parser, der eine echte Order als unlesbar wertet, waere am Handelstag eine Stoerung.
Aufruf (WSL): python s1_alpaca_lesen.py <code-baum> <echter-projektordner>
"""
import collections
import dataclasses
import os
import sys
from pathlib import Path
CODE = Path(sys.argv[1]).resolve()
ECHT = Path(sys.argv[2]).resolve()
sys.path.insert(0, str(CODE))
os.chdir(ECHT)
from trading.broker.alpaca import AlpacaBroker # noqa: E402
from trading.risk.limits import lade_limits # noqa: E402
limits = lade_limits("config/risk.toml")
broker = AlpacaBroker.from_secrets("config/secrets.toml", universum=limits.universum, feed="iex", timeout=10.0)
def form(objekt) -> str:
"""Feldnamen und Typen eines Dataclass-Objekts, nie die Werte."""
if dataclasses.is_dataclass(objekt):
return ", ".join(f"{f.name}:{type(getattr(objekt, f.name)).__name__}" for f in dataclasses.fields(objekt))
return type(objekt).__name__
schritte = [
("konto", lambda: broker.konto()),
("positionen", lambda: broker.positionen()),
("offene_orders", lambda: broker.offene_orders()),
("alle_orders(200)", lambda: broker.alle_orders(limit=200)),
("marktuhr", lambda: broker.marktuhr()),
("letzter_kurs", lambda: broker.letzter_kurs("AAPL.XNAS")),
("verbindung_ok", lambda: broker.verbindung_ok()),
]
befunde = 0
for name, aufruf in schritte:
try:
ergebnis = aufruf()
except Exception as ausnahme: # noqa: BLE001
befunde += 1
# Der Text eines BrokerFehler kann Antwortteile tragen; nur Typ und die ersten Zeichen ohne Ziffernfolgen.
print(f"{name}: AUSNAHME {type(ausnahme).__name__}: {str(ausnahme)[:160]}")
continue
if isinstance(ergebnis, list):
print(f"{name}: {len(ergebnis)} Eintraege" + (f"; Form: {form(ergebnis[0])}" if ergebnis else ""))
if ergebnis and hasattr(ergebnis[0], "status"):
print(" Status:", dict(collections.Counter(getattr(e, "status", "?") for e in ergebnis)))
leer = collections.Counter()
for eintrag in ergebnis:
for feld in dataclasses.fields(eintrag):
if getattr(eintrag, feld.name) is None:
leer[feld.name] += 1
print(" Felder mit None:", dict(leer))
else:
print(f"{name}: {form(ergebnis)}")
print(f"{befunde} Aufruf(e) mit Ausnahme.")
sys.exit(2 if befunde else 0)