ls증권 히스토리 구독 넣음
This commit is contained in:
@@ -163,6 +163,81 @@ def parse_kiwoom_0d_values(code: str, values: Dict[str, Any]) -> OrderbookSnapsh
|
||||
)
|
||||
|
||||
|
||||
def _ls_level_qty(body: Dict[str, Any], side: str, i: int) -> int:
|
||||
"""LS UH1/H1_/HA_ 잔량 — 통합(UH1)은 krx+nxt+unt 합산, 단일시장은 offerremN."""
|
||||
# H1_/HA_: offerrem1 / bidrem1
|
||||
plain = _abs_int(body.get(f"{side}rem{i}"))
|
||||
if plain > 0:
|
||||
return plain
|
||||
# UH1: krx_offerrem1 + nxt_ + unt_
|
||||
return (
|
||||
_abs_int(body.get(f"krx_{side}rem{i}"))
|
||||
+ _abs_int(body.get(f"nxt_{side}rem{i}"))
|
||||
+ _abs_int(body.get(f"unt_{side}rem{i}"))
|
||||
)
|
||||
|
||||
|
||||
def _ls_total_qty(body: Dict[str, Any], side: str) -> int:
|
||||
"""totofferrem / totoffer — UH1 은 krx_tot* + nxt_ + unt_ 합산."""
|
||||
plain = _abs_int(body.get(f"tot{side}rem"))
|
||||
if plain > 0:
|
||||
return plain
|
||||
return (
|
||||
_abs_int(body.get(f"krx_tot{side}rem"))
|
||||
+ _abs_int(body.get(f"nxt_tot{side}rem"))
|
||||
+ _abs_int(body.get(f"unt_tot{side}rem"))
|
||||
)
|
||||
|
||||
|
||||
def parse_ls_hoga_body(
|
||||
code: str,
|
||||
body: Dict[str, Any],
|
||||
*,
|
||||
source: str = "ls_uh1",
|
||||
) -> OrderbookSnapshot:
|
||||
"""LS 호가잔량 body (UH1/H1_/HA_) → ``OrderbookSnapshot``.
|
||||
|
||||
- 가격: ``offerhoN``(매도)·``bidhoN``(매수) 1~10
|
||||
- 잔량: 단일 ``offerremN`` 또는 통합 ``krx_/nxt_/unt_`` 합
|
||||
"""
|
||||
asks: List[OrderbookLevel] = []
|
||||
bids: List[OrderbookLevel] = []
|
||||
for i in range(1, 11):
|
||||
ask_px = _abs_int(body.get(f"offerho{i}"))
|
||||
bid_px = _abs_int(body.get(f"bidho{i}"))
|
||||
ask_qty = _ls_level_qty(body, "offer", i)
|
||||
bid_qty = _ls_level_qty(body, "bid", i)
|
||||
if ask_px > 0:
|
||||
asks.append(OrderbookLevel(price=ask_px, qty=ask_qty))
|
||||
if bid_px > 0:
|
||||
bids.append(OrderbookLevel(price=bid_px, qty=bid_qty))
|
||||
total_ask = _ls_total_qty(body, "offer")
|
||||
total_bid = _ls_total_qty(body, "bid")
|
||||
if total_bid <= 0 and bids:
|
||||
total_bid = sum(b.qty for b in bids)
|
||||
if total_ask <= 0 and asks:
|
||||
total_ask = sum(a.qty for a in asks)
|
||||
|
||||
hotime = str(body.get("hotime") or "").strip()
|
||||
# hotime 보통 HHMMSS — 당일 날짜 붙여 snap_time
|
||||
snap_time = ""
|
||||
if len(hotime) >= 6 and hotime[:6].isdigit():
|
||||
from datetime import datetime as _dt
|
||||
|
||||
snap_time = _dt.now().strftime("%Y%m%d") + hotime[:6]
|
||||
|
||||
return OrderbookSnapshot(
|
||||
code=str(code).strip(),
|
||||
asks=asks,
|
||||
bids=bids,
|
||||
total_bid_qty=total_bid,
|
||||
total_ask_qty=total_ask,
|
||||
ts=time.time(),
|
||||
source=str(source or "ls_uh1"),
|
||||
snap_time=snap_time,
|
||||
)
|
||||
|
||||
|
||||
class OrderbookCache:
|
||||
"""스레드 세이프 종목별 호가 캐시."""
|
||||
|
||||
@@ -176,6 +251,18 @@ class OrderbookCache:
|
||||
self._data[snap.code] = snap
|
||||
return snap
|
||||
|
||||
def update_from_ls_hoga(
|
||||
self,
|
||||
code: str,
|
||||
body: Dict[str, Any],
|
||||
*,
|
||||
source: str = "ls_uh1",
|
||||
) -> OrderbookSnapshot:
|
||||
snap = parse_ls_hoga_body(code, body, source=source)
|
||||
with self._lock:
|
||||
self._data[snap.code] = snap
|
||||
return snap
|
||||
|
||||
def get(self, code: str, max_age_sec: float = 3.0) -> Optional[OrderbookSnapshot]:
|
||||
c = str(code or "").strip()
|
||||
if not c:
|
||||
|
||||
Reference in New Issue
Block a user