feat: 보유 상세 듀얼 OHLC 미니 현재가/등락 WS 실시간 갱신
듀얼 OHLC 미니(KRX/NXT)의 '현재가' 행이 서버 렌더라 고정이던 것을 WS 라이브로. - 현재가 셀에 data-rt-ohlc-cur + data-prev(각 시장 전일종가) 마커 - paintOhlcCur(code,price): 1초 틱마다 현재가=AL 라이브(양쪽 동일), 등락=셀별 전일종가 대비 재계산. applyState에서 호출. 전일종가/시가/고가/저가/당일종가 행은 그대로(서버 렌더). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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'<span class="ohlc-cell-empty{dim_cls}">-</span>'
|
||||
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'<span class="ohlc-cell{dim_cls}"><span class="ohlc-price">{price:,}원</span>'
|
||||
f'<span class="ohlc-cell{dim_cls}"{extra}><span class="ohlc-price">{price:,}원</span>'
|
||||
f'<span class="ohlc-pct {cls}">{sgn}{pct:.2f}%</span></span>'
|
||||
)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user