Commit graph

53 commits

Author SHA1 Message Date
Manohar
8cd09d8a0e fix: three issues — symbol parser, booked PnL window, token reauth
1. parseOptionSymbol (greeks.ts)
   Added Format 3 for SENSEX weekly DD+MON+STRIKE symbols (no year).
   SENSEX26JUN77300PE was returning null — parser read year=26, day=77
   giving invalid date 2026-06-77. Now correctly parses as day=26,
   month=JUN, year=2026 (inferred), strike=77300.

2. Booked PnL window (server.ts)
   Changed all three booked-PnL queries from 'today IST only' to
   'last 7 days'. With a stale Angel One token, positions are not
   updated today so date(updated_at)=today returns 0 even when
   real closed-position PnL exists from yesterday.

3. Angel One token expiry UX (server.ts + index.html)
   - Added POST /api/reauth endpoint — forces a fresh Angel One
     login without restarting the container
   - Nav now shows red error text +  Reauth button whenever
     lastError is set; clicking reauth calls /api/reauth then
     re-runs refresh + analysis
   - Fixed loadHealth() to show/hide the error span (was always
     hidden due to missing display toggle)
   - Label changed from 'Booked P&L Today' → 'Booked PnL (7d)'

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 10:07:20 +05:30
Manohar
1fbc9279a4 fix: parse SENSEX weekly symbol format DD+MON+STRIKE (no year)
Angel One SENSEX weeklies use e.g. SENSEX26JUN77300PE where 26=day,
JUN=month, 77300=strike — no year in the symbol. The previous parser
tried YY+MON+DD, treating 26 as year and 77 as day, giving an invalid
date (2026-06-77) and returning null for ALL option positions.

Added Format 3: DD(1-2) + MON(3-letter) + STRIKE + TYPE
Year is inferred: current year, or next year if date is >7 days past.
Format 2 (YY+MON+DD) is left as-is so it still falls through to Format 3
when its parsed date is invalid (day=77 etc).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 16:02:50 +05:30
Manohar
02cc8ed9b3 fix: make Analysis tab robust when no snapshot data exists
- showView() now tracks _curView, scrolls to top, forces visibility
- loadAnalysis() shows clear "No data yet" message when API returns null
  instead of silently leaving static placeholder text
- forceRefreshAnalysis() added: POSTs /api/refresh then reloads analysis
- ↻ Refresh button added at top of Analysis view with live timestamp
- Auto-refresh analysis every 30s when Analysis tab is active

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 14:20:59 +05:30
Manohar
dca5fea679 feat: add Analysis tab with position intelligence engine
Phase 1 of the position-tracker → analysis port:

Backend:
- src/ai/types.ts       — shared types (AnalysisInput, ClassifiedPosition, AnalysisResult, etc.)
- src/ai/greeks.ts      — added calcTheoreticalPrice() export for scenario analysis
- src/ai/classifier.ts  — pure-function position classifier (DEAD_WEIGHT/WORKING/UNDER_PRESSURE/HEDGE/DANGER_SHORT) with module-level hysteresis Map
- src/ai/portfolio-greeks.ts — aggregates per-unit Greeks × quantity into portfolio totals
- src/ai/risk-assessor.ts   — naked short detection, concentration, side imbalance, Greeks breach checks
- src/ai/scenario.ts        — P&L grid at ±100..±1000 spot moves per underlying
- src/ai/analyze.ts         — orchestrator: maps Position[] → AnalysisInput[], reads spot from market_cache, stores JSON in analysis_snapshots
- src/db/client.ts      — analysis_snapshots table + index
- src/tracker/poll.ts   — runAnalysis() called after every pollTick + forcePoll
- src/api/server.ts     — GET /api/analysis endpoint

