github marketcalls/openalgo openalgo-stability-fix
v2.0.0.4

7 hours ago

Version 2.0.0.4 Released

Date: 16th Apr 2026

Feature Release: Exchange-Aware /python Strategies, Event-Driven Dashboard, Compound Rate Limits, Structured Error Logging & Broker Fixes

This is a feature release featuring 41 commits (excluding auto-builds) from 6 contributors, focused on making /python strategy hosting exchange-aware with per-strategy holiday calendars, replacing polling with event-driven SocketIO refresh across trading pages, adding structured JSON error logging, sandbox performance optimization, compound rate limit support, and broker-specific fixes for Motilal, Groww, Zebu, Flattrade, and Definedge.


Highlights

  • Exchange-Aware /python Strategies — Each strategy now carries its own exchange (NSE/BSE/NFO/BFO/MCX/BCD/CDS/CRYPTO). The host gates start/stop using that exchange's holiday calendar — MCX strategies keep running on NSE/BSE holidays during the MCX evening session, CRYPTO strategies ignore all holidays, and SPECIAL_SESSION entries (Muhurat, DR-drill) override weekend rejects. No migration needed for existing strategies.
  • Event-Driven Dashboard & Trading Pages — Dashboard, OrderBook, TradeBook, Positions, and Holdings now refresh instantly via SocketIO events instead of polling every 30 seconds. Faster updates, less server load.
  • Compound Rate Limits — Rate limit settings now support Flask-Limiter's compound syntax (e.g., "10 per second;40 per minute"), matching broker-specific API limits like Flattrade's order rate.
  • Structured JSON Error Log — New log/errors.jsonl with timestamped JSON entries containing full traceback, logger name, source file:line, and Flask request context for every ERROR+ event.
  • Sandbox Performance Optimization — Basket orders, split orders, and options multi-orders now pre-fetch quotes in bulk via multiquotes — fewer API calls, faster paper trading execution.
  • Motilal Broker Fixes — MARKET/SL-M order handling, get_holdings, tick_size, WebSocket FD/thread leak fixes, and shared NSE_INDEX/BSE_INDEX symbol normalization.
  • Eventlet asyncio Guard — Real OS threads for asyncio event loops under eventlet, plus runtime event loop guards for Zebu, Flattrade, and Definedge to prevent asyncio.run() crashes in Docker.

New Features

Exchange-Aware /python Strategy Hosting

  • Each strategy picks its own exchange via a new UI dropdown (NSE/BSE/NFO/BFO/MCX/BCD/CDS/CRYPTO)
  • Host gates start/stop using the strategy's exchange holiday calendar, not a hardcoded NSE check
  • MCX strategies run on NSE/BSE holidays during MCX's per-date session window (e.g., 17:00-23:55 on 14-Apr-2026)
  • CRYPTO strategies run 24/7, skip all holiday checks
  • SPECIAL_SESSION rows (Sunday Muhurat, Saturday DR-drill) override weekend rejects per-exchange
  • is_within_schedule_time intersects user's schedule with the exchange's effective session window
  • New OPENALGO_STRATEGY_EXCHANGE env var injected into every strategy subprocess
  • Legacy strategies auto-backfilled to exchange=NSE on first load — zero migration required
  • Exchange badge displayed on the strategy card in the /python dashboard
  • Smart defaults on upload: CRYPTO pre-fills 24/7 + all 7 days, MCX pre-fills 09:00-23:55
  • Resource limits guide (strategies/RESOURCE_LIMITS.md) documenting per-strategy memory, FD, CPU, and log caps

Event-Driven Dashboard Refresh

  • Replace 30-second polling with SocketIO event-driven refresh on Dashboard
  • Replace polling with event-driven refresh on OrderBook, TradeBook, Positions, Holdings, and Funds pages
  • Type ORDER_BOOK_EVENTS as OrderEventType[] and wire into useOrderEventRefresh

Structured Error Logging

  • New log/errors.jsonl — structured JSON Lines, ERROR+ only, with timestamp, module, source file:line, traceback, and Flask request context
  • Replace all manual traceback.print_exc() with logger.exception() across REST API, brokers, and websocket_proxy
  • Add missing error logging to silent exception handlers

