Private paper-trading workspace

{{ tab === 'algorun' ? 'AlgoRun Terminal' : tab === 'portfolio' ? 'Virtual Portfolio' : 'Backtest Terminal' }}

v{{ appVersion.version }}
{{ marketClockTime }}{{ marketClockDate }} · IST
{{ marketClockSession.label }}
{{ algoFeedHealth.label }} {{ activeAlgoRunStrategyName }} {{ workspaceLabel }} {{ tab === 'portfolio' ? portfolioAccessLabel : backtestPeriodLabel }}
{{ algorunRecovery.error }} Last saved {{ formatIstTime(algorunRecovery.last_saved_at) }}
NIFTY Spot {{ formatPrice(algorunSpotLtp) }} India VIX {{ formatPrice(algorun.vixQuote?.ltp) }}
{{ algorunFutureLabel }} {{ formatPrice(algorun.futureQuote?.ltp) }} Vol {{ formatNumber(algoQuoteVolume(algorun.futureQuote)) }}
FUT - Spot {{ formatPrice(algorunFutureSpotBasis) }}
Basis
Last Closed {{ formatPrice(algorun.lastClosedCandle?.close) }} {{ formatIstTime(algorun.lastClosedCandle?.closed_at) }} · {{ algorun.lastClosedCandle?.timeframe || '-' }}
Entry Gate
{{ formatNumber(algoEntryObjective.milestone_gate ?? algorun.decision?.nearest) }} {{ formatPrice(algoEntryObjective.price) }} · {{ entryObjectiveStatusLabel(algoEntryObjective.status) }}
Open P&L {{ formatPrice(algorunLivePnl) }} {{ formatPrice(algorunLivePoints) }} pts / {{ algorunOpenLegs.length }} open legs
Net Day P&L {{ formatPrice(algorunNetPnl) }}
Realized {{ formatPrice(algorun.realized_pnl) }}Costs {{ formatPrice(algorunExpenses.brokerage) }} + {{ formatPrice(algorunExpenses.charges) }}
Deployed Margin ₹{{ formatPrice(algorunDeployedMargin) }} {{ algorun.margin_estimate?.source === 'UPSTOX_MARGIN_API' ? 'API' : 'Paper' }} · {{ algorunOpenLegs.length }} open
{{ entryObjectiveStatusLabel(algoEntryObjective.status) }}

Entry Objective

{{ activeAlgoRunStrategyName }}

{{ algoEntryObjective.headline }}

{{ algoEntryObjectiveCounts.pass }} pass {{ algoEntryObjectiveCounts.waiting }} waiting {{ algoEntryObjectiveCounts.blocked }} blocked {{ algoEntryObjective.evaluation_trigger }} · {{ formatIstTime(algoEntryObjective.updated_at) }}
{{ condition.label }}{{ entryConditionStatusLabel(condition.status) }}
{{ condition.detail }}
Current{{ entryConditionMetric(condition.current, condition.unit, condition.id) }} Target{{ entryConditionMetric(condition.target, condition.unit, condition.id) }} Delta{{ entryConditionMetric(condition.delta, condition.unit, condition.id) }}

Live Positions

