75 lines
3.0 KiB
HTML
75 lines
3.0 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>alpaca-llm-bot-v1</title>
|
|
<style>
|
|
:root { --bg:#0b0f17; --card:#111827; --text:#e5e7eb; --muted:#9ca3af; --ok:#10b981; --bad:#ef4444; --acc:#60a5fa; }
|
|
body{background:var(--bg);color:var(--text);font-family:Inter,system-ui,sans-serif;margin:0;padding:24px}
|
|
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}
|
|
.card{background:var(--card);border:1px solid #1f2937;border-radius:12px;padding:14px}
|
|
.h{font-size:13px;color:var(--muted)} .v{font-size:24px;font-weight:700}
|
|
table{width:100%;border-collapse:collapse} th,td{padding:8px;border-bottom:1px solid #1f2937;text-align:left;font-size:13px}
|
|
.buy{color:var(--ok)} .sell{color:var(--bad)} .hold{color:var(--muted)}
|
|
.row{display:grid;grid-template-columns:2fr 1fr;gap:12px}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h2>alpaca-llm-bot-v1</h2>
|
|
<div class="grid">
|
|
<div class="card"><div class="h">Decisions (24h)</div><div class="v">{{ stats.decisions }}</div></div>
|
|
<div class="card"><div class="h">Trades (24h)</div><div class="v">{{ stats.trades }}</div></div>
|
|
<div class="card"><div class="h">Executed</div><div class="v">{{ stats.executed }}</div></div>
|
|
<div class="card"><div class="h">Failed</div><div class="v">{{ stats.failed }}</div></div>
|
|
<div class="card"><div class="h">Curated Insights</div><div class="v">{{ stats.insights }}</div></div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div>
|
|
<h3>Recent Decisions</h3>
|
|
<div class="card">
|
|
<table>
|
|
<thead><tr><th>Time</th><th>Symbol</th><th>Action</th><th>Confidence</th><th>Status</th><th>Reason</th></tr></thead>
|
|
<tbody>
|
|
{% for d in decisions %}
|
|
<tr>
|
|
<td>{{ d.ts }}</td><td>{{ d.symbol }}</td>
|
|
<td class="{{ d.action }}">{{ d.action }}</td>
|
|
<td>{{ '%.2f'|format(d.confidence or 0) }}</td>
|
|
<td>{{ d.status }}</td>
|
|
<td>{{ d.reason }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<h3>Curated Market Briefs</h3>
|
|
<div class="card" style="max-height:520px;overflow:auto">
|
|
{% for i in insights %}
|
|
<div style="margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid #1f2937">
|
|
<div><b>{{ i.symbol }}</b> · <span class="h">{{ i.ts }}</span></div>
|
|
<div style="font-size:13px;line-height:1.4">{{ i.summary }}</div>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<h3>Recent Trades</h3>
|
|
<div class="card">
|
|
<table>
|
|
<thead><tr><th>Time</th><th>Symbol</th><th>Side</th><th>Notional</th><th>Order ID</th></tr></thead>
|
|
<tbody>
|
|
{% for t in trades %}
|
|
<tr><td>{{ t.ts }}</td><td>{{ t.symbol }}</td><td class="{{ t.side }}">{{ t.side }}</td><td>${{ '%.2f'|format(t.notional or 0) }}</td><td>{{ t.alpaca_order_id }}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</body>
|
|
</html>
|