Automatischer Push: 32 Datei(en) geändert
- .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]>
This commit is contained in:
1 parent
d7ffc9a5b5
commit
67d674cd0b
32 files changed
+1618
-88
No files matched your search
@@ -0,0 +1,87 @@
|
||||
"""Liest die Antwortformen dreier Alpaca-Endpunkte fuer Paket M (zehn Aktien). Nur lesend, keine Order.
|
||||
|
||||
Koordinator-Werkzeug, nicht Teil des Repos (entstanden 2026-09-24 nachts). Ausgegeben werden Schluessel,
|
||||
Typen, Seitenmarken und die Handelsfelder der Anlagen (tradable, shortable, easy_to_borrow, fractionable,
|
||||
marginable) -- keine Kontodaten, kein Schluessel. Endpunkte:
|
||||
GET /v2/assets/{symbol} (Handels-API, paper-api)
|
||||
GET /v2/stocks/trades/latest?symbols=... (Daten-API, feed=iex)
|
||||
GET /v2/stocks/bars?symbols=...&timeframe=1Min (Daten-API, feed=iex, Seitenverhalten ueber Symbole)
|
||||
Aufruf (WSL, TRADING_GEHEIMNISSE gesetzt): python alpaca_formen_lesen.py JJJJ-MM-TT SYMBOL [SYMBOL ...]
|
||||
"""
|
||||
|
||||
import sys
|
||||
import tomllib
|
||||
from pathlib import Path
|
||||
|
||||
import requests
|
||||
|
||||
sys.path.insert(0, str(Path.cwd()))
|
||||
|
||||
from trading import geheimnisse # noqa: E402
|
||||
|
||||
HANDEL = "https://paper-api.alpaca.markets"
|
||||
DATEN = "https://data.alpaca.markets"
|
||||
|
||||
|
||||
def form(wert, tiefe=0):
|
||||
if isinstance(wert, dict):
|
||||
if tiefe > 1:
|
||||
return "{...}"
|
||||
return "{" + ", ".join(f"{k}: {form(v, tiefe + 1)}" for k, v in list(wert.items())[:14]) + "}"
|
||||
if isinstance(wert, list):
|
||||
return f"[{len(wert)} x {form(wert[0], tiefe + 1) if wert else '-'}]"
|
||||
return type(wert).__name__
|
||||
|
||||
|
||||
def main() -> int:
|
||||
tag, symbole = sys.argv[1], sys.argv[2:]
|
||||
werte = tomllib.loads(geheimnisse.pfad().read_text(encoding="utf-8"))["alpaca"]
|
||||
s = requests.Session()
|
||||
s.trust_env = False
|
||||
s.headers.update({"APCA-API-KEY-ID": werte["key_id"], "APCA-API-SECRET-KEY": werte["secret_key"]})
|
||||
|
||||
print("== /v2/assets/{symbol}")
|
||||
for sym in symbole:
|
||||
a = s.get(f"{HANDEL}/v2/assets/{sym}", timeout=20)
|
||||
if a.status_code != 200:
|
||||
print(sym, "HTTP", a.status_code)
|
||||
continue
|
||||
j = a.json()
|
||||
felder = {k: j.get(k) for k in ("symbol", "exchange", "status", "tradable", "shortable", "easy_to_borrow", "fractionable", "marginable")}
|
||||
print(felder)
|
||||
print("Schluessel einer Anlage:", sorted(j.keys()) if symbole else "-")
|
||||
|
||||
print("== /v2/stocks/trades/latest (gebuendelt)")
|
||||
t = s.get(f"{DATEN}/v2/stocks/trades/latest", params={"symbols": ",".join(symbole), "feed": "iex"}, timeout=20)
|
||||
print("HTTP", t.status_code, "Form:", form(t.json()))
|
||||
trades = t.json().get("trades", {})
|
||||
print("Symbole mit Trade:", len(trades), "von", len(symbole), "; Felder eines Trades:", sorted(next(iter(trades.values())).keys()) if trades else "-")
|
||||
|
||||
print("== /v2/stocks/bars (gebuendelt, Seiten)")
|
||||
start, ende = f"{tag}T13:30:00Z", f"{tag}T20:00:00Z"
|
||||
seiten, gesamt, je_symbol, token = 0, 0, {}, None
|
||||
while True:
|
||||
p = {"symbols": ",".join(symbole), "timeframe": "1Min", "start": start, "end": ende, "feed": "iex", "limit": 10000, "adjustment": "raw"}
|
||||
if token:
|
||||
p["page_token"] = token
|
||||
b = s.get(f"{DATEN}/v2/stocks/bars", params=p, timeout=30)
|
||||
if b.status_code != 200:
|
||||
print("HTTP", b.status_code, b.text[:200])
|
||||
return 1
|
||||
j = b.json()
|
||||
seiten += 1
|
||||
if seiten == 1:
|
||||
print("Form erste Seite:", form(j))
|
||||
for sym, liste in (j.get("bars") or {}).items():
|
||||
je_symbol[sym] = je_symbol.get(sym, 0) + len(liste)
|
||||
gesamt += len(liste)
|
||||
token = j.get("next_page_token")
|
||||
if not token or seiten > 20:
|
||||
break
|
||||
print("Seiten:", seiten, "Balken gesamt:", gesamt)
|
||||
print("Balken je Symbol:", dict(sorted(je_symbol.items())))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in new issue
Block a user