{{ algoEntryAction(position) }}{{ position.side === 'FUT' ? position.name : `${formatNumber(position.strike)} ${position.side}` }}
{{ position.status }}
{{ formatExpiry(position.expiry) }} / {{ position.order_id || position.id || '-' }}
Entry{{ formatPrice(position.entry) }}{{ formatPrice(position.entry_spot) }} FUT
LTP{{ formatPrice(position.current ?? position.exit) }}{{ position.status === 'Open' ? 'Live market tick' : `Exit ${formatIstTime(position.exit_time)}` }}
Lots{{ formatNumber(position.lots) }}Qty {{ formatNumber(position.quantity) }}Est. margin ₹{{ formatPrice(position.estimated_margin) }}
SL
{{ formatPrice(position.rupee_stop_price ?? position.sl) }}{{ algoPositionStopStatus(position) }}
TGT
{{ formatPrice(position.rupee_target_price ?? position.target) }}{{ algoPositionTargetStatus(position) }}
P&L{{ formatPrice(position.pnl) }}{{ formatPrice(position.pnl_points) }} pts
Position Times
Candle open {{ formatIstTime(position.entry_time) }}{{ formatDisplayDate(position.entry_date) }}{{ position.status === 'Open' ? 'Updated' : 'Exit' }} {{ formatIstTime(position.status === 'Open' ? algorun.lastTick : position.exit_time) }}{{ position.status === 'Open' ? 'IST live session' : formatDisplayDate(position.exit_date) }}
Leg OHLC
O {{ formatPrice(algoLegOhlc(position).open) }}H {{ formatPrice(algoLegOhlc(position).high) }}L {{ formatPrice(algoLegOhlc(position).low) }}C {{ formatPrice(algoLegOhlc(position).close) }}
IV{{ formatNumber(algoLegIv(position), { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}{{ algoLegQuote(position).iv ? 'Live IV' : 'Entry IV' }}
Volume{{ formatNumber(algoQuoteVolume(algoLegQuote(position))) }}
{{ position.status === 'Open' ? 'Protective SL' : 'Exit Price' }}{{ formatPrice(position.protective_sl) }}{{ formatPrice(position.exit) }}{{ position.status === 'Open' ? (position.protective_sl_status || 'Server guard') : (position.exit_reason || '-') }}
No open positions.
{{ portfolioRefreshJob?.status === 'queued' ? 'Portfolio update queued' : portfolioQuotesUpdating ? 'Updating portfolio prices in background' : 'Saved portfolio prices ready' }} Saved view {{ formatIstDateTime(portfolioQuoteSnapshotAt) }}
Total Value {{ formatPrice(portfolioViewMetrics.current) }} {{ portfolioViewSubtitle }}
Total P&L {{ formatPrice(portfolioViewMetrics.absolute_return) }} {{ formatNumber(portfolioViewMetrics.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Open P&L {{ formatPrice(portfolioViewMetrics.unrealized_return) }} {{ formatNumber(portfolioViewMetrics.open_return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Closed P&L {{ formatPrice(portfolioViewMetrics.realized_return) }} {{ formatNumber(portfolioViewMetrics.realized_return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%

Filter

Sort

Invested {{ formatPrice(portfolio.invested) }} Current {{ formatPrice(portfolio.current) }}
{{ formatPrice(portfolio.absolute_return) }} {{ formatNumber(portfolio.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Qty. {{ formatNumber(row.quantity) }} EOD {{ formatPrice(row.buy_price) }} · {{ formatDisplayDate(row.source_buy_date || row.buy_date) }}
{{ row.symbol || '-' }} {{ row.stock_name || row.instrument_key || '-' }}
{{ formatNumber(row.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}% {{ formatPrice(row.absolute_return) }}
Invested {{ formatPrice(row.invested) }} LTP {{ formatPrice(row.ltp) }}
SL {{ formatPrice(row.sl_price) }} Target {{ formatPrice(row.target_price) }} {{ row.exit_reason || 'Exit' }} {{ formatPrice(row.exit_price) }} Not taken · {{ row.skip_reason || 'Not allocated' }} Below SL · pending EOD close {{ row.position_status || 'OPEN' }}
No {{ portfolioPositionView === 'open' ? 'open holdings' : portfolioPositionView }} found.
{{ portfolioPositionPnlLabel }} {{ formatPrice(portfolioPositionViewMetrics.absolute_return) }} {{ formatNumber(portfolioPositionViewMetrics.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Total investment{{ formatPrice(portfolioViewMetrics.invested) }}
Current value{{ formatPrice(portfolioViewMetrics.current) }}
Open P&L{{ formatPrice(portfolioViewMetrics.unrealized_return) }}{{ formatNumber(portfolioViewMetrics.open_return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Closed P&L{{ formatPrice(portfolioViewMetrics.realized_return) }}{{ formatNumber(portfolioViewMetrics.realized_return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Net P&L{{ formatPrice(portfolioViewMetrics.absolute_return) }}{{ formatNumber(portfolioViewMetrics.net_return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
{{ portfolioViewTitle }} {{ portfolioViewSubtitle }} {{ portfolioGlobalOverrideActive ? 'Global settings active' : 'Portfolio settings active' }}
Chart
{{ portfolio.description || `${formatNumber(portfolio.count)} holdings` }} {{ formatPrice(portfolio.invested) }} {{ formatPrice(portfolio.current) }} {{ formatPrice(portfolio.absolute_return) }} {{ formatNumber(portfolio.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%
Create a portfolio to view summary.
{{ row.symbol || '-' }}{{ row.stock_name || row.instrument_key || '-' }} {{ formatNumber(row.quantity) }} {{ formatPrice(row.buy_price) }}{{ formatDisplayDate(row.source_buy_date || row.buy_date) }} {{ formatPrice(row.ltp) }} {{ formatPrice(row.invested) }} {{ formatPrice(row.current) }} {{ formatPrice(row.absolute_return) }} {{ formatNumber(row.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}% {{ formatNumber(row.volume) }} {{ row.portfolio_description }} {{ row.sl_enabled ? formatPrice(row.sl_price) : '-' }}{{ row.sl_type }} {{ formatNumber(row.sl_value) }} {{ row.target_enabled ? formatPrice(row.target_price) : '-' }}{{ row.target_type }} {{ formatNumber(row.target_value) }} {{ row.position_status || 'OPEN' }}{{ row.exit_reason || 'Exit' }} {{ formatPrice(row.exit_price) }} / {{ formatDisplayDate(row.exit_date) }}{{ row.skip_reason || 'Not allocated' }}
No {{ portfolioPositionView === 'open' ? 'open holdings' : portfolioPositionView }} in this view.
Total {{ formatPrice(portfolioPositionViewMetrics.invested) }} {{ formatPrice(portfolioPositionViewMetrics.current) }} {{ formatPrice(portfolioPositionViewMetrics.absolute_return) }} {{ formatNumber(portfolioPositionViewMetrics.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%

Simulation Settings

{{ portfolioDateLabel(activePortfolio) }}
Global Override{{ portfolioSettingsDraft.enabled ? 'Authoritative for every portfolio' : 'Portfolio settings remain authoritative' }}
Global Override is activeThese values are saved as this portfolio's fallback profile.
AllocationCapital and quantity method
ExitEvaluation and price rules
{{ portfolioSettingsScope === 'global' ? 'Recalculates all portfolios' : portfolioGlobalOverrideActive ? 'Saves fallback profile' : 'Recalculates this portfolio' }}

{{ portfolioManageMode === 'create' ? 'New Portfolio' : `Source Rows · ${portfolioDateLabel(portfolioDraft)}` }}

Date and EOD price source
Capital{{ formatPrice(portfolioDraft.allocation_total) }}{{ portfolioDraft.allocation_system || 'hybrid' }} allocation
Base Capital{{ formatPrice(portfolioDraft.allocation_total) }}Manual Extension{{ formatPrice(portfolioDraft.manual_extension) }}Allocated{{ formatPrice(portfolioDraftAllocated) }}Rows{{ portfolioDraftSummary.manual_count }} manual / {{ portfolioDraftSummary.auto_count }} auto / {{ portfolioDraftSummary.skipped_count || 0 }} skipped Virtual EOD close after 15:35 IST. No broker order is placed.

Source Holdings

{{ portfolioDraft.items.length }} dated EOD rows
Manual quantities remain locked during allocation.
ScripSource DateEOD PriceQtyInvestedAllocationStatusActions
{{ row.symbol || row.stock_name || '-' }}{{ row.stock_name || row.instrument_key || 'Not mapped' }}
{{ row.position_status || 'OPEN' }}{{ row.exit_reason }} @ {{ formatPrice(row.exit_price) }}{{ row.skip_reason }}{{ row.draft_error }}
Drop a CSV or search for a scrip to build this portfolio.
{{ row.symbol || row.stock_name }}{{ row.stock_name || row.instrument_key }}
{{ row.position_status || 'OPEN' }}
{{ row.draft_error }}

Read-Only Watch Mode

Portfolio management requires super-admin login.

{{ portfolioDateLabel(portfolioSummaryChartData.portfolio) || 'Portfolio Summary' }}

EOD portfolio value since creation date
Invested{{ formatPrice(portfolioSummaryChartData.portfolio?.invested) }}
Highest Return{{ formatNumber(portfolioSummaryChartData.highest?.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%{{ formatDisplayDate(portfolioSummaryChartData.highest?.date) }}
Lowest Return{{ formatNumber(portfolioSummaryChartData.lowest?.return_percent, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%{{ formatDisplayDate(portfolioSummaryChartData.lowest?.date) }}
EOD Points{{ formatNumber(portfolioSummaryChartData.points?.length || 0) }}
Fetching EOD candles and building portfolio curve...
No EOD portfolio values available yet.
{{ error }}
Gross P&L{{ formatPrice(backtest.summary?.total_pnl) }}Before charges
Charges{{ formatPrice(backtest.summary?.total_charges) }}Brokerage + statutory charges
Net P&L{{ formatPrice(backtest.summary?.net_pnl ?? backtest.summary?.total_pnl) }}After all charges
Win Rate{{ formatNumber(backtest.summary?.win_rate, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }}%{{ formatNumber(backtest.summary?.wins) }} / {{ formatNumber(backtest.summary?.losses) }}
Trades / Lots{{ formatNumber(backtest.summary?.trade_groups ?? backtest.summary?.trades) }} / {{ formatNumber(backtest.summary?.lots_traded) }}{{ formatNumber(backtest.summary?.contracts_traded) }} contracts across {{ formatNumber(backtest.summary?.leg_trades) }} legs
{{ backtestProgressLabel }} {{ backtestProgressMeta }}

Final Position State

Leg-level execution state at the end of the returned Backtest session.
StatusContractSideQtyEntryLTP / ExitRiskMTMPts
{{ position.status }}{{ position.is_open ? 'Live' : formatIstTime(position.exit_time) }} {{ backtestPositionLabel(position) }}{{ position.name || formatExpiry(position.expiry) }} {{ algoEntryAction(position) }} {{ formatNumber(position.quantity) }}{{ formatNumber(position.lots) }} lots {{ formatPrice(position.entry) }}{{ formatIstTime(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) }}
{{ backtest.summary ? 'No position records were returned for this run.' : 'Run the backtest to see position output.' }}

Day-by-Day P&L

Select a date to inspect its complete leg-level tradebook or recorded skip reason.
{{ formatNumber(backtestDailyRows.length) }} requested days
{{ month.label }}
SMTWTFS
LossProfit
Date{{ formatDisplayDate(backtestSelectedDaily.date) }}{{ backtestSelectedDaily.status }}
Gross P&L{{ formatPrice(backtestSelectedDaily.gross_pnl) }}
Brokerage + Charges{{ formatPrice(backtestSelectedDaily.brokerage) }} + {{ formatPrice(backtestSelectedDaily.charges) }}{{ formatPrice(backtestSelectedDaily.total_cost) }} total
Net P&L{{ formatPrice(backtestSelectedDaily.net_pnl) }}
{{ backtestSelectedDaily.status === 'SKIPPED' ? 'Day skipped' : 'No trade opened' }}{{ backtestSelectedDaily.skip_reason || 'The engine did not record a reason.' }}
ContractActionCandle OpenExit TimeEntryExitBrokerage + ChargesGross P&LNet P&L
{{ trade.name || `${formatNumber(trade.strike)} ${trade.side || ''}` }}{{ formatExpiry(trade.expiry) }} {{ String(trade.trade_side || '').toUpperCase() === 'LONG' ? 'BUY' : 'SELL' }} {{ trade.side || '' }}{{ trade.exit_reason || '-' }} {{ formatIstTime(trade.entry_time) }}{{ formatIstTime(trade.exit_time) }} {{ formatPrice(trade.entry) }}{{ formatPrice(trade.exit) }} {{ backtestExpenseBreakdown(trade).text }}{{ formatPrice(backtestExpenseBreakdown(trade).total) }} total {{ formatPrice(trade.pnl) }} {{ formatPrice(trade.net_pnl) }}
{{ backtest.summary?.no_trade_reason || 'The engine completed this date without opening a trade.' }}
Run the backtest to see daily P&L and skip diagnostics.

Saved Backtests

Load a stored run with its exact strategy settings and result.
{{ run.name }}{{ run.strategy_label || run.strategy }} · {{ formatDisplayDate(run.from_date) }} to {{ formatDisplayDate(run.to_date) }}{{ formatIstDateTime(run.saved_at) }} · {{ formatNumber(run.trades) }} trades
{{ formatPrice(run.net_pnl) }}
No saved Backtests are available.
{{ backtest.saveMessage }}

AlgoRun Settings

Live and paper execution controls only.

Live Run

{{ algorun.start_time }} to {{ algorun.end_time }} Candle close SL: {{ isPriceMilestoneStrategy(algorun) ? `${formatNumber(algorun.candle_seconds)}s` : `${formatNumber(algorun.candle_minutes)}m` }} {{ algorun.auto_entry_enabled ? 'Auto entry armed' : 'Auto entry disabled' }} Forced Entry respects configured CE / PE strikes

AlgoRun Strategy

Trade Instrument

Select the traded instrument before configuring option-specific fields.

Market InstrumentNIFTY
InstrumentNIFTY weekly options

Expiry

Select the futures month and option expiry independently.

{{ day.slice(0, 3) }} {{ formatExpiry(optionExpiryPlanDate(algorun, day)) }}
Trading today{{ formatExpiry(algorun.option_expiry_resolved_date || optionExpiryPlanDate(algorun) || algorun.optionExpiry) }}{{ optionExpiryChoiceLabel(algorun.option_expiry_resolved_cycle || algorun.option_expiry_week_cycle) }}

Stop Loss & Target

Choose the risk unit explicitly. Rupee limits are converted from actual entry price and traded quantity.

Option Strikes

Select CE and PE moneyness independently. Distance counts available option strikes from ATM.

1

Entry

Set the milestone gate, position direction, timing, and trade size.

Entry filters
2

Stop Loss

Define the fixed per-leg risk while both legs remain open.

Remaining-leg trailing and emergency protection
3

Rollover & Regime Guard

Use SuperTrend and previous-session pivots to suppress sideways re-entry churn.

SuperTrend and pivot rules
Adaptive anti-churn tuning
1

Entry

Choose the market reference, entry window, and repeat-entry limits.

Entry filters
2

Stop Loss

Fixed risk is checked on the configured completed candle.

Trailing and emergency protection
3

Target

Select whether each leg exits by underlying movement, premium movement, or milestone rollover.

Next milestone closes the straddle and permits rollover. Point and percentage targets close the qualifying leg independently.

1

Market & Entry

{{ isOrbDirectionalStrategy(algorun) ? 'ORB locks the opening range before evaluating its selected breakout model.' : isPriceMsDirectionalStrategy(algorun) ? 'Capture a milestone first; enter only after a completed-close threshold and SuperTrend confirmation.' : "STOT evaluates completed NIFTY candles against the previous session's R1 and S1." }}

2

{{ isPriceMsDirectionalStrategy(algorun) ? 'The threshold close and SuperTrend direction must agree.' : 'Green above R1 permits bullish entry; red below S1 permits bearish entry.' }}

2

Model & Exit

Only controls used by the selected ORB model are shown.

3

Protection

The fixed SL needs completed option-candle closes. The 25% protective stop and active TSL remain immediate.

25% protective stopMandatory server guard is armed and recorded before the directional option becomes active.
Daily Pivot unavailable: {{ algoIndicatorSnapshot.pivots.error }}
1

Execution

Express each confirmed direction through FUT or options.

Validated 5mStrict confirmations · both directions · one trade group per day
2

Signal

Trend, strength, volatility, volume, swing, and pivot-space filters.

3

Risk & Exit

Underlying stop, trailing, and daily risk limits.

4

Session

Completed-candle trading window.

1

Signal & Execution

Configure market direction and execution behavior after choosing the signal and trade instruments above.

2

Crossover Model

Three EMAs with ATR-normalized noise rejection.

3

Exit Model

Structural risk plus one explicit profit-exit rule.

Live TSL Cycle250 ms
4

Session Risk

Reverse crossover and square-off remain mandatory. Every exit starts the same re-entry cooldown.

Pivot SourceCurrent Expiry NIFTY FUT
Traditional daily pivots · {{ formatNumber(algorun.pivot_history_sets) }} sets retained Depth S{{ formatNumber(algorun.pivot_level_depth) }}-R{{ formatNumber(algorun.pivot_level_depth) }} · midpoints {{ algorun.pivot_include_midpoints ? 'on' : 'off' }} {{ algorun.underlying_source === 'SPOT' ? 'Spot' : 'FUT' }} entry: milestone +/- tolerance SL: entry {{ algorun.underlying_source === 'SPOT' ? 'Spot' : 'FUT' }} +/- {{ formatNumber(algorun.sl_points) }} pts Upside trigger closes {{ algorun.position_side === 'LONG' ? 'PE' : 'CE' }} Downside trigger closes {{ algorun.position_side === 'LONG' ? 'CE' : 'PE' }} {{ algorun.trailing_sl_enabled ? 'Remaining leg uses option TSL' : 'Remaining leg keeps underlying SL' }} TSL: activate {{ formatNumber(algorun.trailing_activation_points) }} pts, trail {{ formatNumber(algorun.trailing_distance_points) }} pts, lock {{ formatNumber(algorun.trailing_lock_points) }} pts Max {{ formatNumber(algorun.anti_churn_max_reentries) }} re-entries, {{ formatNumber(algorun.anti_churn_cooldown_minutes) }}m cool-off Rollover at every new milestone
{{ algorun.underlying_source === 'SPOT' ? 'NIFTY Spot' : 'NIFTY Current FUT' }} entry · {{ formatNumber(algorun.step) }} pt milestones SL: {{ algorun.sl_mode === 'FUT' ? `${formatNumber(algorun.sl_points)} underlying points` : `${formatNumber(algorun.sl_points)}% option LTP` }} Target: {{ algorun.target_mode === 'NEXT_MILESTONE' ? 'next milestone rollover' : algorun.target_mode === 'UNDERLYING_POINTS' ? `${formatNumber(algorun.target_value)} underlying points` : `${formatNumber(algorun.target_value)}% option LTP` }}

Market Levels

EMA and SuperTrend share the selected trend candle size. RSI and ADX remain independent. Opening VWAP uses the current {{ algorunFutureLabel }}; Traditional Pivot and CPR remain daily.

1Data SourceEnable levels and select one underlying.
2Trend Candle Size{{ isStotTradeStrategy(algorun) ? `EMA display only; SuperTrend follows STOT ${algorun.candle_minutes}m candles.` : 'Controls EMA and SuperTrend calculations.' }}
3RSISelect RSI candle size and lookback independently.
4ADXTrend strength from completed candles, with directional indices.
5EMA PeriodsChoose a preset or tune up to three periods.
6Reference LevelsVWAP is fixed to current FUT; choose visible daily Pivot depth.

Backtest Settings

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

Backtest Run

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

Core Strategy

Trade Instrument

Select the traded instrument before configuring option-specific fields.

Market InstrumentNIFTY
InstrumentNIFTY weekly options

Expiry

Select the futures month and option expiry independently.

Option Strikes

Select CE and PE moneyness independently. Distance counts available option strikes from ATM.

1

Entry

Replay the same milestone gate, timing, and position sizing used by AlgoRun.

Entry filters
2

Stop Loss

Define the fixed per-leg risk while both legs remain open.

Remaining-leg trailing and emergency protection
3

Rollover & Regime Guard

Replay the same SuperTrend and pivot anti-churn permission used by AlgoRun.

SuperTrend and pivot rules
Adaptive anti-churn tuning
1

Entry

Define the same entry gate and timing contract used by AlgoRun.

Entry filters
2

Stop Loss

Choose index-point risk or a percentage of each option's entry premium.

Trailing and emergency protection
3

Target

Use the same per-leg target contract during replay and live execution.

Next milestone closes the straddle and permits rollover. Point and percentage targets close the qualifying leg independently.

1

Market & Entry

{{ isOrbDirectionalStrategy(backtest) ? 'ORB locks the opening range before evaluating its selected breakout model.' : isPriceMsDirectionalStrategy(backtest) ? 'Capture a milestone first; enter only after a completed-close threshold and SuperTrend confirmation.' : "STOT evaluates completed NIFTY candles against the previous session's R1 and S1." }}

2

{{ isPriceMsDirectionalStrategy(backtest) ? 'The threshold close and SuperTrend direction must agree.' : 'Green above R1 permits bullish entry; red below S1 permits bearish entry.' }}

2

Model & Exit

Only controls used by the selected ORB model are shown.

3

Protection

The fixed SL needs completed option-candle closes. The 25% protective stop and active TSL remain immediate.

25% protective stopMandatory catastrophe protection is evaluated before the configurable fixed stop and TSL.
1

Execution

Express each confirmed direction through FUT or options.

Validated 5mStrict confirmations · both directions · one trade group per day
2

Signal

Trend, strength, volatility, volume, swing, and pivot-space filters.

3

Risk & Exit

Underlying stop, trailing, and daily risk limits.

4

Session

Completed-candle trading window.

1

Signal & Execution

Configure market direction and execution behavior after choosing the signal and trade instruments above.

2

Crossover Model

Three EMAs with ATR-normalized noise rejection.

3

Exit Model

Structural risk plus one explicit profit-exit rule.

4

Session Risk

Reverse crossover and square-off remain mandatory. Every exit starts the same re-entry cooldown.

Pivot SourceCurrent Expiry NIFTY FUT
Live: {{ isPriceMilestoneStrategy(backtest) && !backtest.trailing_sl_enabled ? 'underlying fixed SL retained' : `quote-driven TSL, default ${formatNumber(backtest.trailing_update_ms)}ms` }}Backtest: deterministic option OHLC simulationIntracandle tick order cannot be reconstructed from 1m candles
{{ backtest.underlying_source === 'SPOT' ? 'NIFTY Spot signal' : 'NIFTY current FUT' }} · {{ formatNumber(backtest.candle_minutes) }}m candles SL: {{ backtest.ema_stop_mode === 'CANDLE_EXTREME' ? 'previous 3 completed candles' : `${formatNumber(backtest.ema_stop_points)} underlying points` }} Exit: {{ backtest.ema_exit_mode === 'REVERSE_CROSS' ? 'confirmed reverse cross' : backtest.ema_exit_mode === 'MIN_TRAIL' ? 'minimum profit + point TSL' : backtest.ema_exit_mode === 'FIXED_TARGET' ? `${formatNumber(backtest.ema_target_points)} point target` : 'initial SL / square-off' }}
Traditional daily pivots · {{ formatNumber(backtest.pivot_history_sets) }} sets retained Depth S{{ formatNumber(backtest.pivot_level_depth) }}-R{{ formatNumber(backtest.pivot_level_depth) }} · midpoints {{ backtest.pivot_include_midpoints ? 'on' : 'off' }} {{ backtest.underlying_source === 'SPOT' ? 'Spot' : 'FUT' }} entry: milestone +/- tolerance SL: entry {{ backtest.underlying_source === 'SPOT' ? 'Spot' : 'FUT' }} +/- {{ formatNumber(backtest.sl_points) }} pts Upside trigger closes {{ backtest.position_side === 'LONG' ? 'PE' : 'CE' }} Downside trigger closes {{ backtest.position_side === 'LONG' ? 'CE' : 'PE' }} {{ backtest.trailing_sl_enabled ? 'Remaining leg uses option TSL' : 'Remaining leg keeps underlying SL' }} TSL: activate {{ formatNumber(backtest.trailing_activation_points) }} pts, trail {{ formatNumber(backtest.trailing_distance_points) }} pts, lock {{ formatNumber(backtest.trailing_lock_points) }} pts Max {{ formatNumber(backtest.anti_churn_max_reentries) }} re-entries, {{ formatNumber(backtest.anti_churn_cooldown_minutes) }}m cool-off Rollover at every new milestone
{{ backtest.underlying_source === 'SPOT' ? 'NIFTY Spot' : 'NIFTY Current FUT' }} entry · {{ formatNumber(backtest.step) }} pt milestones SL: {{ backtest.sl_mode === 'FUT' ? `${formatNumber(backtest.sl_points)} underlying points` : `${formatNumber(backtest.sl_points)}% option LTP` }} Target: {{ backtest.target_mode === 'NEXT_MILESTONE' ? 'next milestone rollover' : backtest.target_mode === 'UNDERLYING_POINTS' ? `${formatNumber(backtest.target_value)} underlying points` : `${formatNumber(backtest.target_value)}% option LTP` }}

Monte Carlo Risk Analysis

Moving-block simulation

Resample complete daily net P&L blocks after deterministic replay. Same-day option legs remain together.

Daily net P&L samplingSeeded and reproducibleHistorical resampling is not a forecast

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.' }}

{{ betaEmbedded ? 'Live Position Risk' : 'Live Position SL' }}

{{ algoStopEditor.label }} · {{ algoStopEditor.order_id }}
Option LTP{{ formatPrice(algoStopEditor.option_ltp) }}
{{ algorun.underlying_source === 'SPOT' ? 'NIFTY Spot' : algorunFutureLabel }}{{ formatPrice(algoStopEditor.underlying_ltp) }}
This changes only the selected open position. Server risk limits and the protective disaster SL remain active.
{{ algoStopEditor.error }}

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

Daily trades and monthly realized P&L with Brokerage + Charges retained.
Loading saved workspace tradebook...
{{ algorunTradebookArchive.error }}
Calculating monthly workspace P&L...
{{ algorunTradebookArchive.monthlyError }}
Candle OpenExit TimeOrderLegQtyEntryExitReasonNet P&L
{{ formatIstTime(trade.entry_time) }}{{ formatIstTime(trade.exit_time) }}{{ trade.order_id || trade.id || '-' }}{{ algoEntryAction(trade) }} {{ formatNumber(trade.strike) }} {{ trade.side }}{{ formatNumber(trade.quantity) }}{{ formatNumber(trade.lots) }} lots{{ formatPrice(trade.entry) }}{{ formatPrice(trade.exit) }}{{ trade.exit_reason }}{{ formatPrice(trade.net_pnl) }}
No saved paper trades for this date.
{{ formatIstTime(trade.entry_time) }}{{ formatIstTime(trade.exit_time) }}{{ trade.id || '-' }}{{ trade.position || `${formatNumber(trade.strike)} ${trade.side}` }}{{ formatNumber(trade.quantity) }}{{ formatNumber(trade.lots) }} lots{{ formatPrice(trade.entry) }}{{ formatPrice(trade.exit) }}{{ trade.exit_reason || trade.status }}{{ formatPrice(trade.net_pnl) }}
Run the backtest to see tradebook entries.