A

Autobot Engine v{{ appVersion.version }}

Validate the saved Upstox session and continue to Backtest and AlgoRun.

{{ statusLabel }}

{{ message }}

{{ tokenMessage }}

User ID{{ profile.user_id || 'Unknown' }}
User Name{{ profile.user_name || 'User' }}

{{ tab === 'algorun' ? 'AlgoRun Terminal' : tab === 'portfolio' ? 'Virtual Portfolio' : 'Backtest Terminal' }} v{{ appVersion.version }}

{{ tab === 'algorun' ? `NIFTY live paper engine - ${algorun.lastTick || 'waiting for tick'} - session recovery enabled` : tab === 'portfolio' ? (selectedMessage || 'Live Upstox quotes, volume, buy price, and portfolio P&L') : 'Same strategy controls and anti-churn execution rules as AlgoRun' }}
{{ algorunRecovery.error || algorunRecovery.message }} Last saved {{ new Date(algorunRecovery.last_saved_at).toLocaleTimeString() }}
NIFTY Spot {{ formatPrice(algorunSpotLtp) }} NSE_INDEX|Nifty 50 index tick
NIFTY FUT {{ formatPrice(algorun.futureQuote?.ltp) }} {{ algorun.future ? derivativeDisplayName(algorun.future) : 'NIFTY FUT' }} / {{ algorun.lastTick || 'Waiting' }}
FUT - Spot {{ formatPrice(algorunFutureSpotBasis) }}
Basis
Last Closed 1m {{ formatPrice(algorun.lastClosedCandle?.close) }} {{ algorun.lastClosedCandle?.closed_at || '-' }} / SL check candle
Entry Gate {{ formatNumber(algorun.decision?.nearest) }} {{ formatPrice(algorun.decision?.price) }} · dist {{ formatPrice(algorun.decision?.distance) }} / tol {{ formatNumber(algorun.decision?.tolerance) }}
Open P&L {{ formatPrice(algorunLivePnl) }} {{ formatPrice(algorunLivePoints) }} pts / {{ algorunOpenLegs.length }} open legs
Net Day P&L {{ formatPrice(algorunNetPnl) }} Realized {{ formatPrice(algorun.realized_pnl) }}

Live Positions

