Changelog & Audit Log
Chronological record of every significant change to the bot. Each entry maps to a git commit.
Run git show <hash> for the full diff.
AI Overhaul — Visibility / UI June 24, 2026
| Date | Commit | Change | Files |
| 2026-06-24 |
pending |
AI visibility surfaces — New read endpoints /api/sentiment/latest, /api/sentiment/history, /api/ai-market/data-quality, and /api/ai-market/calibration. Frontend gains a SentimentGaugePanel (diverging-bar gauge) on the main Dashboard, a per-trade SENT ±N badge on open range trades in TradeTable, and wires the previously dead AIPredictionsPanel plus new data-quality and calibration cards into the AI Market page. Added vitest and a useSentiment hook test. |
dashboard_server.py
frontend/src/hooks/useSentiment.ts
frontend/src/components/dashboard/SentimentGaugePanel.tsx
frontend/src/components/dashboard/TradeTable.tsx
frontend/src/components/dashboard/AIPredictionsPanel.tsx
frontend/src/pages/Dashboard.tsx
frontend/src/pages/AIMarketPage.tsx |
Strategy Factory Roadmap June 10, 2026
| Date | Commit | Change | Files |
| 2026-06-10 |
pending |
Roadmap navigation re-pointed — Replaced the Autonomous Bot and Backtesting Engine Roadmap sub-links with direct Track 1 Strategy Pipeline, Track 2 Engine Build, and Strategy Factory Spec links. Authenticated dashboard endpoints now serve both boards and the two-track design spec. |
frontend/src/components/Sidebar.tsx
frontend/src/pages/AutonomousRoadmap.tsx
frontend/src/App.tsx
dashboard_server.py |
Autonomous Bot Roadmap Week 1 June 8, 2026
| Date | Commit | Change | Files |
| 2026-06-09 |
pending |
Backtesting Engine — Full historical replay + grid optimizer for DC/DCS/DCS_SKEW/DDC/IC/MDC. Real scanners run under patched now_ist() and validated Config overrides via a MockDhanClient; signals become live trade dicts, legs are repriced from NSE bhavcopy / IV snapshots / Black-Scholes, and exits reuse the live position_monitor helpers. Parallel grid search (ProcessPoolExecutor, db_path workers), CLI (python -m arb_bot.backtest), async API jobs, and a React /backtest tab. Three new SQLite tables. |
arb_bot/backtest/
arb_bot/storage.py
dashboard_server.py
frontend/src/pages/BacktestPage.tsx
frontend/src/hooks/useBacktestData.ts |
| 2026-06-09 |
pending |
Controlled MDC scale-in safety — A second MDC position now requires a 90-minute cooldown, meaningful spot movement, and a healthy newest anchor. Execution rejects exact duplicate DC-family option security-ID sets across base and MDC_* names before simulation or broker orders. |
arb_bot/scanners/master_dc.py
arb_bot/execution/engine.py
arb_bot/bot.py
arb_bot/config.py |
| 2026-06-09 |
pending |
Backtesting Engine roadmap documents — Added a Roadmap sidebar entry and a tabbed dashboard page for reading the approved backtesting design spec and implementation plan. Authenticated API endpoints serve both Markdown documents. |
frontend/src/pages/BacktestingEngineRoadmap.tsx
frontend/src/components/Sidebar.tsx
frontend/src/App.tsx
dashboard_server.py |
| 2026-06-08 |
pending |
Go-live readiness and dashboard trade history repair — Readiness now measures positive realized dry-run P&L, excludes live/shadow records, maps SDCS to persisted DCS_SKEW trades, and the dashboard history table now supports newest-first server pagination plus strategy filtering. |
arb_bot/go_live_manager.py
dashboard_server.py
frontend/src/components/dashboard/TradeTable.tsx
frontend/src/hooks/useDashboardData.ts |
| 2026-06-08 |
pending |
Risk envelope integration — Added the production dry-run risk envelope gate before new-entry scans, close-time envelope P&L updates, 7-day blocking-event lookahead, Telegram /envelope//resume_envelope confirm, dashboard /api/envelope/state, and a dashboard Risk Envelope panel. |
arb_bot/risk_envelope.py
arb_bot/bot.py
arb_bot/execution/engine.py
arb_bot/event_rules.py
arb_bot/command_handler.py
dashboard_server.py
frontend/src/components/dashboard/RiskEnvelopePanel.tsx |
Production Performance Review June 7, 2026
| Date | Commit | Change | Files |
| 2026-06-07 |
pending |
Metrics and AI diagnostic repair — Daily metrics now roll on the actual IST date, Strategy Analytics deduplicates closes by tag, journal rows retain original trade fields, and AI analysis rows persist downstream execution status/rejection reasons. AI entry-zone parsing now accepts descriptive numeric ranges. |
arb_bot/metrics.py
arb_bot/storage.py
arb_bot/autonomous_market.py
arb_bot/execution/engine.py
dashboard_server.py |
| 2026-06-07 |
pending |
Phase 3 state and slot controls — Open option trades now persist an explicit position state (OPEN, PROFIT_LOCK, EXPIRY_APPROACH, CLOSING), and ExecutionEngine introduced persisted dc_family slot occupancy. The initial one-slot policy was later replaced by the controlled two-slot scale-in policy. |
arb_bot/config.py
arb_bot/execution/double_calendar.py
arb_bot/execution/engine.py
arb_bot/execution/position_monitor.py
public/sections/09_exits.html
public/sections/10_risk.html
public/sections/12_files.html
public/sections/14_config.html |
IV Surface Tracker May 21, 2026
| Date | Commit | Change | Files |
| 2026-05-21 |
pending |
AI market OpenAI parameter guard — AIRunner now omits temperature for GPT-5-family models, reports incomplete Responses API calls before JSON parsing, and gives the scheduled web-search market analysis a larger output budget via AI_MARKET_MAX_OUTPUT_TOKENS. |
arb_bot/ai_runner.py
arb_bot/autonomous_market.py
arb_bot/config.py
tests/test_ai_runner.py |
| 2026-05-21 |
pending |
IV Surface empty-state fixes — Dashboard IV endpoints now fall back from an empty current trading date to the latest captured session. IVSampler estimates smile CE/PE IV from option LTP when Dhan omits raw per-leg IV and labels estimated rows. The React IV Surface page shows the effective fallback date and renders near/far ATM IV history when skew history is unavailable. |
arb_bot/iv_sampler.py
arb_bot/storage.py
dashboard_server.py
frontend/src/pages/IVSurface.tsx
frontend/src/hooks/useIVSnapshots.ts
frontend/src/hooks/useIVSurface.ts
frontend/src/hooks/useIVHistory.ts |
Trade Journal May 18, 2026
| Date | Commit | Change | Files |
| 2026-05-19 |
pending |
AI debrief schema fix — Changed rejected-strategy delta generation from a free-form JSON object to strict structured-output rows, then normalized rows back into the existing journal delta map. This prevents OpenAI invalid_json_schema failures from leaving closed trades without an AI debrief. |
arb_bot/ai_debrief.py
arb_bot/prompts/trade-debrief.md
tests/test_ai_debrief.py |
| 2026-06-08 |
pending |
Week 2 debrief schema alignment — Post-trade AI debriefs now also persist the roadmap's structured JSON payload with schema version, root cause, regime correctness, exit timing, theta/vega/spot attribution, suggested parameter deltas, and confidence while preserving the narrative debrief used by existing operator views. |
arb_bot/storage.py
arb_bot/ai_debrief.py
arb_bot/prompts/trade-debrief.md
arb_bot/command_handler.py
frontend/src/pages/TradeJournal.tsx |
| 2026-05-19 |
pending |
Trade Journal slice 2 — Added operator notes, dashboard inline note editing via PATCH /api/journal/{tag}/notes, Telegram /note <tag> <text>, low-cost AI post-trade debriefs with AI_DEBRIEF_MODEL=gpt-5.4-nano, rejected-strategy delta, AI verdict outcome, and event-risk annotation stored on trade_journal. |
arb_bot/storage.py
arb_bot/ai_debrief.py
arb_bot/prompts/trade-debrief.md
arb_bot/execution/engine.py
arb_bot/command_handler.py
dashboard_server.py
frontend/src/pages/TradeJournal.tsx
frontend/src/hooks/useTradeJournal.ts |
| 2026-05-18 |
pending |
Trade Journal slice 1 — Added trade_journal SQLite persistence, close-time journal snapshots, idempotent backfill from existing closed trades plus IV/battle/AI context, protected /api/journal endpoints, Telegram /journal <tag>, and a React /journal filterable list page. |
arb_bot/storage.py
arb_bot/execution/engine.py
arb_bot/command_handler.py
dashboard_server.py
frontend/src/pages/TradeJournal.tsx
frontend/src/hooks/useTradeJournal.ts |
Broker Health Guard May 18, 2026
| Date | Commit | Change | Files |
| 2026-05-18 |
pending |
Backend broker health guard — Added BrokerHealthMonitor, broker_health_samples SQLite persistence, scan-cycle no-trade/dry-run downgrades, Telegram /broker_health, and dashboard /api/broker/health. DEGRADED/UNSTABLE force dry-run entries; DOWN skips new entry scans after monitoring and reconciliation. |
arb_bot/broker_health.py
arb_bot/bot.py
arb_bot/execution/engine.py
arb_bot/storage.py
dashboard_server.py
arb_bot/command_handler.py |
Strategy Battle Engine May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
7dd87b2 |
strategy_battle_log table + store methods — Added strategy_battle_log SQLite table (one row per scan cycle, now auto-pruned after 60 days) and three new SQLiteStore methods: append_battle_log(), list_battle_log(date, limit), list_battle_summary(days=90). Summary aggregates per-day eligible counts, MDC selection counts, and top rejection reasons per strategy. |
arb_bot/storage.py
tests/test_battle_storage.py |
| 2026-05-17 |
5f8cc62 |
BattleAccumulator — New arb_bot/battle.py module. BattleAccumulator collects per-scanner results in memory during a scan cycle (strategy name, eligible flag, signal price, rejection reason) and flushes one row to the store at cycle end. No-op if no strategies recorded. |
arb_bot/battle.py
tests/test_battle_accumulator.py |
| 2026-05-17 |
a9269f0 |
MDC _classify() returns (regime, rejections) tuple — MasterDCScanner._classify() return type changed from str | None to tuple[str | None, dict[str, str]]. The second element maps every non-selected strategy to a human-readable rejection reason. scan() unpacks the tuple and embeds _mdc_rejections, _mdc_selected, _spot, _iv, _realized_range, _near_straddle into the returned signal dict. |
arb_bot/scanners/master_dc.py
tests/test_master_dc.py |
| 2026-05-17 |
1585842 |
Strip battle metadata before order dispatch — ExecutionEngine.execute_master_dc() strips all _-prefixed metadata keys at entry so they never reach the broker or get persisted in trade records. |
arb_bot/execution/engine.py
tests/test_battle_accumulator.py |
| 2026-05-17 |
77021a8 |
Bot scan-cycle wiring — run_scan_cycle() creates a BattleAccumulator after the paused_today guard. Each scanner block calls _battle.record() after scan(). MDC block additionally copies _spot/_iv/_realized_range/_near_straddle context onto the accumulator. _battle.flush() is called (under try/except) before the cycle-done log line. No row is written when blocked by guards, concurrency caps, or paused_today. |
arb_bot/bot.py
tests/test_battle_bot_wiring.py |
| 2026-05-17 |
cf69f60 |
Dashboard API endpoints — Added auth-protected GET /api/battle/log?date=YYYY-MM-DD (returns all cycles for a date) and GET /api/battle/summary (per-day aggregated counts, 60-second cache). 6 tests covering empty state, populated state, and auth guards. |
dashboard_server.py
tests/test_battle_api.py |
| 2026-05-17 |
3a840ca |
Strategy Battle dashboard page — New StrategyBattle.tsx page at /battle. Shows a daily summary table (date, cycle count, eligible counts per strategy) with clickable rows that load a cycle drill-down panel below showing per-cycle timestamps, spot/IV/range context, eligibility badges with rejection reasons, and the MDC selection. Added "Battle Log" nav item (Swords icon) to Sidebar between Analytics and AI Market. Added useBattleSummary and useBattleLog hooks. |
frontend/src/pages/StrategyBattle.tsx
frontend/src/hooks/useBattleSummary.ts
frontend/src/hooks/useBattleLog.ts
frontend/src/App.tsx
frontend/src/components/Sidebar.tsx |
Unique Dashboard Session Management May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
a21c915 |
OTP session uniqueness — Dashboard login now enforces a single active session. Each OTP verification invalidates any previously issued JWT before issuing a new one. Prevents multiple concurrent logins from the same Telegram account and ensures that re-login from a new browser tab automatically expires the old session. |
dashboard_server.py
tests/test_dashboard_auth.py |
AI Market Promotion Report May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
a6114d3 |
AI_MARKET promotion report — Added a SQLite-backed promotion report with AI verdict history, confidence-band performance, cost summary, DDC with-AI versus without-AI comparison, and hallucination/error log. /shadow AI_MARKET and /promote AI_MARKET now require the AI usefulness gate in addition to the normal confidence gate. Added Telegram /ai_promotion_report, dashboard /api/ai-market/promotion-report, and a Promotion Readiness section on the AI Market page. |
arb_bot/storage.py
arb_bot/go_live_manager.py
arb_bot/command_handler.py
dashboard_server.py
frontend/src/pages/AIMarketPage.tsx
tests/test_ai_market_storage.py
tests/test_dashboard_ai_market.py
tests/test_go_live_manager.py |
Portfolio Greeks Runtime Gate May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
4f6401d |
Portfolio Greeks gate — Added portfolio-level Greek aggregation, configurable Δ/Γ/Θ/ν limits, pre-entry runtime blocking for SHADOW/LIVE option trades, Telegram /safety Greek totals, and a dashboard Portfolio Greeks panel. Dry-run entries continue by default while recording would-block safety events. |
arb_bot/portfolio_greeks.py
arb_bot/bot.py
arb_bot/execution/safety.py
dashboard_server.py
frontend/src/components/dashboard/PortfolioGreeksPanel.tsx |
Position Reconciliation Auto-Healer May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
a34b52b |
Reconciliation auto-healer — Added ReconciliationService, the reconciliation_audit SQLite table, scan-cycle reconciliation guard, /confirm_recon, a protected dashboard log endpoint, and an inline dashboard Reconciliation Log. Confirmed-flat trades are removed only after two consecutive flat audits; quantity mismatches require operator acknowledgement before strategy scans resume. |
arb_bot/execution/reconciliation.py
arb_bot/storage.py
arb_bot/bot.py
arb_bot/command_handler.py
dashboard_server.py
frontend/src/components/dashboard/ReconciliationLog.tsx |
Token Renewal Service May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
4316ef6 |
Standalone token renewal — Added SQLite-backed Dhan token state, token_refresher.py, a systemd unit template, bot-side token reload from SQLite, and a protected dashboard token-health panel. The bot no longer depends on its scan loop to renew the Dhan token. |
arb_bot/token_manager.py
arb_bot/storage.py
token_refresher.py
scripts/token-refresher.service
dashboard_server.py
frontend/src/components/dashboard/TokenHealthPanel.tsx |
| 2026-05-17 |
d2c6e90 |
Token refresh failure alert — The standalone token refresher now retries failed due-refresh attempts every 5 minutes and sends one Telegram warning after 3 consecutive failures asking the operator to check Dhan manually. The alert resets after a successful refresh or healthy no-op check. |
token_refresher.py
arb_bot/token_manager.py
tests/test_token_manager.py |
Market Event Fetch Automation May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
pending |
Official event-source refresh — Added rule normalization, official-source adapters for NSE holidays, MoSPI CPI/GDP/IIP, and OEA WPI, plus run_market_event_fetch_job(), scripts/fetch_market_events.py, and make fetch-events. Source failures are isolated so one broken feed does not stop seed or other source updates. |
arb_bot/event_rules.py
arb_bot/event_sources/
arb_bot/event_fetch_job.py
scripts/fetch_market_events.py
Makefile |
| 2026-05-17 |
pending |
Warning-event regime support — EventCalendar.get_event_risk() now returns EVENT_RISK for matching non-blocking warning events while still allowing the scanner. Blocking events continue to skip entries before scanner execution. |
arb_bot/event_calendar.py
tests/test_event_calendar.py |
Event Calendar / No-Trade Guard May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
a9b26d9 |
market_events table + storage — Added market_events SQLite table with upsert_market_events(), get_events_in_range(), and get_upcoming_events() store methods. Supports severity levels (BLOCK / WARNING / INFO) and per-strategy blocking flags. |
arb_bot/storage.py
tests/test_event_storage.py |
| 2026-05-17 |
4c2a8ef |
EventCalendar class + seed data — Added arb_bot/event_calendar.py with get_event_risk() (returns BLOCK / WARNING / CLEAR for a given date and strategy), load_seed(), and symbol-match normalization. Added market_events_seed.json with Budget 2026, RBI MPC, CPI, FOMC, and other known market events. |
arb_bot/event_calendar.py
arb_bot/market_events_seed.json
tests/test_event_calendar.py |
| 2026-05-17 |
29099f8 |
Event guard wired into scan cycle — EventCalendar instantiated in ArbitrageBot.__init__. run_scan_cycle() calls _event_guard() before each strategy's scanner block. BLOCK events skip the scanner and log the reason; WARNING events allow scanning but record EVENT_RISK. Config.EVENT_GUARD_ENABLED flag. |
arb_bot/bot.py
arb_bot/config.py |
| 2026-05-17 |
d879f1b |
Telegram event commands — Added /events (upcoming no-trade dates and warnings in a formatted table) and /why_blocked (explains what event is blocking a strategy today and when it clears). |
arb_bot/command_handler.py |
| 2026-05-17 |
57c133f |
Dashboard event endpoints — Added auth-protected GET /api/events/upcoming and GET /api/events/today endpoints returning upcoming event list and today's blocking/warning events respectively. |
dashboard_server.py |
| 2026-05-17 |
f2c7b9f |
EventCalendarPage dashboard — New EventCalendarPage.tsx at /events. Shows upcoming events with severity color coding (red=BLOCK, amber=WARNING, blue=INFO), today's blocking events banner, and a per-strategy impact matrix. Linked from Sidebar. |
frontend/src/pages/EventCalendarPage.tsx
frontend/src/App.tsx
frontend/src/components/Sidebar.tsx |
Roadmap Page & AI Market Enhancements May 17, 2026
| Date | Commit | Change | Files |
| 2026-05-17 |
2c284c5 |
Project roadmap restructured — docs/features.md rewritten into four sections: Shipped, Near-term (3–6 months), Medium-term (6–18 months), and Long-term Vision. Each item now has a concise "What to build" spec and a recommended build sequence. Covers all 11 near/medium-term items and the long-term ML, portfolio, multi-broker, and AI ensemble directions. |
docs/features.md |
| 2026-05-17 |
903174e |
AIRunner → OpenAI Responses API — Migrated AIRunner from Chat Completions to the Responses API. Added temperature, max_output_tokens, and store=True parameters. AutonomousMarket now extracts the structured JSON verdict from the response output items. Tests updated to match the new response shape. |
arb_bot/ai_runner.py
arb_bot/autonomous_market.py
tests/test_ai_runner.py |
| 2026-05-17 |
110f2fe |
Layout responsiveness fix — Removed max-w-* constraint from the main content wrapper in Layout so wide pages (analytics, AI market) use the full available width on large screens. |
frontend/src/components/Layout.tsx |
| 2026-05-17 |
3bed16e |
Roadmap dashboard page — Added a GET /api/features endpoint (auth-protected) that reads docs/features.md from disk. Created FeaturesPage.tsx — a React page that fetches and renders the markdown via react-markdown + remark-gfm with full GFM table support, styled to match the dark theme using @tailwindcss/typography. Wired to route /features and added a "Roadmap" sidebar link (rocket icon) under the Main section on both desktop and mobile. |
dashboard_server.py
frontend/src/pages/FeaturesPage.tsx (new)
frontend/src/App.tsx
frontend/src/components/Sidebar.tsx
frontend/tailwind.config.js |
AI Market Performance Tracking May 16, 2026
| Date | Commit | Change | Files |
| 2026-05-16 |
ad50690 |
/api/ai-market/performance endpoint — Added auth-protected GET /api/ai-market/performance that delegates to load_ai_market_performance() and returns aggregated win rate, P&L, and trade counts split by dry-run vs live mode. Covered by 3 tests: auth guard, empty-DB shape, and one closed winning trade. |
dashboard_server.py
tests/test_dashboard_ai_market.py |
| 2026-05-16 |
99fed5f |
AIMarketPage PerformanceSection — Added ModeStats / PerformanceData interfaces and three new components (StatRow, ModeCard, PerformanceSection) that fetch /api/ai-market/performance and display aggregated win rate, P&L, and trade counts for dry-run and live modes side-by-side above the per-day analysis history. |
frontend/src/pages/AIMarketPage.tsx |
| 2026-05-16 |
7faa5bf |
AI_MARKET registered in GoLiveManager — Added AI_MARKET to the GoLiveManager.STRATEGIES list, assigned dedicated margin buffer (AI_MARKET_MARGIN) and dry-run flag (AI_MARKET_DRY_RUN) so the strategy participates in the DRY_RUN → SHADOW → LIVE state machine and confidence gate. |
arb_bot/go_live_manager.py |
Autonomous AI Market Strategy May 16, 2026
| Date | Commit | Change | Files |
| 2026-05-16 |
pending |
AI_MARKET foundation — Added OpenAI runner, autonomous-market prompt/config, NSE holiday gate, SQLite analysis/trade tables, daily 09:05 analysis scheduling, dry-run single-leg AI_MARKET execution, target/stop/EOD close routing, and DDC weak-trend hint support. |
arb_bot/ai_runner.py
arb_bot/autonomous_market.py
arb_bot/nse_holidays.py
arb_bot/storage.py
arb_bot/execution/engine.py
arb_bot/bot.py
arb_bot/scanners/diagonal_calendar.py |
| 2026-05-16 |
pending |
AI_MARKET operator and dashboard visibility — Added Telegram safety/risk formatting for AI_MARKET, protected dashboard APIs for latest/list/detail/trade data, and a React AI Market page showing analysis history, parsed verdicts, token costs, and linked simulated trades. |
arb_bot/command_handler.py
dashboard_server.py
frontend/src/pages/AIMarketPage.tsx
frontend/src/App.tsx
frontend/src/components/Sidebar.tsx |
| 2026-05-16 |
pending |
AI_MARKET docs update — Documented strategy behavior, class map, scan-cycle schedule, dry-run order flow, exit rules, risk controls, SQLite tables, config, gotchas, safety view, and rebuilt generated docs. |
public/sections/*.html
public/index.html |
Go-Live Readiness May 15, 2026
| Date | Commit | Change | Files |
| 2026-05-15 |
pending |
Paper-to-live controls — Added GoLiveManager, SQLite records persistence, confidence gate, shadow mode, 10% live margin buffer, runtime execution-state routing, shadow metrics snapshots, startup state logging, and Telegram commands for /golive_status, /confidence_report, /shadow, /promote, and /revert. |
arb_bot/go_live_manager.py
arb_bot/execution/engine.py
arb_bot/command_handler.py
arb_bot/bot.py
tests/test_go_live_manager.py
tests/test_go_live_integration.py |
| 2026-05-15 |
pending |
Dashboard go-live visibility — Added /api/go-live/status, shadow trade classification, shadow-safe summary/analytics filtering, dashboard Go-Live Readiness panel, shadow badges, and separate shadow counts in Strategy Analytics. |
dashboard_server.py
frontend/src/pages/Dashboard.tsx
frontend/src/pages/StrategyAnalytics.tsx
frontend/src/components/dashboard/GoLiveStatusPanel.tsx
tests/test_dashboard_api.py
tests/test_strategy_comparison.py |
Master DC Regression Fix May 11, 2026
| Date | Commit | Change | Files |
| 2026-05-11 |
pending |
MDC option-chain parsing — Fixed MasterDCScanner to read live ce / pe row data when classifying regimes, with a backward-compatible fallback for older call_options / put_options payloads. This restores correct MDC routing to MDC_DDC, MDC_DCS_SKEW, MDC_DCS, MDC_DC, or MDC_IC based on the actual chain data. |
arb_bot/scanners/master_dc.py
tests/test_master_dc.py
public/sections/06d_master_dc.html
public/sections/19_changelog.html |
Master DC Meta-Strategy May 10, 2026
Added the Master DC wrapper, which classifies each scan cycle and routes to the best DC-family scanner while tagging the resulting trade as MDC_*.
| Date | Commit | Change | Files |
| 2026-05-10 |
pending |
MasterDCScanner orchestration — Added the MDC wrapper, engine prefix-strip routing, bot scan-cycle integration, and MDC-aware operator formatting. MDC trades now coexist with standalone strategies under their own persistent MDC_* identity. |
arb_bot/scanners/master_dc.py
arb_bot/execution/engine.py
arb_bot/bot.py
arb_bot/command_handler.py
public/sections/01_class_map.html
public/sections/02_scan_cycle.html
public/sections/09_exits.html
public/sections/14_config.html |
| 2026-05-10 |
pending |
MDC docs page — Added a standalone Strategy 7A section with example routes, a scan-flow animation, and an interactive calculator so operators can see how Master DC classifies a cycle before it delegates. Tightened the calculator notes to show the exact routing thresholds and added a no-trade example above the IC ceiling. |
public/_shell.html
public/sections/00_overview.html
public/sections/06d_master_dc.html (new)
public/sections/19_changelog.html
public/index.html |
Operator Coverage May 10, 2026
Expanded Telegram safety, risk, and signal-explanation coverage for the newer option strategies.
| Date | Commit | Change | Files |
| 2026-05-10 |
pending |
New strategy operator visibility — /risk, /positions, /safety, and /explain_signal now cover DCS_SKEW, DDC, and IC. DCS_SKEW trades keep their own strategy identity in persistence while reusing DCS-style P&L, Greeks, monitoring, and close routing. |
arb_bot/command_handler.py
arb_bot/execution/engine.py
arb_bot/execution/double_calendar.py
arb_bot/execution/safety.py |
Phase 4 — Iron Condor Fallback May 10, 2026
Added a dry-run Iron Condor fallback scanner and execution path. IC scans only when DC, DCS, DCS_SKEW, and DDC are idle.
| Date | Commit | Change | Files |
| 2026-05-10 |
pending |
IronCondorScanner + dry-run execution — Added 4-leg weekly NIFTY IC fallback. Filters: DTE 3-7, ATM IV 18-26%, realized range ≤ 60% of near straddle, and net credit ≥ 20% of wing width. Execution simulates fills only and persists entry_credit, wing_width, max_loss, and all four leg ids/strikes. Exit rules: 50% credit capture, 1.5× credit stop, or DTE ≤ 1. |
arb_bot/scanners/iron_condor.py (new)
arb_bot/execution/engine.py
arb_bot/execution/pnl.py
arb_bot/execution/position_monitor.py
tests/test_iron_condor.py (new) |
| 2026-05-10 |
pending |
Docs update — Added Strategy 7 page, sidebar entry, overview card, scan-cycle step, exit rules, class map entries, config reference, order flow, and rebuilt public/index.html. |
public/_shell.html
public/sections/00_overview.html
public/sections/01_class_map.html
public/sections/02_scan_cycle.html
public/sections/06c_iron_condor.html (new)
public/sections/07_order_flow.html
public/sections/09_exits.html
public/sections/14_config.html
public/sections/19_changelog.html |
Phase 3 — Directional Diagonal Calendar May 10, 2026
Added the dry-run Directional Diagonal Calendar strategy. DDC buys the far-month ATM option and sells the near-week OTM option on the same side after a strong intraday trend.
| Date | Commit | Change | Files |
| 2026-05-10 |
pending |
DirectionalDiagonalScanner — Added dry-run 2-leg DDC scanner. Captures day open, requires absolute intraday trend ≥ DDC_TREND_THRESHOLD_PCT, chooses BULLISH CE or BEARISH PE diagonal, filters near-week DTE 5-9 and ATM IV 20-25%, and selects near short strike at ATM ± DDC_OTM_DISTANCE_PTS. |
arb_bot/scanners/diagonal_calendar.py (new)
arb_bot/config.py
tests/test_diagonal_calendar.py (new) |
| 2026-05-10 |
pending |
DDC dry-run execution + exits — Added execute_diagonal_calendar(), DDC trade persistence, live-LTP P&L, close-leg routing, and monitor exits for 30% profit target, 20% debit stop, short-strike breach, and near-week DTE ≤ 1. Wired scanner into run_scan_cycle() after DCS_SKEW and before IC fallback. |
arb_bot/execution/engine.py
arb_bot/execution/double_calendar.py
arb_bot/execution/pnl.py
arb_bot/execution/position_monitor.py
arb_bot/bot.py
tests/execution/test_engine_pnl.py |
| 2026-05-10 |
pending |
DDC docs update — Added Strategy 6 page, sidebar entry, overview card, class map entries, and documented DDC config parameters plus dry-run entry/close flow in the generated documentation. |
public/_shell.html
public/sections/00_overview.html
public/sections/01_class_map.html
public/sections/06c_directional_diagonal.html (new)
public/sections/07_order_flow.html
public/sections/14_config.html
public/index.html |
Phase 2 — Adaptive + Skew-Aware DCS May 9–10, 2026
Added adaptive IV-regime wing sizing, intraday realized-range entry filters, put/call skew detection,
and a new parallel DCS_SKEW strategy class for side-by-side comparison.
All changes are dry-run only. 8 tasks, 10 commits.
| Date | Commit | Change | Files |
| 2026-05-10 |
ee94050 |
Docs update — Playground sections updated with adaptive wings, skew, realized range, SDCS calculator, and this changelog. Fixed STRIKE_STEP rounding (50→100) in JS calcWing. |
public/sections/06_stretched_dc.html
public/sections/06b_skewed_dc.html (new)
public/sections/14_config.html
public/sections/19_changelog.html (new) |
| 2026-05-10 |
7cb500d |
Wire SDCS + DC selector — SkewedDCSScanner imported and instantiated in ArbitrageBot; wired to metrics; SDCS scan block added to run_scan_cycle(). _spot_history and _realized_range_today() moved from StretchedDoubleCalendarScanner up to DoubleCalendarScanner parent so all three scanners inherit. DC range check added: skip DC if range > 45% of straddle (prefer DCS). DC_REALIZED_RANGE_MAX_PCT = 0.45. |
arb_bot/bot.py
arb_bot/config.py
arb_bot/scanners/double_calendar.py
arb_bot/scanners/stretched_double_calendar.py
tests/test_adaptive_dcs.py |
| 2026-05-09 |
a27b784 |
Refactor: _find_row + SDCS_DRY_RUN — _find_row() extracted as @staticmethod on DoubleCalendarScanner base class (was duplicated inline in both DCS and SDCS scan methods). SDCS_DRY_RUN wired into execute_stretched_double_calendar() — was previously a dead config param. |
arb_bot/scanners/double_calendar.py
arb_bot/scanners/stretched_double_calendar.py
arb_bot/scanners/skewed_double_calendar.py
arb_bot/execution/engine.py |
| 2026-05-09 |
284e44a |
SkewedDCSScanner (DCS_SKEW) — New file skewed_double_calendar.py. Subclass of StretchedDoubleCalendarScanner with strategy name "DCS_SKEW". Overrides scan() with two-step wing logic: base_wing → OTM row lookup → _calc_skew_wings() → re-lookup if strikes changed. Uses net_greeks_sdcs(ce_wing, pe_wing). Signal dict adds ce_wing_offset, pe_wing_offset. 11 tests, 61/61 passing. |
arb_bot/scanners/skewed_double_calendar.py (new)
tests/test_skew_aware_dcs.py |
| 2026-05-09 |
9b1c7c6 |
_calc_skew_wings() + skew config — Added to StretchedDoubleCalendarScanner. Reads implied_vol from OTM chain rows, computes put_skew/call_skew vs ATM IV, and returns asymmetric (ce_wing, pe_wing) when skew gap exceeds threshold. Three new config params: DCS_SKEW_THRESHOLD=2.0, DCS_SKEW_CE_WING_PCT=0.45, DCS_SKEW_PE_WING_PCT=0.60. |
arb_bot/config.py
arb_bot/scanners/stretched_double_calendar.py
tests/test_skew_aware_dcs.py |
| 2026-05-09 |
0069815 |
net_greeks_sdcs() — Added to greeks.py with independent ce_wing/pe_wing args for asymmetric 8-leg Greeks calculation. net_greeks_dcs() refactored to delegate to it with ce_wing=pe_wing=wing. Three tests: symmetric equality, asymmetric difference, key set. |
arb_bot/greeks.py
tests/test_skew_aware_dcs.py |
| 2026-05-09 |
6b27798 |
Fix: spot history memory leak — _spot_history list in StretchedDoubleCalendarScanner was never cleared between trading days. Added dcs_scanner._spot_history.clear() to EOD cleanup block in bot.py. |
arb_bot/bot.py |
| 2026-05-09 |
d73b1d5 |
DCS realized-range filter — DCS scanner tracks intraday spot history and skips entry when realized range (high−low) exceeds DCS_REALIZED_RANGE_MAX_PCT × near_straddle (default 80%). Prevents entering 8-leg positions when market has already made a large directional move. |
arb_bot/config.py
arb_bot/scanners/stretched_double_calendar.py
tests/test_adaptive_dcs.py |
| 2026-05-09 |
51565a8 |
Adaptive wing sizing — _adaptive_wing_pct() added to StretchedDoubleCalendarScanner. _calc_wing() updated to use it. Three IV tiers: <22.5%→45%, 22.5–24%→52%, >24%→60%. Tests for all three tiers plus wing ordering. |
arb_bot/scanners/stretched_double_calendar.py
tests/test_adaptive_dcs.py |
| 2026-05-09 |
3fd81df |
Config: adaptive wing tier params — Replaced single DCS_WING_PCT=0.52 with five new params: DCS_IV_REGIME_LOW=22.5, DCS_IV_REGIME_HIGH=24.0, DCS_WING_PCT_LOW_IV=0.45, DCS_WING_PCT_MID_IV=0.52, DCS_WING_PCT_HIGH_IV=0.60. Also added SDCS_DRY_RUN=True, SDCS_MAX_CONCURRENT=1. |
arb_bot/config.py
tests/test_adaptive_dcs.py |
Infrastructure & Safety Layer May 8, 2026
| Date | Commit | Change | Files |
| 2026-05-08 |
a3d0462 |
Operator safety module — Added /safety command, safety event tracking in metrics, and a read-only audit layer for keeping operator's account view consistent with bot state. |
arb_bot/ safety files
public/sections/18_safety.html |
| 2026-05-08 |
3a97dc7 |
Live P&L aggregation — Total live P&L added to hourly reports and /positions command output. New validation tests. |
arb_bot/bot.py
arb_bot/metrics.py |
| 2026-05-08 |
aed68c0 |
Operator risk & replay tools — Added risk inspection and session replay tooling for post-trade analysis. |
arb_bot/ |
| 2026-05-08 |
3dd2e64 |
Execution engine split — Refactored engine.py helpers into smaller, independently testable units. |
arb_bot/execution/engine.py |
Live Execution Enabled May 3–4, 2026
| Date | Commit | Change | Files |
| 2026-05-04 |
b13cd6d |
Real-time P&L at time-stop exits — DC and DCS time-stop exits now compute actual P&L from current LTP at close time rather than showing the expected value from entry. |
arb_bot/execution/engine.py |
| 2026-05-03 |
96e0159 |
Live execution for DC and DCS — execute_double_calendar() and execute_stretched_double_calendar() both enabled for live MARKET orders when dry-run flags are False. Far legs bought first, near legs sold second to minimize directional exposure during fill. |
arb_bot/execution/engine.py
arb_bot/config.py |
Strategy Enhancements Apr 25 – May 1, 2026
| Date | Commit | Change | Files |
| 2026-05-01 |
97ff2fb |
DCS concurrent position limits — Max concurrent DCS positions cap, duplicate entry prevention (same ATM + near expiry), improved hourly error logging. |
arb_bot/scanners/stretched_double_calendar.py
arb_bot/config.py |
| 2026-04-28 |
dcab08f |
Live P&L in hourly reports — Estimated live P&L for all open positions added to the hourly Telegram summary. |
arb_bot/bot.py
arb_bot/metrics.py |
| 2026-04-28 |
866c73c |
Black-Scholes Greeks — Added arb_bot/greeks.py with bs_greeks(), net_greeks_dc(), net_greeks_dcs(). Entry Greeks snapshot stored in trade record and displayed in Telegram notifications and /positions output. |
arb_bot/greeks.py (new)
arb_bot/scanners/ |
| 2026-04-27 |
613c634 |
Fix: DCS expiry look-ahead — DCS now looks to the next-next Tuesday when the nearest is too close (inside DCS_MIN_DTE). Fixes stale stop message formatting. |
arb_bot/scanners/stretched_double_calendar.py |
| 2026-04-26 |
d17bf2a |
STRIKE_STEP=100 + IV threshold tuning — Wing rounding changed from 50-pt to 100-pt steps to match listed NIFTY strikes. IV regime thresholds adjusted in scanner config. |
arb_bot/scanners/stretched_double_calendar.py
arb_bot/config.py |
| 2026-04-25 |
66ca4d1 |
Modular docs + DCS strategy — Playground documentation split into public/sections/*.html with make build-html. StretchedDoubleCalendarScanner (DCS) strategy added. |
public/_build.py (new)
public/sections/ (all new)
arb_bot/scanners/stretched_double_calendar.py (new) |
Disabled strategies (not in changelog above)
Box Spread was disabled after live testing Apr 16–20 (0/19 fills — IOC too sensitive on BANKNIFTY options OTM legs).
Calendar Spread was disabled after Budget 2026 raised futures STT to 0.05%; round-trip STT alone (~₹1,591/lot) exceeds typical gross (~₹500/lot at 2σ entry).
Battle Log Rejection Visibility June 9, 2026
| Actionable no-trade reasons — Battle Log now renders MDC rows and records MDC concurrency, market-data, regime, and delegated scanner rejection reasons. It also records when the IC fallback is skipped because another primary options position is open. |