Frontend (public/index.html):
- Multi-page nav with Dashboard | Analysis tabs (showView())
- Analysis view: summary cards (delta/theta/vega/risk level), action list (urgent positions sorted by urgency score), classification table with urgency bars, risk assessment details, scenario P&L grid per underlying
- loadAnalysis() + renderAnalysis() wired to tab switch

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 14:07:24 +05:30
Manohar
bb8a00c196 fix: bind port 3457 to 127.0.0.1 to prevent direct public access
Was bound to 0.0.0.0:3457 making the API reachable without auth.
Now relies exclusively on Traefik (angel.manohargupta.com) for ingress.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 09:41:17 +05:30
Manohar
b2e6ef940a fix: payoff chart zoomed to 1.5 SD range instead of 8% flat pad 2026-05-27 19:16:30 +05:30
Manohar
ef459facfc feat: reorder cards (payoff below positions), booked=totalRealised, payoff respects expiry tab 2026-05-27 14:00:41 +05:30
Manohar
a1945d06e2 fix: tab filtering uses filtered not open; tab class quote; booked=netqty=0 today only 2026-05-27 13:32:35 +05:30
Manohar
e8bb8fdd30 fix: expiry tabs outside card-head (no collapse on click), stopPropagation 2026-05-27 13:24:37 +05:30
Manohar
acf8799880 fix: P&L today-only date filter (IST), expiry tabs in positions table 2026-05-27 13:17:44 +05:30
Manohar
805f25eb75 fix: afterDraw with 1SD/2SD lines, breakeven%, spot line; all 3 table fixes 2026-05-15 10:38:16 +05:30
Manohar
b3b1946ee6 fix: slot label literal, netqty filter, today-only closed, calcSD + SD wire 2026-05-15 10:37:27 +05:30
Manohar
2540a89bae fix: slot label literal, netqty filter, today-only closed, green/red payoff lines, SD+breakeven% annotations 2026-05-15 10:14:02 +05:30
Manohar
b41839e529 fix: restore LABELS const 2026-05-15 04:20:30 +00:00
Manohar
64c222b172 fix: empty string unit literal stripped by heredoc 2026-05-15 04:18:41 +00:00
Manohar
2f13c0d7a2 fix: restore quotes stripped by heredoc in market.ts 2026-05-15 04:17:22 +00:00
Manohar
c53c188ae4 fix: market token collision via tradingSymbol lookup; correct avg_price 2026-05-15 04:15:14 +00:00
Manohar
206127976d fix: remove netAmount shorthand (field no longer declared) 2026-05-15 04:07:55 +00:00
Manohar
aba1dcbdda fix: avg_price from netprice, hardcode VIX/crude/USDINR tokens, UI market cache fallback 2026-05-15 04:07:16 +00:00
Manohar
580c03e959 fix: add sendPortfolioDigest to import 2026-05-12 05:50:20 +00:00
Manohar
cdddefc6a9 fix: let not const for state (reassigned in init block) 2026-05-12 05:49:11 +00:00
Manohar
c46570171a fix: snake_case->camelCase (alerts now work); feat: 2h portfolio digest cron 2026-05-12 05:47:59 +00:00
Manohar
052db5d934 fix: add HTTP->HTTPS redirect via redirect-to-https middleware 2026-05-12 05:03:34 +00:00
Manohar
91fd17b158 fix: correct booked PnL (netqty=0 only), closed positions card, no false is_closed on open qty 2026-05-12 04:57:18 +00:00
Manohar
ade11564a8 fix: wire booked PnL to UI stat card 2026-05-12 04:34:28 +00:00
Manohar
4d1c956963 fix: booked PnL from closed legs, login mutex, market cache-on-error 2026-05-12 04:33:15 +00:00
Manohar
6f06755e11 fix: login mutex, zero-qty realised PnL, market cache-on-error, UI preserve cards 2026-05-12 04:23:50 +00:00
Manohar
882d55adad feat: payoff graph clean inject (Python, no template literal escaping) 2026-05-11 05:23:12 +00:00
Manohar
c9a38be908 fix: payoff regex (\d stripped to d), proper fill zones, canvas annotation plugin 2026-05-11 05:16:17 +00:00
Manohar
4b0bfb2a12 feat: strategy payoff graph — breakeven, max P&L, R/R, spot line, profit/loss shading 2026-05-11 05:01:23 +00:00
Manohar
7cf1de885e fix: market fixed 6-slot order always; collapsed header shows P&L + alert count 2026-05-11 04:54:16 +00:00
Manohar
ed84985237 feat: 30s polling, market open/close Telegram alerts, mobile responsive UI 2026-05-11 04:45:22 +00:00
Manohar
ea6af0ea82 fix: each collapsible section is now independent — proper div structure 2026-05-09 04:19:38 +00:00
Manohar
dad5f9d337 fix: collapsible arrows on all 4 sections + market fixed order 2026-05-09 04:05:43 +00:00
Manohar
8564dcb8b2 fix: market cards fixed order; collapsible with arrow indicator 2026-05-09 04:04:09 +00:00
Manohar
5bdf7fbffe fix: market cache in SQLite for after-hours; collapsible sections with localStorage state 2026-05-09 03:50:11 +00:00
Manohar
1f00d2da41 design: favicon, market indices, alert settings, TTE, dark/light toggle 2026-05-09 03:42:19 +00:00
Manohar
496d192435 fix: market.ts dual-source (Angel primary, Yahoo fallback for after hours) 2026-05-08 17:45:35 +00:00
Manohar
a3bb07f7ef feat: Angel SmartAPI market data endpoint (NIFTY/SENSEX/VIX/crude/INR) + global alert config 2026-05-08 17:42:43 +00:00
Manohar
30884f10e0 design: premium fintech UI — DM Serif, dark/light toggle, coral accents, glassmorphism nav 2026-05-08 17:31:26 +00:00
Manohar
03035b3965 fix: recordSnapshot type annotation + datetime quotes 2026-05-08 17:13:17 +00:00
Manohar
e97a2ca643 feat: new UI — P&L summary cards, intraday chart, totals footer 2026-05-08 17:10:26 +00:00
Manohar
247f750de4 feat: P&L snapshots table, /api/pnl-history, intraday chart + totals row in UI 2026-05-08 17:10:17 +00:00
Manohar
f809fbdaa1 feat: options/F&O positions only — exclude equity holdings 2026-05-08 17:06:42 +00:00
Manohar
60e5c7647d feat: forcePoll at startup + POST /api/refresh (bypasses market hours) 2026-05-08 16:44:11 +00:00
Manohar
a0aede9294 fix: remove secHeaders middleware ref — not defined in Traefik, disables router 2026-05-08 16:39:29 +00:00
Manohar
f0c6db3c40 fix: run as root — bind-mount overrides chown causing SQLITE_CANTOPEN 2026-05-08 16:36:49 +00:00
Manohar
4a637351db fix: remove dotenv/config import — env vars injected by Dokploy in prod 2026-05-08 16:34:32 +00:00
Manohar
28178abbe5 fix: remove import.meta (ESM-only) — use native __dirname in CJS 2026-05-08 16:33:15 +00:00
Manohar
5bb59de545 fix: npm install instead of npm ci (no lockfile) 2026-05-08 16:31:38 +00:00