Open positions stay at top. SL checks only on completed 1m candle close.
SELL{{ formatNumber(position.strike) }} {{ position.side }}
{{ position.expiry || '-' }} / {{ position.status }}
{{ position.status === 'Open' ? 'Opened' : 'Time' }}{{ position.entry_time || '-' }}{{ position.exit_time || 'signal after gate' }}
Entry{{ formatPrice(position.entry) }}{{ formatPrice(position.entry_spot) }} FUT
LTP{{ formatPrice(position.current ?? position.exit) }}{{ position.status === 'Open' ? 'Live option tick' : 'Closed' }}
Lots{{ formatNumber(position.lots) }}Qty {{ formatNumber(position.quantity) }}
Leg OHLC
O {{ formatPrice(algoLegOhlc(position).open) }}H {{ formatPrice(algoLegOhlc(position).high) }}L {{ formatPrice(algoLegOhlc(position).low) }}C {{ formatPrice(algoLegOhlc(position).close) }}
SL{{ formatPrice(position.sl) }}{{ position.sl_kind === 'trailing' ? 'trails on candle close' : 'fixed' }}
IV{{ formatNumber(algoLegIv(position), { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}{{ algoLegQuote(position).iv ? 'Live IV' : 'Entry IV' }}
Volume{{ formatNumber(algoQuoteVolume(algoLegQuote(position))) }}
P&L{{ formatPrice(position.pnl) }}{{ formatPrice(position.pnl_points) }} pts
Status{{ position.status }}{{ position.exit_reason || algorun.lastTick || '-' }}
No live paper position. Start AlgoRun and wait for a live FUT touch inside the milestone tolerance.
Current Value{{ formatPrice(activePortfolioCard.current) }}{{ activePortfolioCard.name }} · {{ formatNumber(activePortfolioCard.count) }} holdings
Invested{{ formatPrice(activePortfolioCard.invested) }}Buy price × quantity
Portfolio P&L{{ formatPrice(activePortfolioCard.absolute_return) }}{{ formatNumber(activePortfolioCard.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Live Quotes{{ formatNumber(portfolioLiveCount) }}{{ formatNumber(portfolioUnmappedCount) }} unmapped
Portfolios{{ formatNumber(portfolios.length) }}{{ selectedMessage || 'Ready' }}

{{ activePortfolio.name || 'Portfolio' }} Holdings

Live Upstox quote, volume, buy price, current value, and P&L.
ScripBuy PriceLTPQtyVolumeInvestedCurrentP&LP&L %Status
{{ row.symbol || '-' }}{{ row.stock_name || row.instrument_key || '-' }} {{ row.buy_price_source || row.source || '-' }} {{ formatPrice(row.ltp) }}{{ row.quote?.timestamp || 'live quote' }} {{ formatNumber(row.volume) }}{{ row.quote?.live_status || '-' }} {{ formatPrice(row.invested) }} {{ formatPrice(row.current) }} {{ formatPrice(row.absolute_return) }} {{ formatNumber(row.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}% {{ row.quote_status }}{{ row.mapping_status || '-' }}
Create a portfolio, import the scanner CSV, or add a scrip manually.
Net P&L{{ formatPrice(backtest.summary?.net_pnl ?? backtest.summary?.total_pnl) }}After brokerage + charges
Gross P&L{{ formatPrice(backtest.summary?.total_pnl) }}Charges visible in tradebook
Live P&L{{ formatPrice(backtestStepPnl()) }}{{ formatPrice(backtestStepLivePoints()) }} pts
Win Rate{{ formatNumber(backtest.summary?.win_rate, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%{{ formatNumber(backtest.summary?.wins) }} / {{ formatNumber(backtest.summary?.losses) }}
Blocked Churn{{ formatNumber(backtestAntiChurnStatus.score) }}{{ backtestAntiChurnStatus.action }}
{{ backtestProgressLabel }} {{ backtestProgressMeta }}

Session P&L Timeline

{{ currentBacktestStep ? `${currentBacktestStep.date} ${currentBacktestStep.time} · ${currentBacktestStep.action}` : 'Run a backtest to inspect P&L candle by candle.' }}
Timeline will appear after a backtest run.

Backtest Positions

Same position layout and leg-level SL semantics as AlgoRun.
StatusContractSideQtyEntryLTP / ExitRiskMTMPts
{{ position.status }}{{ position.is_open ? 'Live' : (position.exit_time || '-') }} {{ backtestPositionLabel(position) }}{{ position.name || position.expiry || '-' }} SELL {{ formatNumber(position.quantity) }}{{ formatNumber(position.lots) }} lots {{ formatPrice(position.entry) }}{{ position.entry_time || '-' }} {{ position.is_open ? formatPrice(position.current) : formatPrice(position.exit) }}{{ position.is_open ? 'Live premium' : (position.exit_reason || 'Closed') }} {{ position.is_open ? (position.sl_display || '-') : 'Exited' }}{{ position.exit_reason || (position.is_open ? 'SL monitor' : '-') }} {{ formatPrice(position.pnl) }} {{ formatPrice(position.pnl_points) }}
Run the backtest to see current positions.

Backtest State

{{ backtest.summary ? 'Complete' : backtest.busy ? 'Running' : 'Ready' }}
Strategy File{{ activeBacktestStrategyProfile?.file_path || 'strategies/' }}
Parity ModeBacktest = AlgoRun
VIX Percentile{{ formatNumber(backtest.anti_churn_vix_percentile) }}%
Trend Efficiency{{ formatNumber(backtest.anti_churn_trend_efficiency) }}%
Selected Candle{{ currentBacktestStep?.date || '-' }} {{ currentBacktestStep?.time || '' }}
Report{{ backtest.lastReport ? 'interactive HTML' : 'not generated' }}

AlgoRun Settings

Live and paper execution controls only.

Live Run

{{ algorun.start_time }} to {{ algorun.end_time }} Candle close SL: {{ formatNumber(algorun.candle_minutes) }}m Forced Entry uses current FUT nearest strike

AlgoRun Strategy

AlgoRun Anti-Churn

Anti-churn score {{ formatNumber(algoRunAntiChurnStatus.score) }}{{ algoRunAntiChurnStatus.action }}Leg SL remains candle-close based

Backtest Settings

Backtest run, replay, report, and strategy controls only.

Backtest Run

{{ backtest.from_date }} to {{ backtest.to_date }} {{ backtest.start_time }} to {{ backtest.end_time }} Workers {{ formatNumber(backtest.parallel_workers) }}

Core Strategy

Milestone Anti-Churn

Anti-churn score {{ formatNumber(backtestAntiChurnStatus.score) }}{{ backtestAntiChurnStatus.action }}Leg SL remains priority 1

Exports & Storage

ReportInteractive HTML
PDFInside report window
TradebookCSV export retained
Saved Runsdata/backtests
Last Report{{ backtest.lastReport?.file_path || 'not generated' }}
Expense FormatBrokerage + Charges
{{ backtest.reportMessage || backtest.saveMessage || 'Generate the report after a completed run. The report page contains the PDF export button.' }}

{{ tab === 'algorun' ? 'AlgoRun Tradebook' : 'Backtest Tradebook' }}

Daily files, CSV export, Brokerage + Charges retained.
TimeLegEntryExitReasonNet P&L
{{ trade.exit_time }}{{ formatNumber(trade.strike) }} {{ trade.side }}{{ formatPrice(trade.entry) }}{{ formatPrice(trade.exit) }}{{ trade.exit_reason }}{{ formatPrice(trade.net_pnl) }}
No closed paper trades yet.
{{ trade.exit_time || trade.entry_time }}{{ trade.position || `${formatNumber(trade.strike)} ${trade.side}` }}{{ formatPrice(trade.entry) }}{{ formatPrice(trade.exit) }}{{ trade.exit_reason || trade.status }}{{ formatPrice(trade.net_pnl) }}
Run the backtest to see tradebook entries.