- .claude/agents/executer.md - .claude/agents/planer.md - .claude/agents/pruefer.md - .claude/agents/recherche.md - .claude/skills/plan-executer-pruefung/SKILL.md - .claude/workflows/executer-welle.js - .claude/workflows/plankritik.js - .claude/workflows/pruefung.js - .claude/workflows/welle-mit-pruefung.js - .gitignore - .vault-tools/regelwerk-check/ENTWURF.md - .vault-tools/regelwerk-check/regelwerk_check.py - … und 20 weitere Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py. Co-Authored-By: Claude Opus 5 <[email protected]>
58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
"""Prüft für eine Liste von Symbolen den letzten Tagesschluss gegen eine Kursgrenze. Nur lesend.
|
|
|
|
Koordinator-Werkzeug, nicht Teil des Repos. Anlass: Paket M (zehn Aktien, 2026-09-25) — eine Order
|
|
darf höchstens max_notional_je_order (10.000 USD) haben, ein Bein ist basis_menge (10) Stück, also
|
|
muss jeder Kurs unter 1.000 USD liegen. Einziger Netzzugriff: ein lesender Abruf der Tageskerzen bei
|
|
Alpaca (IEX). Ausgegeben werden Symbol, Datum der Kerze, Schlusskurs (öffentlicher Börsenkurs, kein
|
|
Depotwert) und ob er unter der Grenze liegt; nie ein Schlüssel.
|
|
Aufruf (WSL, aus dem Projektordner, TRADING_GEHEIMNISSE gesetzt):
|
|
python kurs_unter_grenze.py 1000 AAPL MSFT NVDA ...
|
|
"""
|
|
|
|
import sys
|
|
import tomllib
|
|
from pathlib import Path
|
|
|
|
import requests
|
|
|
|
sys.path.insert(0, str(Path.cwd()))
|
|
|
|
from trading import geheimnisse # noqa: E402
|
|
|
|
DATEN_URL = "https://data.alpaca.markets"
|
|
|
|
|
|
def main() -> int:
|
|
grenze = float(sys.argv[1])
|
|
symbole = sys.argv[2:]
|
|
werte = tomllib.loads(geheimnisse.pfad().read_text(encoding="utf-8"))["alpaca"]
|
|
sitzung = requests.Session()
|
|
sitzung.trust_env = False
|
|
antwort = sitzung.get(
|
|
f"{DATEN_URL}/v2/stocks/bars/latest",
|
|
params={"symbols": ",".join(symbole), "feed": "iex"},
|
|
headers={"APCA-API-KEY-ID": werte["key_id"], "APCA-API-SECRET-KEY": werte["secret_key"]},
|
|
timeout=20,
|
|
)
|
|
print("HTTP", antwort.status_code)
|
|
if antwort.status_code != 200:
|
|
print(antwort.text[:300])
|
|
return 1
|
|
bars = antwort.json().get("bars", {})
|
|
fehler = 0
|
|
for symbol in symbole:
|
|
bar = bars.get(symbol)
|
|
if not bar:
|
|
print(f"{symbol:6} keine Kerze")
|
|
fehler += 1
|
|
continue
|
|
schluss = float(bar["c"])
|
|
ok = schluss < grenze
|
|
fehler += 0 if ok else 1
|
|
print(f"{symbol:6} {bar['t'][:16]} {schluss:9.2f} {'unter' if ok else 'UEBER'} {grenze:.0f}")
|
|
return 0 if fehler == 0 else 2
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|