From 25a01f7f4abce10102d6fe6d68f42b51c22a3223 Mon Sep 17 00:00:00 2001 From: hyowons Date: Thu, 11 Jun 2026 10:45:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B3=B4=EC=9C=A0=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EB=93=80=EC=96=BC=20OHLC=20=EB=AF=B8=EB=8B=88=20=ED=98=84?= =?UTF-8?q?=EC=9E=AC=EA=B0=80/=EB=93=B1=EB=9D=BD=20WS=20=EC=8B=A4=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 듀얼 OHLC 미니(KRX/NXT)의 '현재가' 행이 서버 렌더라 고정이던 것을 WS 라이브로. - 현재가 셀에 data-rt-ohlc-cur + data-prev(각 시장 전일종가) 마커 - paintOhlcCur(code,price): 1초 틱마다 현재가=AL 라이브(양쪽 동일), 등락=셀별 전일종가 대비 재계산. applyState에서 호출. 전일종가/시가/고가/저가/당일종가 행은 그대로(서버 렌더). Co-Authored-By: Claude Opus 4.8 --- agents/stock/workspace/scripts/behive_web.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/agents/stock/workspace/scripts/behive_web.py b/agents/stock/workspace/scripts/behive_web.py index 89ad04a..9b717fc 100644 --- a/agents/stock/workspace/scripts/behive_web.py +++ b/agents/stock/workspace/scripts/behive_web.py @@ -2318,6 +2318,7 @@ def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: st dim_cls = ' ohlc-dim' if dim else '' if not d: return f'-' + extra = '' # 현재가 셀에만 WS 라이브 갱신 마커(data-rt-ohlc-cur) + 전일종가(data-prev) 부착. if key == 'price': # 현재가는 AL(통합) 가격을 양 컬럼 공통으로 표시(동일가). 등락률만 각 시장 전일종가 대비로 분리. price = al_price or d.get('price', 0) @@ -2326,6 +2327,7 @@ def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: st pct = (price - base) / base * 100 else: pct = d.get('change_pct', 0.0) or 0.0 + extra = f' data-rt-ohlc-cur data-prev="{int(base) if base else 0}"' elif key == 'close_today': # 당일종가 — 그 시장이 마감된 뒤에만 그 시장의 종가(=ka10095 price)를 표시. 장중엔 미확정(·). if not closed: @@ -2348,7 +2350,7 @@ def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: st cls = 'up' if pct > 0 else ('down' if pct < 0 else 'neutral') sgn = '+' if pct >= 0 else '' return ( - f'{price:,}원' + f'{price:,}원' f'{sgn}{pct:.2f}%' ) @@ -9314,11 +9316,22 @@ window.openPinModal = openPinModal; }); } // 수신 상태를 화면에 페인팅 — 1초 틱과 패널 swap 직후 재적용이 공유. + // 보유 상세 듀얼 OHLC 미니의 '현재가' 행(KRX/NXT) 라이브 갱신 — 현재가=AL 라이브, 등락=각 셀 전일종가(data-prev) 대비. + function paintOhlcCur(code,price){ + document.querySelectorAll(selByCode(code)).forEach(function(r){ + r.querySelectorAll('[data-rt-ohlc-cur]').forEach(function(cell){ + var pe=cell.querySelector('.ohlc-price'); if(pe) pe.textContent=price.toLocaleString()+'원'; + var prev=parseFloat(cell.getAttribute('data-prev')||'0'); + var pc=cell.querySelector('.ohlc-pct'); + if(pc&&prev>0){ var pct=(price/prev-1)*100; pc.textContent=(pct>=0?'+':'')+pct.toFixed(2)+'%'; pc.classList.remove('up','down','neutral'); pc.classList.add(pct>0?'up':(pct<0?'down':'neutral')); } + }); + }); + } function applyState(d){ if(!d || !d.connected) return; var codes=codesOnPage(); var qs=d.quotes||{}, vis=d.vi||{}, px={}; - Object.keys(qs).forEach(function(c){ px[c]=qs[c].price; paintPrice(c,qs[c]); paintProfit(c,qs[c].price); paintDay(c,qs[c].price); }); + Object.keys(qs).forEach(function(c){ px[c]=qs[c].price; paintPrice(c,qs[c]); paintProfit(c,qs[c].price); paintDay(c,qs[c].price); paintOhlcCur(c,qs[c].price); }); codes.forEach(function(c){ paintVI(c, !!(vis[c] && vis[c].active)); }); window.__rtPx=px; updateScopes(px);