feat(web): v1.4.0 UI — backtest results, trade stats, dot grid background

backtest page:
- equity progression SVG chart ($5k → $27,439)
- filter impact cards (ATR gate, entry zone 75%, session)
- v1.4.0 results: PF 2.08, +448.7%, WR 62.7%

trades page:
- avg win/loss, friction, streak tiles
- win/loss distribution bar (visual green/red)
- best trade + worst trade highlight cards

home page:
- 4 strategy cards (added ATR Quality Gate)
- backtest CTA updated to v1.4.0 numbers with v1.3.0 comparison

globals/layout:
- dot grid background pattern
- top accent glow (purple radial)
- edge vignette fade

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
romysaputrasihananda
2026-06-12 02:41:44 +07:00
co-authored by Claude Sonnet 4.6
parent 2c02589521
commit 31b95808b1
5 changed files with 382 additions and 70 deletions
+21 -15
View File
@@ -12,8 +12,8 @@ export default function DashboardPage() {
</h1>
<p className="text-[18px] text-ink-md leading-relaxed max-w-2xl mb-8">
Open-source algorithmic trading bot built in Rust. Momentum FVG scalper
with EMA trend filter, configurable session window, automatic position
sizing, and Telegram alerts runs on any MT5 symbol.
with ATR quality filter, EMA trend filter, configurable session window,
automatic position sizing, and Telegram alerts runs on any MT5 symbol.
</p>
<div className="flex gap-3 flex-wrap">
<Link href="/trades" className="btn-primary">View Trades</Link>
@@ -27,21 +27,26 @@ export default function DashboardPage() {
{/* Strategy */}
<section className="mb-16">
<p className="eyebrow mb-6">Strategy</p>
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4">
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<FeatureCard
icon="◈"
title="Momentum FVG"
body="3-candle pattern: pre → impulse → post. Body ≥ 60% of range, close in top/bottom 20%."
body="3-candle pattern: pre → impulse → post. Body ≥ 50% of range, close in top/bottom 20%."
/>
<FeatureCard
icon="⬡"
title="ATR Quality Gate"
body="FVG zone ≥ 0.3× ATR(14) and impulse body ≥ 1.0× ATR(14). Weak setups are discarded before entry."
/>
<FeatureCard
icon="◎"
title="EMA-20 Filter"
body="Long only above EMA-20, short only below. Eliminates counter-trend signals entirely."
title="EMA-20 + Zone 75%"
body="Long above EMA-20, short below. Limit order placed 75% deep into the FVG for better confirmation."
/>
<FeatureCard
icon="◉"
title="Risk Management"
body="Fixed % risk per trade. Minimum 1.5× RR. SL auto-set at FVG boundary."
body="Fixed % risk per trade. Min 1.5× RR. SL at FVG boundary. Session restricted to 0813 UTC."
/>
</div>
</section>
@@ -50,11 +55,11 @@ export default function DashboardPage() {
<section className="card-featured p-10 mb-16">
<div className="flex flex-col sm:flex-row sm:items-center gap-6 mb-8">
<div>
<p className="eyebrow mb-2">Backtest Highlight</p>
<p className="eyebrow mb-2">Backtest Highlight · v1.4.0</p>
<h2 className="text-2xl font-semibold tracking-tight-sm text-ink">
M5 · 1 Month · 1% Risk
M5 · 50k Bars · 5% Risk
</h2>
<p className="text-sm text-ink-sub mt-1">XAUUSDm · 159 trades · Exness Demo</p>
<p className="text-sm text-ink-sub mt-1">XAUUSDm · Sep 2025 Jun 2026 · 83 trades</p>
</div>
<Link href="/backtest" className="btn-primary sm:ml-auto shrink-0">
Full Results
@@ -62,14 +67,15 @@ export default function DashboardPage() {
</div>
<div className="grid grid-cols-2 sm:grid-cols-4 gap-6 pt-6 border-t border-hl">
{[
{ label: "Profit Factor", value: "1.42" },
{ label: "Net Return", value: "+43.2%" },
{ label: "Max Drawdown", value: "11.5%" },
{ label: "Win Rate", value: "55.3%" },
].map(({ label, value }) => (
{ label: "Profit Factor", value: "2.08", sub: "vs 1.17 in v1.3.0" },
{ label: "Net Return", value: "+448.7%", sub: "$5k → $27,439" },
{ label: "Win Rate", value: "62.7%", sub: "vs 50% in v1.3.0" },
{ label: "Max Drawdown", value: "$2,669", sub: "vs $5,482 in v1.3.0" },
].map(({ label, value, sub }) => (
<div key={label}>
<p className="text-xs text-ink-sub mb-1.5">{label}</p>
<p className="font-mono text-xl font-semibold tracking-tight-md">{value}</p>
<p className="text-xs text-ink-ter mt-1">{sub}</p>
</div>
))}
</div>