fix(ws): KIS/키움 WS·조건검색 안정화 및 매도시세 폴백

WS 매니저 spill·조건검색 CNSR 회복·kiwoom_ws_diag 진단 경로를 보강한다.
live_sell_price stale RAM/REST 폴백 정합을 유지한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Your Name
2026-08-28 16:46:37 +09:00
parent 1387fbdf47
commit d737deb47c
6 changed files with 263 additions and 20 deletions

View File

@@ -49,6 +49,7 @@ from typing import Any, Dict, List, Optional, Set
from .condition_manager import ConditionSearchManager
from ..utils.env import get_env_bool, get_env_float, get_env_from_db, get_env_int
from ..utils.logger import get_logger
from ..ws.kiwoom_ws_diag import log_kiwoom_api_msg, log_kiwoom_ws
from ..ws.kis_ws import _get_kiwoom_token_cached
logger = get_logger("kis_trader.kwcond")
@@ -350,19 +351,26 @@ class KiwoomConditionSearchManager(ConditionSearchManager):
ev.set()
def _on_shared_trnm(self, ws, msg: dict) -> None:
trnm = msg.get("trnm")
trnm = str(msg.get("trnm") or "")
log_kiwoom_api_msg(logger, trnm or "?", msg, prefix="조건검색")
if trnm == "CNSRLST":
self._handle_condition_list(ws, msg.get("data") or [])
elif trnm == "CNSRREQ":
self._handle_cnsrreq(msg)
elif trnm == "CNSRCLR":
seq_val = _extract_cnsr_seq(msg)
logger.debug(
"키움 조건검색 CNSRCLR 응답: seq=%s rc=%s msg=%s",
seq_val,
msg.get("return_code"),
msg.get("return_msg"),
)
rc = msg.get("return_code")
rm = msg.get("return_msg")
if str(rc or "").strip() not in ("0", "0.0", ""):
logger.warning(
"키움 CNSRCLR 실패 seq=%s rc=%s msg=%s",
seq_val, rc, rm,
)
else:
logger.info(
"키움 CNSRCLR OK seq=%s rc=%s msg=%s",
seq_val, rc, rm,
)
self._trigger_cnsrclr_ack(seq_val)
def _on_shared_real(self, ws, msg: dict) -> None:
@@ -592,6 +600,13 @@ class KiwoomConditionSearchManager(ConditionSearchManager):
ws.send(json.dumps(payload))
return True
except Exception as e:
log_kiwoom_ws(
logger, "cnsrreq_send_fail",
level="warning",
trnm="CNSRREQ",
extra=f"seq={seq} err={e}",
force=True,
)
logger.warning("키움 CNSRREQ 발송 실패 (seq=%s): %s", seq, e)
return False