Files
alpaclaudia/dashboard/app/components/kpi.tsx
T
admin 39875112a0 initial: alpaclaudia paper-trading bot + dashboard
Python bot (bot/alpaclaudia): alpaca-py client, wheel strategy (CSP + covered
calls) plus equity trailing stops, risk gates (cash buffer, cost-basis guard,
per-symbol concentration cap), SQLite state log, Typer CLI (tick/loop/status/
report/dump-state), Discord daily report, pytest suite.

Next.js 14 dashboard (dashboard/): read-only — reads the bot's SQLite directly
and pulls live account/positions/orders from Alpaca. KPIs, equity chart,
positions, bot-intents audit table, and orders table. Dark UI with Tailwind.

systemd/: user-unit templates for the polling loop and the post-close report
timer.

docs/STRATEGY.md: wheel mechanics, risk invariants, later candidates.

Defaults to BOT_MODE=dry — nothing is submitted to Alpaca until explicitly
enabled in .env. ALPACA_ENV=paper by default; flipping to live requires an
explicit second guard.
2026-04-16 21:38:25 +02:00

30 lines
662 B
TypeScript

export function Kpi({
label,
value,
sub,
tone,
}: {
label: string;
value: React.ReactNode;
sub?: React.ReactNode;
tone?: "up" | "down" | "warn" | "mute";
}) {
const color =
tone === "up"
? "text-up"
: tone === "down"
? "text-down"
: tone === "warn"
? "text-warn"
: tone === "mute"
? "text-mute"
: "text-ink";
return (
<div className="panel p-4 flex flex-col gap-1">
<div className="kpi-label">{label}</div>
<div className={`text-2xl font-semibold num ${color}`}>{value}</div>
{sub !== undefined && <div className="text-xs text-mute num">{sub}</div>}
</div>
);
}