Handle Zerodha API order rejections gracefully

This commit is contained in:
Thigazhezhilan J 2026-04-05 14:49:34 +05:30
parent 102f145553
commit 6147a2e3e5

View File

@ -373,7 +373,7 @@ class LiveZerodhaBroker(Broker):
user_id: str | None = None, user_id: str | None = None,
run_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: if user_id is not None:
self.user_id = user_id self.user_id = user_id
@ -402,6 +402,7 @@ class LiveZerodhaBroker(Broker):
session = self._session() session = self._session()
tradingsymbol, exchange = self._normalize_symbol(symbol) tradingsymbol, exchange = self._normalize_symbol(symbol)
tag = self._make_tag(logical_time, symbol, side) tag = self._make_tag(logical_time, symbol, side)
rejected_timestamp = _format_utc_ts(logical_time or datetime.utcnow().replace(tzinfo=timezone.utc))
try: try:
placed = place_order( placed = place_order(
@ -420,6 +421,31 @@ class LiveZerodhaBroker(Broker):
) )
except KiteTokenError as exc: except KiteTokenError as exc:
self._raise_auth_expired(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") order_id = placed.get("order_id")
if not order_id: if not order_id: