From 283100c453a420f808f5e5f0dba8426aeadc4892 Mon Sep 17 00:00:00 2001 From: ojy Date: Wed, 13 May 2026 05:27:29 +0000 Subject: [PATCH] Show DTE per leg + per-expiry remaining DTE for multi-expiry strategies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Legs table: small DTE chip next to each leg's expiry (e.g. "14d", "<1d", "exp" — absolute days from today) - Chart header: when active legs span multiple expiries (calendar/diagonal), a "Remaining: 2026-05-15 (0d) · 2026-06-20 (36d)" line shows how many days each unique expiry has left at the current slider position Co-Authored-By: Claude Sonnet 4.6 --- frontend/strategy.html | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/frontend/strategy.html b/frontend/strategy.html index 46f5ada..fdc0ed1 100644 --- a/frontend/strategy.html +++ b/frontend/strategy.html @@ -109,11 +109,12 @@ -
+
Now Exp +
@@ -173,11 +174,14 @@ - - - + +
+ + + +
@@ -493,6 +497,22 @@ if (this.dteOffset === 0) return 'Today (' + ds + ')'; return 'T+' + this.dteOffset + 'd · ' + ds; }, + get hasMultiExpiry() { + return new Set(this.activeLegs.map(l => l.expiry)).size > 1; + }, + get expiryBreakdown() { + const uniq = [...new Set(this.activeLegs.map(l => l.expiry))].sort(); + return uniq.map(e => { + const rem = Math.max(0, Math.round(legDTE({expiry:e}) - this.dteOffset)); + return e + ' (' + rem + 'd)'; + }).join(' · '); + }, + legDTEStr(lv) { + const d = legDTE(lv); + if (d < 0) return 'exp'; + if (d < 1) return '<1d'; + return Math.round(d) + 'd'; + }, get legsView() { return this.legs.map(l => {