Strategy Configuration & Usage
Building a new strategy? Assemble it from blocks in the Strategy Composer (
/strategy-composer) — no code required.Scanning the option chain, not running a strategy? The Option Scanner (
/option-scanner) is a separate, read-only research tool — no position or strategy needed.
Dashboard Overview
The Dashboard (/) is the main control panel. It lists every runnable strategy and provides controls for each. Archived strategies (see below) are hidden from this list; they live in the collapsed Archived panel underneath it.
Two filters sit to the right of the Strategies heading: a Mode dropdown (All / Paper / Real) and an Auto on only switch that hides every strategy whose Automation switch is off. They combine — Mode Real + Auto on only shows just the strategies that will actually place live orders today. Both remember your choice in the browser across reloads.
Live leg prices on the Dashboard only refresh during market hours; outside them the page shows no live prices and makes no broker calls.
Nifty Ticker
The NIFTY badge in the top navbar (every page, not just the Dashboard) shows the live Nifty 50 LTP next to a ▲/▼ indicator for up/down against the previous trading day's close — colorblind-safe by design, the glyph carries the direction, green/red is a second cue rather than the only one.
Click the badge to open today's 1-minute candle chart in a modal — same floating-bar OHLC style as a strategy's Live Chart. It loads once on open rather than polling, covers 9:15 AM onward for the current trading day, and shows a reason in place of the chart outside market hours or when no broker session is available. See Data Sources for where the underlying LTP/candle data comes from.
Managing Strategies
Edit a Strategy
Open ⋮ → Edit in Composer on any strategy row to open its configuration in the Strategy Composer. Modify and save there.
Clone a Strategy
Open ⋮ → Clone, give it a new file name and display name. The clone always starts disabled, in Paper mode, with the source's params carried over — so you can safely tweak a copy without touching the strategy that's actually running.
Archive a Strategy
Open ⋮ → 🗄 Archive Strategy to take a strategy out of the active dashboard list without deleting it — useful for strategies you're not running right now but don't want to lose the code/config for.
- The strategy must be off (Automation), have no open position, and have no PositionEngine currently running for it — archiving refuses with an error otherwise. (The engine check only ever fires for a strategy on the persistent PositionEngine path — see Engine status below; every other strategy has no engine to check.)
- Archiving disarms it (if armed) and removes any scheduled jobs for it.
- The file and its metadata (params, mode, broker) are kept as-is, just hidden from the main list.
Archived strategies live in the Archived (N) panel below the strategy grid. From there:
- Restore — un-archives it back into the active list (still disabled; re-enable and re-schedule it manually).
- ✕ Delete Permanently — same destructive delete as below, for archived strategies you actually want gone.
Delete a Strategy
Open ⋮ → ✕ Delete Strategy (available on both active and archived strategies). The file is removed from strategies/ and its metadata is cleared — this cannot be undone. If you just want it out of the way but might come back to it, Archive instead.
Refuses with an error if the strategy has an open position or a PositionEngine currently running — same two checks as Archive above, so deleting can't silently orphan a live position or leave an engine process running against a spec file that no longer exists. Unlike Archive, deleting does not require Automation to be off first — there's nothing an enabled-but-otherwise-idle strategy could orphan, and disarming/unscheduling happens automatically as part of the delete.
Strategy Controls (per row)
Each strategy card has two independent controls: Automation (is it scheduled?) and Money mode (Paper or Real?). Together they cover every real workflow — including running the schedule in Paper mode to validate a strategy for a few days before ever risking money.
Automation Switch
The toggle switch at the far right of the card header.
| State | Effect |
|---|---|
| On | Creates the strategy's entry + monitor jobs (see Scheduling) and lets them fire |
| Off | Removes those scheduled jobs entirely |
Turning it off while a Real strategy has an open position asks for confirmation first — pausing automation stops exit monitoring, and you'll need to manage that position manually.
Money Mode (Paper / Real)
The Paper / Real buttons in the card header. Switching to Real is the arm action — there's no separate arm step.
| Mode | What happens |
|---|---|
| Paper | Strategy logic runs, prices are fetched, decisions are made — but no Kite orders are placed. P&L is tracked on paper. |
| Real | Confirms today's P&L, then arms the strategy and places live market orders at market price (NRML product) via that strategy's configured broker (Kite, Breeze, or Dhan — see the broker dropdown on the card) on every subsequent run — manual or scheduled. |
Switching a Real strategy with an open position back to Paper asks for confirmation first, for the same reason as Automation-off above. The mode takes effect immediately — no rescheduling needed.
Always validate a strategy with Scheduled + Paper for a few trading days, review the results on the Performance page, then switch to Real.
⚠ Re-arm — if a strategy is Real but shows this link instead of a plain Real badge, it's been auto-disarmed by the daily loss-limit circuit breaker (or a manual disarm via the API) without being switched back to Paper. Click it to re-confirm and resume live trading.
Config (Lots & Monitor Interval)
Open ⋮ → Config to open the strategy parameter modal.
Lots — the number of lots to trade per run.
| Lots | NIFTY units | Approx capital at ₹5 net debit |
|---|---|---|
| 1 | 65 | ₹325 |
| 3 | 195 | ₹975 |
| 5 | 325 | ₹1,625 |
| 10 | 650 | ₹3,250 |
Monitor Interval — how frequently the monitor runs, in minutes. Applies to both:
- Fullday simulation — controls the number of ticks replayed between 10:00 and 15:20
- Real-time scheduled jobs — sets the cron frequency of the monitor job
| Interval | Ticks per day (10:00–15:20) |
|---|---|
| 1 min | 320 |
| 5 min | 64 |
| 10 min | 32 |
| 15 min | 21 |
| 30 min | 11 |
Available options: 1, 2, 3, 5, 10, 15, 30 minutes. Only intervals that divide 60 evenly are offered, since the real-time cron expression */N resets at each hour boundary.
For a strategy on the (opt-in, off-by-default) persistent PositionEngine path — see Engine status below — this interval no longer sets how often price is checked (the engine reacts within ~1 second of a tick, independent of this value); it becomes how often the scheduler checks that the engine is still alive and ticking.
Click Save. Both values are stored in strategies/metadata.json and injected into every subsequent run — manual, simulated, and scheduled. If the strategy is currently Scheduled, saving also replaces its jobs with the updated interval/entry-time — no need to re-schedule by hand.
Running a Strategy
Trade Status
A compact status line appears below the parameter row for each strategy whenever a trade state file exists.
| Indicator | Meaning |
|---|---|
| ● LIVE ACTIVE | Live trade is open, short legs running |
| ◑ LIVE SHORT CLOSED | Short legs exited; long legs still open. This is the only order it happens in — the engine always closes short legs before (or alongside) the long legs, force-closing a still-open short if the long's own exit fires first. Closing the long leg first would spike margin, since it's usually what's hedging the short's requirement. |
| ○ LIVE CLOSED | Trade fully closed |
| SIM … | Same states but for the simulation state file |
Click Details on the status line to open the Trade Status modal, which shows:
- Full leg table (symbol, entry price, delta, IV)
- ATM, net debit, profit target level, stop-loss level
- Exit type and P&L (if applicable)
- Live Chart — today's 1-minute candles for the open position (see below)
Engine status (advanced, opt-in — off by default)
For a strategy whose broker has opted into the persistent PositionEngine — a
Position Engine switch per broker on the Settings page, off by
default, not yet rolled out to any broker; stored as brokers.<broker>.position_engine
in config.json — an Engine line appears above the leg table:
| Indicator | Meaning |
|---|---|
| ● Engine running | The persistent engine is up and ticking normally. |
| ◐ Engine stuck — restart recommended | It's running but hasn't ticked recently; the scheduler's own supervisor will restart it on its next check, or use the button below to do it now. |
| ○ Engine not running | Nothing is currently running for this strategy — the scheduler will start one on its next check. |
This line is absent entirely for every other strategy (paper mode, or a broker that hasn't opted in) — those still run on the original spawn-per-tick model, with no separate process to show status for.
🔄 Restart Position Engine (⋮ More menu, only shown when the line above is) kills and immediately restarts the engine — useful if it's stuck, or just to force a config/param change to apply right away instead of waiting for it to happen automatically (see below). It does not touch the recorded trade.
Saving strategy config (the Config modal's params, or a composer spec edit) resets an already-running engine for you automatically the moment you save — if one is running, you'll be asked to confirm first, since the position briefly stops being polled while the engine restarts.
Exit Confirm Window (sec) — a Config modal field, same as Lots/Monitor Interval. Only meaningful for a strategy on the persistent PositionEngine path above (a no-op otherwise): how long a price-driven exit (stop-loss, target, delta-stop, iv-stop) has to hold continuously before it's acted on, so a single noisy tick can't trigger a real close. Defaults to 3 seconds if you never touch it. EOD/time-based exits and the daily loss-limit breaker aren't affected — neither depends on a single live tick.
Leg prices and P&L update the instant a new broker tick arrives — while
the WS tick cache (brokers.kite.ws_ticks /
brokers.breeze.ws_ticks in config.json) is running, the open modal holds a
live stream straight from it. If the tick cache is off, not running, or goes
quiet, prices just fall back to the modal's regular 5-second refresh instead —
there's no separate setting to turn on.
A leg with no live tick at all can sit on a frozen last price for minutes while the broker's own order book keeps moving. For a leg in that state, the modal fetches the broker's current bid/offer and shows it alongside the frozen price as a "(book mid ₹…)" tag — hover it for the underlying bid/ask. This is display-only: it doesn't change the P&L figure, which still uses the existing price.
Live Chart
The Trade Status modal's status/P&L table and chart refresh every 5 seconds while it's open (prices update faster than that via the tick stream above). The chart appears only while the strategy has an open position on a trading day and automation is switched on — candles are fetched only for the strategy whose modal is open, so having many strategies on the dashboard costs nothing extra.
Use the dropdown to switch between:
-
Combined P&L (pts) — the signed sum across all open legs, drawn as a line against a dashed zero baseline. It is deliberately not a candle: the legs' highs don't occur at the same instant, so a summed high/low would be a price the position never actually printed.
-
One leg — real open/high/low/close candles for that option contract.
Illiquid legs. A deep-ITM or thinly traded strike doesn't print a candle every minute. Within the day that's handled by carrying the leg's last price forward, so the combined line stays continuous. But a leg that never prints at all is different: it appears in the dropdown as (no candle data) and the combined view is hidden rather than drawn, because summing only the legs that did trade produces a confident wrong P&L, not an approximate one. The per-leg views for the remaining legs still work. If you need the position's true P&L in that situation, read the Total P&L figure above the chart — it is computed from live LTP and does not depend on candle history.
If the chart is replaced by a short message instead, that is expected in any of these cases: automation is off, it isn't a trading day, there's no open position, or the broker can't serve candles. The last one is worth knowing per broker — Kite serves intraday candles normally, Breeze works but is slow, and Dhan requires a separate Data API subscription on their side, without which no candles are returned at all.
Modal actions
The footer keeps only the action that fits the trade's current state — Close Long Legs @ 15:20 when the short legs have exited, Preview Entry (and Place Entry Now once a preview comes back READY) otherwise. Everything rare or corrective sits under the ⋮ More menu:
| Menu item | What it does |
|---|---|
| 🔔 Send update | Sends the trade summary to every notification channel you have configured — email, Telegram, and/or webhook. Configure them under Settings; see setup.md. |
| ⚙ Preview params… | Scratch leg-selector overrides applied to the next preview only. Never used by a real entry. |
| Manual Entry… | Record a position you already opened directly at the broker. No order is placed. |
| Mark Exited (Manual)… | Record an exit you already did at the broker, at prices you enter. No order is placed. Leave a leg blank to keep it open — closing just the short legs moves the trade to SHORT_CLOSED instead of CLOSED. Each leg row also has a Close Now button that places a real MARKET order for that one leg only, instead of just recording a price. |
| Edit Trade State… | Correct a mistake in the recorded trade — wrong price, symbol, or strike. If the trade shows ENTRY REJECTED — rolled back but the broker actually has the legs open (a rare fill-confirmation race), a Confirm Active (broker-verified) button appears — it re-checks broker.positions() for every rejected leg itself before changing anything, and changes nothing if any leg doesn't match. |
| ▶ Resume Automation… | Only shown while the strategy is under manual control (a partial manual close via Mark Exited / Square Off left some legs parked and handed the rest to you — see below). Re-checks the parked legs against broker.positions() first; if any leg doesn't match, nothing changes. Once confirmed, autopilot resumes immediately and may place a new entry on the very next tick. |
| 🔄 Restart Position Engine | Only shown for a strategy on the (opt-in, off-by-default) persistent PositionEngine path — see Engine status above. Kills and immediately restarts the engine process; the recorded trade is untouched. |
| ⚠ Reset Live State / ⚠ Reset Sim State | Delete the state file so a fresh entry can run. Confirmation dialog first; cannot be undone. |
Reset Live State before starting a new week if the previous trade closed cleanly, or if you want to force a fresh entry during testing.
When to use which recovery tool — for the full map of order failures (rejected entries, closes that don't confirm, partial fills, the retry cap) and which of these actions each one calls for, see Order Placement & Failure Recovery.
Manual takeover
Closing only some of a trade's legs — via Close Now on one leg, via Sq Off scoped to a leg (the strategy card's Sq Off button always closes everything currently open; a single-leg close is only available from the per-leg Close Now button above), or by leaving some rows blank in Mark Exited (Manual) — puts the whole strategy into manual control: it shows a ✋ MANUAL badge, and autopilot stops touching it entirely (no exits, no adjustments, no re-entry) until every remaining leg is closed, by hand or automatically. It resumes on its own the moment the position is fully flat — nothing to re-arm.
If you want autopilot back before the position is fully flat — e.g. a diagonal's short legs closed by hand and you want the automated short re-entry to run today rather than wait — use ▶ Resume Automation… (Corrections menu) instead of hand-editing state. It won't clear manual control on its own say-so: it re-checks the parked legs against broker.positions() first and refuses if anything doesn't match.
Manual Run
Click Run. The strategy executes immediately as a subprocess using the current mode and configured lots. A popup shows the return code, stdout, and stderr when it finishes.
Useful for on-demand testing or triggering a monitor check manually.
Simulate
Click Simulate to open the simulation modal. Simulations always run in paper mode regardless of the mode setting — no real orders are placed. Historical candle data is fetched from the broker selected in the modal's Broker dropdown (defaults to the strategy's own configured broker).
Date — any past trading day (Monday–Friday, market open). Click + End date to sweep a range instead of a single day.
Choosing a broker for simulations
All three brokers give the same thing here — real OHLC + volume candles — nothing more. None of them return implied volatility, open interest, Greeks, or bid/ask history through this app's simulation path, whatever their raw APIs otherwise advertise.
| Broker | What you actually get | Best for |
|---|---|---|
| Breeze | Real candles for the exact strike/expiry, retained well beyond a week — details | Older/multi-day sims. Default for Multi-Day Sim. |
| Kite | Real candles, but only while the exact contract is still in Kite's instruments master (~7 days after expiry) — details | Recent sims (current or last week's expiry). |
| Dhan | Real candles while listed; for anything expired, a spot-relative synthetic series (ATM±N, re-resolved per day) — an approximation, not that strike's real price history. Needs a separate Data API subscription. | Quick checks when Breeze/Kite have nothing, with the approximation kept in mind. |
Data availability check
Whenever the date, broker, or end date changes — and once as soon as the modal opens — the selected broker is probed for the data the run will actually need, and one of three verdicts appears before you commit to the run. This applies to single-day and date-range simulations alike; a single day is just a range where both ends are the same date.
| Verdict | Meaning |
|---|---|
| ✓ Data available | Every trading day has index data, and ATM option candles were found on all sampled days. |
| ⚠ Partial data | Some days are missing index data, or option candles are missing on some sampled days. Those legs fall back to Black-Scholes estimates rather than real traded prices. |
| ✗ No data | The broker returned nothing, or the date you picked is not an NSE trading day. The panel names the likely cause and which broker to use instead. |
The check is a sample, not a guarantee — it reads one daily-candle series for the whole range plus an ATM option probe on up to three days, because proving every strike on every day would cost as much as running the simulation itself. Per-strike coverage is only confirmed once the run starts.
Typical causes of a failed check:
- Kite — expired contracts drop out of Kite's instruments master, so older option legs can no longer resolve a token. Use Breeze for historical ranges.
- Dhan — historical data requires a separate Data API subscription on the Dhan side.
- Breeze — usually an illiquid strike or a date outside ICICI's retention.
Modes:
| Mode | Description |
|---|---|
| Full Day | Runs entry at 09:45, then monitor at the configured interval from 10:00 to 15:20. Prints final P&L. |
| Entry only | Runs only the 09:45 entry logic. Creates the state file. Does not monitor. |
| Monitor only | Runs a single monitor check at the specified simulated time. Requires a state file (run Entry first). |
Monitor Only — Simulated Time: Set hour and minute to check what the strategy would have decided at that exact moment. For example, set 11:30 to replay the 11:30 monitor tick.
To test the end-of-day long-leg exit, use Monitor at 15:20 on a day when DTE=1 (Monday, or the day before a Tuesday expiry).
Preview Strikes (optional, Full Day / Entry only)
Before running the simulation click Preview Strikes. The strategy scans all ITM strikes on the long expiry using the 09:45 candle data (or Black-Scholes fair values as a fallback) and returns two tables — one for the Long Call (LC) and one for the Long Put (LP).
| Column | Meaning |
|---|---|
| ● | Strike that would be auto-selected by the strategy |
| Δ | Black-Scholes delta |
| IV | Implied volatility |
| LTP | Last traded price (or BS fair value in sim) |
| Pass | P1 = strict (Δ≥0.90, TV≥10) · P2 = relaxed TV · P3 = relaxed delta |
- Green row = your selection (overrides auto-select)
- Blue row = auto-selected (used if you don't click a row)
- If the skip filter would trigger on this date, a warning is shown and the simulation would produce no trade
Click any row to override the auto-selected strike, then click Run Simulation. The chosen strike is passed directly to the strategy, bypassing the fallback selection. If you don't click any row the strategy uses its normal auto-selection logic.
Extending a multi-day session
On a date-range simulation's results page (/multi-sim-results/<session>), Extend widens the same session with more days before the start date, after the end date, or both — instead of running a whole new session from scratch. Days already stored are skipped automatically; only the new days run.
⚠ Watch for legs held overnight. A
carry_eodposition can span the join between the old range and the new days. Extending earlier assumes the original run's first day started flat; extending later assumes nothing else has run this strategy in sim mode since this session finished. If a position turns out to be open across the join, the modal warns you up front, and if the run detects it after the fact, a banner on the results page names the affected day. Treat those numbers as unreliable and re-run the full range with Run Again if you need certainty.
Scheduling
How a strategy gets scheduled
Flipping the Automation switch on (see Strategy Controls) creates the two daily jobs required for live market operation:
| Job name | When it fires | Strategy mode |
|---|---|---|
<strategy>_entry |
Mon–Fri at 09:45 IST | entry |
<strategy>_monitor |
Mon–Fri every N min, 10:00–15:59 IST | monitor |
where N is the Monitor Interval set in Config (default 5 min). Jobs are saved to jobs.sqlite and persist across server restarts. Whether those jobs place real orders or paper ones depends entirely on the Money mode control — same schedule, either mode.
On a live trading day (Real mode):
- 09:45 — entry job fires. Spots are fetched, strikes selected, state file written, orders placed.
- 10:00 onwards — monitor fires at the configured interval. Fetches SC/SP prices, checks exit conditions. If no position is open yet, it retries entry instead (covers a transient miss like a broker blip) — except a Time Window filter, which always keeps retrying since it's designed to open later the same day.
- When an exit triggers, state becomes CLOSED. Subsequent monitor ticks return immediately without doing anything. The same happens the moment any other filter (VIX skip, Gap skip, Date window, Regime skip, ...) vetoes entry — that's treated as today's final no-trade decision, so monitor stops polling for the rest of the day instead of retrying every tick.
Stopping a strategy mid-week: Turn Automation off. If you plan to resume the same week, note that this removes the jobs rather than pausing them — turning it back on re-creates them from the current Config, which is equivalent for all practical purposes but does reset "next run" timing.
Viewing and Removing Jobs
The Scheduled Jobs panel on the Dashboard lists all active jobs with their next fire time and trigger. Click ✕ to remove any job.
Reports Page
Go to Reports in the navigation bar to analyse historical trade event data.
Filters
| Filter | Description |
|---|---|
| Strategy | Scope to a single strategy file (active or archived — archived ones are listed in their own group, suffixed "(archived)"), or leave blank for all |
| Status | Only applies when Strategy is blank — scopes "all strategies" to Active (default), Archived, or All |
| Mode | Filter by Paper or Real trades only |
| Broker | Filter by which broker (Kite / Breeze / Dhan) executed the trade |
| From / To | Date range (defaults to the last 30 days). Dates are matched against the date field inside each event's payload |
Picking a specific Strategy always shows its data regardless of the Status filter — Status only governs the "all strategies" aggregate. Archived strategies keep their full trade history here (unlike the Dashboard, which hides them entirely) — this is the place to review how a retired strategy actually performed.
Click Apply to reload all charts and the trade table. Click Reset to clear filters (Status resets to Active) and reload.
The page remembers your place: the active tab, filters, sim session, intraday date and scroll position are restored when you navigate away and come back (per browser tab).
Summary Cards
Shown across the top row:
| Card | Description |
|---|---|
| Trading days | Number of distinct days with at least one exit event |
| Total trades | Exit events in the selected range |
| Win rate | % of trades where P&L pts > 0 |
| Net P&L (pts) | Sum of all P&L points |
| Net P&L (₹) | Sum of all P&L in rupees |
| Avg / trade | Net P&L pts ÷ total trades |
| Best day | Highest single-day P&L |
| Worst day | Lowest single-day P&L |
| Max drawdown | Largest consecutive run of negative days |
| Latency p50 (live) | Median automation latency for live entries/exits — time from the strategy detecting a signal to the broker acknowledging the order. Shows "—" with no live trades in range |
| Latency p95 (live) | 95th-percentile version of the same — the slow-tail case, not the typical one |
Latency is measured only for real (live) trades, not paper — a paper order never round-trips to a broker, so there's nothing to time. Green means p95 is at or under the 200ms automation-latency target; red means it isn't.
Charts
Daily P&L (bar) — green bars for profitable days, red for losing days. The date range of the data is shown in the header.
Exit Breakdown (doughnut) — counts each distinct exit_type value across all trades. Useful for understanding how often the strategy exits via target vs. SL vs. EOD.
Cumulative P&L (line) — running sum of daily P&L points over time. Line colour reflects whether the period ended positive or negative.
Intraday P&L (line) — per-tick P&L path for a selected date, built from monitor events. Use the date dropdown (auto-set to the most recent date) to navigate between days. Hovering a point shows the call and put prices at that tick.
Trade Log Table
Each row represents one exit event paired with its entry data — this table doubles as a broker-wise trade ledger (filter by Broker above to scope it to one account):
| Column | Description |
|---|---|
| Date | Trade date |
| Strategy | Strategy display name |
| Mode | Paper / Real badge |
| Broker | Kite / Breeze / Dhan — which broker executed the trade |
| Strikes | CALL_STRIKEce / PUT_STRIKEpe |
| Premium | Combined premium collected at entry |
| Expiry | Expiry date of the short legs |
| Exit | Exit type badge (colour-coded by outcome) |
| P&L pts | Points P&L for this trade |
| P&L ₹ | Rupees P&L for this trade (before charges) |
| Charges ₹ | Brokerage + STT + exchange transaction charges + GST + SEBI fee + stamp duty for this trade. Real (broker-reported) for a live trade; a flat-rate estimate for paper trades, since there's no real order to ask a broker about. A real trade shows a Retry link instead of "—" while its charges aren't resolved yet (brokers finalize them T+1, never same-day) — click it to look up that row's charges immediately instead of waiting for the daily 08:00 IST sweep. The message says what actually happened: saved, broker hasn't priced the orders yet, the broker session expired / rate-limited (try again after re-login), or no order IDs were kept for this trade. Trades closed from now on keep their order IDs on the row, so Retry always works for them. Rows closed before order IDs were kept have none: Retry tells you so and you enter the amount by hand (a broker's whole-day total isn't used, since a day's orders often include ones that belong to no trade row). A failed lookup (expired token, rate limit) never counts toward the 3 daily retries after which you get a notification to enter the amount by hand |
| Net P&L ₹ | P&L ₹ minus Charges ₹. "—" whenever Charges ₹ is "—" |
| Retention | P&L pts as % of premium collected (higher = better) |
Income tax on trading profit is not included in Charges/Net P&L — F&O gains are non-speculative business income taxed at your slab rate annually (not per trade), so it isn't something a per-trade column can meaningfully show. Use the Export CSV button and Broker filter above to pull each broker's numbers for your own tax filing.
Performance Page
Go to Performance in the navigation bar. Auto-refreshes every 30 seconds.
Use the Strategy filter at the top to scope all three sections to one strategy.
Summary Cards
One card per strategy × mode combination. Shows total closed trades, win rate, and cumulative P&L in both points and rupees.
Trade Events
A table of structured events emitted by strategies. Every significant action emits an event:
| Event | Emitted when |
|---|---|
entry |
Trade entered at 09:45 |
skip |
Entry skipped (VIX/gap filter triggered) |
short_exit |
Short legs closed (profit target / SL / hard exit) |
exit |
Long legs closed (EOD DTE=1 exit) — final P&L event |
fullday_complete |
End of a full-day simulation |
Delete — click ✕ on any row to remove that event. Clear — click 🗑 Clear in the card header to delete all events for the selected strategy.
Run Logs
A table of every strategy subprocess execution. Each row shows:
- Strategy name, timestamp, return code
- View button — opens a scrollable modal with full stdout and stderr
Logs do not auto-refresh. Click ↻ Refresh Logs to reload manually.
Delete — click ✕ on any row. Clear — click 🗑 Clear in the card header.