From 6147a2e3e5456e2d90a860f66f412efe57b28246 Mon Sep 17 00:00:00 2001 From: Thigazhezhilan J Date: Sun, 5 Apr 2026 14:49:34 +0530 Subject: [PATCH] Handle Zerodha API order rejections gracefully --- .../engine/broker.py | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/indian_paper_trading_strategy/engine/broker.py b/indian_paper_trading_strategy/engine/broker.py index 3241cbf..21f61e6 100644 --- a/indian_paper_trading_strategy/engine/broker.py +++ b/indian_paper_trading_strategy/engine/broker.py @@ -373,7 +373,7 @@ class LiveZerodhaBroker(Broker): user_id: str | None = None, run_id: str | None = None, ): - from app.services.zerodha_service import KiteTokenError, place_order + from app.services.zerodha_service import KiteApiError, KiteTokenError, place_order if user_id is not None: self.user_id = user_id @@ -402,6 +402,7 @@ class LiveZerodhaBroker(Broker): session = self._session() tradingsymbol, exchange = self._normalize_symbol(symbol) tag = self._make_tag(logical_time, symbol, side) + rejected_timestamp = _format_utc_ts(logical_time or datetime.utcnow().replace(tzinfo=timezone.utc)) try: placed = place_order( @@ -420,6 +421,31 @@ class LiveZerodhaBroker(Broker): ) except KiteTokenError as exc: self._raise_auth_expired(exc) + except KiteApiError as exc: + return { + "id": _deterministic_id( + "live_rej", + [ + symbol, + side, + _stable_num(quantity), + _stable_num(requested_price or 0.0), + getattr(exc, "error_type", "kite_error"), + ], + ), + "symbol": symbol, + "side": side, + "qty": qty, + "requested_qty": qty, + "filled_qty": 0, + "price": float(requested_price or 0.0), + "requested_price": float(requested_price or 0.0), + "average_price": 0.0, + "status": "REJECTED", + "timestamp": rejected_timestamp, + "status_message": getattr(exc, "message", str(exc)), + "error_type": getattr(exc, "error_type", None), + } order_id = placed.get("order_id") if not order_id: