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.
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user