Compound Rate Limits

  • Support semicolon-delimited compound rate limits in .env validation (e.g., ORDER_RATE_LIMIT="10 per second;40 per minute")
  • Updated .sample.env and rate-limiting documentation with compound syntax examples

Sandbox Performance

  • Pre-fetch quotes via multiquotes for sandbox basket orders
  • Pre-fetch quote once for sandbox split orders
  • Pre-fetch quotes via multiquotes for sandbox options multiorder

Bug Fixes

  • Fix: correct get_open_position exchange match in Groww smart orders (#1255)
  • Fix: clean up logs_session for non-banned IPs in SecurityMiddleware (#1256)
  • Fix: platform-aware health monitor FD thresholds + null-safe UI
  • Fix: move startup banner to print when server is actually ready
  • Fix: set HOME in systemd service so Telegram /chart works on Linux
  • Fix: revert StaticPool to NullPool and fix missing datetime import (SQLite connection handling)
  • Fix: duplicate rows on sort in TradeBook; use ArrowUp/ArrowDown for sort indicators
  • Fix: add missing HEALTH_DATABASE_URL to .sample.env and install-multi.sh

Broker Fixes

  • Motilal: MARKET/SL-M order handling, get_holdings, tick_size, plug FD/thread leaks in WebSocket adapter, shared NSE_INDEX/BSE_INDEX symbol normalization (#1259)
  • Zebu/Flattrade/Definedge: auto-detect eventlet to prevent asyncio.run() crash in Docker
  • Runtime event loop guard for async batch quotes across brokers
  • Real OS threads for asyncio event loops under eventlet (websocket proxy + client)

/python Strategy Fixes

  • Inject documented env vars (OPENALGO_API_KEY, STRATEGY_ID, STRATEGY_NAME) into strategy subprocess (#1247)
  • Improve reliability and FD hygiene for long-running strategies (#1258)
  • Document .env inheritance for strategies and fix OPENALGO_API_KEY references
  • Rewrite /python/guide with exchange-aware scheduling, env vars, and updated sample strategy

Frontend Enhancements

  • Client-side sorting for TradeBook and OrderBook (#1240)
  • Exchange dropdown and badge in /python strategy pages
  • CRYPTO smart-defaults (24/7 + all 7 days) on strategy upload

Documentation

  • Resource limits guide (strategies/RESOURCE_LIMITS.md) — per-strategy memory, FD, CPU, process, and log limits with realistic usage numbers and server sizing table
  • Updated strategies/README.md — exchange-aware gating, env var precedence (HOST_SERVER vs OPENALGO_HOST), worked examples (14-Apr-2026, Sunday Muhurat), troubleshooting, and migration notes
  • Enhanced CLAUDE.md with architectural context for Claude Code
  • Updated rate-limiting docs with compound syntax

Security

  • Update pillow, pytest, follow-redirects for dependabot alerts
  • Compound rate limit support prevents misconfigured single-limit workarounds

Contributors

Special thanks to all contributors who made this release possible:

  • @marketcalls (Rajandran) — Exchange-aware /python strategies, event-driven dashboard, sandbox optimization, structured error logging, compound rate limits, version management
  • @Kalaiviswa (Kalaivani) — Eventlet asyncio guards, Zebu/Flattrade/Definedge fixes, /python guide rewrite, real OS thread migration
  • @iAbhi001 — Client-side sorting for TradeBook and OrderBook
  • @Sadhanandhann — StaticPool investigation for traffic logs DB
  • @mvanhorn (Mallikharjuna) — Replace traceback.print_exc() with logger.exception() across brokers

Upgrade

# Pull latest
cd /path/to/openalgo
git pull origin main

# Sync dependencies
uv sync

# Rebuild frontend (if running locally)
cd frontend && npm install && npm run build && cd ..

# Restart
# Docker: docker compose down && docker compose up -d
# Systemd: sudo systemctl restart openalgo

For existing /python strategies trading MCX or CRYPTO: open each strategy → Schedule → pick the correct exchange from the new dropdown → Save. NSE strategies need no changes.


Links


Don't miss a new openalgo release

NewReleases is sending notifications on new releases.