대시보드 수정및 전략수정중

This commit is contained in:
2026-02-27 11:22:44 +09:00
parent 38ff312321
commit 4de03bad67
9 changed files with 159 additions and 65 deletions

View File

@@ -225,9 +225,11 @@ def _parse_realtime_message(raw: str) -> Optional[dict]:
"timestamp": fields[1] if len(fields) > 1 else "",
}
if tr_id == TR_QUOTE and len(fields) >= 20:
# H0STASP0: [0]=종목코드, [3~7]=매도호가1~5, [8~12]=매수호가1~5
# [13~17]=매도잔량1~5, [18~22]=매수잔량1~5
if tr_id == TR_QUOTE and len(fields) >= 38:
# H0STASP0 실제 포맷 (KIS 개발가이드 기준):
# [0]=종목코드, [1]=영업시간, [2]=시간구분코드
# [3~12]=매도호가1~10, [13~22]=매수호가1~10
# [23~32]=매도호가잔량1~10, [33~42]=매수호가잔량1~10
def _f(i: int): return _safe_float(fields[i]) if len(fields) > i else None
def _i(i: int): return _safe_int(fields[i]) if len(fields) > i else None
return {
@@ -235,11 +237,11 @@ def _parse_realtime_message(raw: str) -> Optional[dict]:
"tr_id": tr_id,
"stock_code": fields[0],
"ask1": _f(3), "ask2": _f(4), "ask3": _f(5), "ask4": _f(6), "ask5": _f(7),
"bid1": _f(8), "bid2": _f(9), "bid3": _f(10), "bid4": _f(11), "bid5": _f(12),
"ask_qty1": _i(13), "ask_qty2": _i(14), "ask_qty3": _i(15),
"ask_qty4": _i(16), "ask_qty5": _i(17),
"bid_qty1": _i(18), "bid_qty2": _i(19), "bid_qty3": _i(20),
"bid_qty4": _i(21), "bid_qty5": _i(22),
"bid1": _f(13), "bid2": _f(14), "bid3": _f(15), "bid4": _f(16), "bid5": _f(17),
"ask_qty1": _i(23), "ask_qty2": _i(24), "ask_qty3": _i(25),
"ask_qty4": _i(26), "ask_qty5": _i(27),
"bid_qty1": _i(33), "bid_qty2": _i(34), "bid_qty3": _i(35),
"bid_qty4": _i(36), "bid_qty5": _i(37),
}
return None
@@ -294,6 +296,11 @@ class KisRealtimeStream:
self._ws = None
self._running = False
self._approval_key: Optional[str] = None
self._sync_event: asyncio.Event = asyncio.Event()
def notify_subscription_change(self):
"""구독 목록 변경 시 즉시 KIS 동기화 트리거 (set_subscriptions 호출 직후 사용)"""
self._sync_event.set()
async def _ensure_approval_key(self) -> bool:
"""approval_key 확보. 없으면 REST API 호출."""
@@ -429,8 +436,9 @@ class KisRealtimeStream:
# ── 4단계: 데이터 수신 루프 ──────────────────────────
async for raw_msg in ws:
# 주기적 구독 동기화
if time.monotonic() - last_sync >= _SYNC_INTERVAL:
# 주기적 구독 동기화 (10초 주기 OR 구독 변경 즉시)
if self._sync_event.is_set() or time.monotonic() - last_sync >= _SYNC_INTERVAL:
self._sync_event.clear()
await self._sync_subscriptions(ws)
last_sync = time.monotonic()