Q
QMOM · {{ p.universe }}
{{ configSummary }}
{{ themeIcon }}
● {{ brokerBadge.text }}
{{ brokerMenuHint }}
{{ bm.name }} {{ bm.statusText }}
+ Manage broker connections ›
{{ authUserIcon }}{{ authUserLabel }}
{{ authMenuUserInfo }}
⚙ User Management
↪ Sign Out
{{ n.ic }} {{ n.label }}
{{ railToggleIcon }} Collapse
⚠ {{ renderErrorBanner }}
{{ t.sym }} {{ t.px }} {{ t.chg }}
● {{ quoteBarText }}
{{ loadBtnText }}
{{ liveErrorText }}
{{ skelHint }}
PORTFOLIO · NAV
₹{{ nav }}
{{ navChange }}
{{ k.label }}
{{ k.val }}
BEAR-MARKET FILTER
{{ s.name }} {{ s.state }}
COMPOSITE {{ compositeText }}
NEXT REVIEW
{{ nextReview }}
{{ reviewCadence }}
{{ dashChartToggleIcon }} PORTFOLIO NAV
{{ dashChartExpandHint }}
{{ dashEqHint }}
{{ yt.yr }} {{ dashHover.date }} {{ dashHover.val }}
━ {{ strategyRetText }}
{{ ddTitle }}
HOLDINGS · {{ holdCount }} / {{ p.topN }}
OPEN PORTFOLIO ›
# SYMBOL MOM WT% DAY% LTP
No holdings — connect a broker and press REFRESH
{{ h.rank }} {{ h.sym }}{{ h.sec }} {{ h.mo }} {{ h.wt }} {{ h.day }} {{ h.px }}
MOMENTUM RANK LADDER
{{ r.rank }} {{ r.sym }}{{ r.tag }} {{ r.mo }}
SECTOR ALLOCATION
{{ sec.name }} {{ sec.wt }}%
HOLD STOCKS
LOOKBACK
{{ u.label }}
SKIPm
WEIGHTAGE
{{ c.label }}
Max / sector
SELECTION MODE
{{ c.label }}
REVIEW FREQUENCY
{{ c.label }}
DAY OF WEEK
{{ c.label }}
{{ reviewDayLabel }}
COMPOSITE MOMENTUM
Uses LOOKBACK from top bar
{{ ch.label }}
× %
×
+ ADD
Σ {{ compositeWeightSum }}%
EXIT POLICY
{{ c.label }}
Exit below rank
or %
% of universe
Replace bottom holdings
Replace bottom %
STOP LOSS
{{ stopLossOnOff }}
% per stock
BEAR-MARKET FILTER
{{ c.label }}
EMA LEN
SRC
{{ s.label }}
FAST
SLOW
SRC
{{ s.label }}
ATR
MULT
TF
{{ c.label }}
RSI PERIOD
BEAR BELOW
SRC
{{ s.label }}
{{ bi.checkMark }}
{{ bi.label }}
{{ bf.label }}
SRC
{{ s.label }}
TIMEFRAME
{{ c.label }}
DEFENSIVE ASSET
{{ c.label }}
DEFAULT CONFIG
{{ defaultConfigHint }}
{{ saveDefaultLabel }}
BACKTEST PERIOD
{{ c.label }}
YEAR ▾
CUSTOM
{{ y.label }}
FROM TO
HISTORICAL CONSTITUENTS
Point-in-time index members · no survivorship bias
{{ runBtLabel }}
✕ CANCEL
CAGR
TOTAL RETURN
MAX DD
SHARPE
RUNNING…
{{ sm.label }}
{{ sm.val }}
VIEW FULL BACKTEST →
ELIGIBLE (+MOM)
{{ eligibleCount }}
SELECTED
{{ selCount }}
EXCLUDED (−MOM)
{{ excludedCount }}
SECTORS
{{ sectorCount }}
# SYMBOL MOM WT%
{{ r.rank }} {{ r.sym }}{{ r.tag }} {{ r.mo }} {{ r.wt }}
RUN REVIEW WITH THESE SETTINGS
Backtest · {{ p.universe }}
{{ btRange }} · {{ configSummary }}
{{ runBtLabel }}
✕ CANCEL
PERIOD
{{ c.label }}
YEAR ▾
CUSTOM
{{ y.label }}
FROM TO
{{ btErrorText }}
Running real backtest from broker history — pulling daily candles for every constituent (rate-limited ~3/sec, ~20–30s)…
No backtest yet for this configuration. Connect a broker, then press + RUN BACKTEST — every metric, the equity curve, the monthly heatmap and the rebalance log are computed from real historical prices pulled from your broker.
HISTORICAL MODE · {{ btSnapCoverageText }}
{{ m.label }}
{{ m.val }}
SAVED BACKTEST RUNS · {{ runCount }} UNIQUE COMBINATIONS
click a run to load its settings
CLEAR ALL
CONFIGURATION CAGR TOTAL MAX DD SHARPE RUNS
{{ r.dot }}
{{ r.label }} {{ r.histBadge }} {{ r.periodNote }}
{{ r.cagr }} {{ r.totalRet }} {{ r.maxDD }} {{ r.sharpe }} ×{{ r.runs }}
{{ btChartToggleIcon }} EQUITY CURVE
UNIVERSE BENCHMARK {{ btChartExpandHint }}
{{ yt.yr }}
{{ btHover.date }}
{{ btHover.val }}
━ Strategy ┄ {{ univRetText }} ┄ Nifty 50 TR
DRAWDOWN
MONTHLY RETURNS · %
{{ ml }} {{ row.year }}
{{ c.val }}
REBALANCE SCHEDULE & STRATEGY HISTORY
▪ HELD ▪ ADDED ▪ REMOVED RET = period return
↓ EXPORT CSV
DATE TYPE HOLDINGS PERIOD RET
{{ rb.date }} {{ rb.periodRange }}
{{ rb.action }}
{{ c.sym }} {{ c.ret }}
{{ rb.pr }}
{{ btScheduleToggleLabel }}
Broker Connection
No demo data — all prices and orders route through your broker / NSE. Credentials are stored server-side, never in the browser.
SERVER {{ serverOrigin }} ● {{ backendPillText }}
{{ connectError }}
{{ b.name }}
ACTIVE
{{ b.statusLabel }}
{{ b.flow }}
{{ selectedBrokerName }} · API CREDENTIALS
✓ No credentials required
Pulls live quotes and historical prices from Yahoo Finance via yfinance. Auto-connects on server start — no login, no API key, no account needed.
⚠ Paper trading only · ~15 min quote delay · NSE symbols via .NS suffix
{{ f.label }}
Redirect URL: {{ redirectUrl }}
{{ connectBtnText }}
{{ activateBtnText }}
{{ activateBtnText }}
CONNECTION STATUS
{{ s.icon }}
{{ s.title }}
{{ s.sub }}
TEST
{{ testResult }}
{{ portfolioPageTitle }}
{{ portfolioPageSub }}
HOLDINGS
REVIEW
PAPER LIVE
{{ paperCapitalText }}
+ FUNDS
− FUNDS
↺
↻ {{ portRefreshCountdown }}s
{{ portfolioRefreshLabel }}
{{ portfolioErrorText }}
{{ portfolioEmptyText }}
# SYMBOL QTY AVG LTP P&L WT%
{{ h.rank }} {{ h.sym }}{{ h.sec }} {{ h.qty }} {{ h.avg }} {{ h.ltp }} {{ h.pl }} {{ h.wt }}
SECTOR ALLOCATION
{{ sec.name }} {{ sec.wt }}%
Unrealized P&L{{ unrealizedText }}
Cash{{ cashText }}
Beta vs Nifty{{ betaText }}
{{ portfolioPageTitle }}
{{ portfolioPageSub }}
HOLDINGS
REVIEW
PAPER LIVE
{{ modeBadge.text }}
{{ m.label }}
{{ m.val }}
ACTION{{ rSortArrow_action }} SYMBOL{{ rSortArrow_sym }} QTY{{ rSortArrow_qty }} LTP{{ rSortArrow_ltp }} EST VALUE{{ rSortArrow_value }} REASON STATUS
{{ o.action }} {{ o.sym }}{{ o.sec }} {{ o.qty }} {{ o.ltp }} ₹{{ o.value }} {{ o.reason }} {{ o.status }}
— No orders to place — — — — —
{{ basketSummaryText }}
EDIT STRATEGY
{{ placeBtnText }}
Journal
Every paper & live order and backtest run — recorded for analysis
REFRESH
{{ s.label }}
{{ s.val }}
{{ c.label }}
{{ c.label }}
{{ journalError }}
No journal entries yet. Place paper or live orders from the Review screen and run backtests — every order and run is recorded here automatically.
SYMBOLMODEENTRYEXITQTYENTRY ₹EXIT ₹P&LHOLD
No round-trips yet — place orders from the Review screen to start tracking.
{{ t.symbol }} {{ t.mode }} {{ t.entry }} {{ t.exit }} {{ t.qty }} {{ t.entryPx }} {{ t.exitPx }} {{ t.pnl }} {{ t.pct }} {{ t.days }}
TIMEMODEACTSYMBOLQTYPRICEVALUESTATUS
No orders placed yet — use the Review screen to place paper or live orders.
{{ o.ts }} {{ o.mode }} {{ o.action }} {{ o.symbol }} {{ o.reason }} {{ o.qty }} {{ o.price }} {{ o.value }} {{ o.status }}
RUN ATUNIVERSEPERIODCAGRTOTALMAX DDSHARPE
No backtest runs saved yet — run a backtest from the Backtest tab to record results here.
{{ r.ts }} {{ r.universe }} {{ r.period }} {{ r.cagr }} {{ r.total }} {{ r.maxdd }} {{ r.sharpe }}
Local Market Data
Offline OHLCV store — Nifty 500 · 20 years · ~150 MB · backtests run in <2s
⚠ {{ dataIssuesTotal }} NEED REVIEW
{{ dataUpdateIcon }}{{ dataUpdateBtnLabel }}
↻
⟳ ✓
{{ dataBgMode }}
{{ dataBgProgress }}
{{ dataBgPct }}%
UPDATE LOG
{{ line }}
PULL DATA
UNIVERSE or override with a single symbol →
{{ dataPullCountNote }}
HISTORY
{{ dataPullBtnLabel }}
Cached & denylisted symbols are skipped automatically
{{ line }}
SKIP LIST · {{ dataDenylistCount }} symbols with no data (delisted / merged)
{{ d.symbol }} …and {{ dataDenylistCount - 30 }} more
These are auto-retried after 30 days. Use force-pull to override.
Symbol Review
yfinance returned 0 rows — wrong ticker, delisted, or merged. Enter correct NSE symbol → SAVE → re-pull.
{{ dataIssuesSuspect }} SUSPECT {{ dataIssuesSkipped }} AUTO-SKIPPED (5+ fails) {{ dataIssuesTotal }} total
⬇ EXPORT CSV
✕
SYMBOL / COMPANY TRIES LAST TRIED CORRECT NSE TICKER yfinance NSE DIRECT
{{ iss.symbol }}
{{ iss.company_name }}
{{ iss.attempt_count }}
{{ iss.last_attempt }}
SAVE
✕
{{ iss.nseBtnLabel }}
{{ iss.nseStatusText }}
{{ nseBulkStatusLabel }} {{ nseBulkDetailLabel }}
{{ line }}
Pulls all {{ dataIssuesTotal }} symbols from NSE one by one.
Each symbol: ~{{ nseBulkChunks }} requests × 5-year chunks. Safe to close modal.
CLOSE
DB COVERAGE
{{ dataDbStats }}
No data yet — pull a universe above to populate the local DB.
SYMBOL {{ coverageSort==='symbol' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} FROM {{ coverageSort==='fromDate' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} TO {{ coverageSort==='toDate' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} ROWS {{ coverageSort==='days' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} SPAN {{ coverageSort==='years' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }}
{{ r.symbol }} {{ r.fromDate }} {{ r.toDate }} {{ r.days }} {{ r.years }}
{{ coverageCountLabel }}
CONSTITUENT TRACKING
Daily snapshots — detects additions & removals for point-in-time backtests
UNIVERSE LAST CHECKED SNAPS CHANGES
{{ r.universe }} {{ r.lastDate }} {{ r.snapshots }} {{ r.changes }}
No changes detected yet — history builds automatically as you use the app each day.
CHANGE LOG
DATE UNIVERSE SYMBOL ACTION SECTOR
{{ r.date }} {{ r.universe }} {{ r.symbol }} {{ r.action }} {{ r.sector }}
CUSTOM UNIVERSE
Add factor / strategy indices not available for direct NSE download (e.g. Nifty Alpha 50, Nifty500 Quality 50). Paste NSE symbols, one per line or comma-separated.
{{ customUniMsgText }}
{{ customUniBtnLabel }}
HISTORICAL CONSTITUENT IMPORT
Backfill constituent snapshots from NSE IndexInclExcl.xls — eliminates survivorship bias for pre-2020 backtests
{{ histImportBtnLabel }}
① Copy IndexInclExcl.xls to backend/data/IndexInclExcl.xls  ② Click IMPORT
{{ histStage }} {{ histCur }} / {{ histTotal }}
✕ {{ histError }}
TOTAL EVENTS
{{ histTotalEvents }}
MAPPED
{{ histMappedEvents }}
UNMAPPED
{{ histUnmappedEvents }}
MAP RATE
{{ histMapRate }}%
UNIVERSE EVENTS MAPPED SNAPS FROM TO
{{ u.name }} {{ u.events }} {{ u.mapped }} {{ u.snaps }} {{ u.from_date }} {{ u.to_date }}
{{ n.ic }} {{ n.label }}
MOMENTUM
TERMINAL
Sign In
Register
{{ authMessage }}
{{ authError }}
USERNAME
PASSWORD
CONFIRM PASSWORD
{{ authSubmitLabel }}
First registered user becomes admin. All others require admin approval.
User Management
Approve, suspend, or remove user accounts
↻ REFRESH
✕ CLOSE
{{ adminUsersError }}
{{ u.username }}
{{ u.role }} · joined {{ u.created_at }}
{{ u.status }}
Approve
Suspend
Delete
Loading users…
⚡ Deploy as Live Strategy
This will save your current strategy configuration and run it automatically on site load and every hour. Signals (selected stocks) will appear in Portfolio → STRATEGIES.
STRATEGY NAME
CANCEL
DEPLOY ▶
! Confirm LIVE order placement
{{ confirmText }}
Orders{{ confirmOrders }}
Gross value₹{{ confirmValue }}
{{ checkMark }} I confirm placing these as live market orders.
CANCEL
PLACE LIVE ORDERS