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 ''
|
dim_cls = ' ohlc-dim' if dim else ''
|
||||||
if not d:
|
if not d:
|
||||||
return f'<span class="ohlc-cell-empty{dim_cls}">-</span>'
|
return f'<span class="ohlc-cell-empty{dim_cls}">-</span>'
|
||||||
|
extra = '' # 현재가 셀에만 WS 라이브 갱신 마커(data-rt-ohlc-cur) + 전일종가(data-prev) 부착.
|
||||||
if key == 'price':
|
if key == 'price':
|
||||||
# 현재가는 AL(통합) 가격을 양 컬럼 공통으로 표시(동일가). 등락률만 각 시장 전일종가 대비로 분리.
|
# 현재가는 AL(통합) 가격을 양 컬럼 공통으로 표시(동일가). 등락률만 각 시장 전일종가 대비로 분리.
|
||||||
price = al_price or d.get('price', 0)
|
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
|
pct = (price - base) / base * 100
|
||||||
else:
|
else:
|
||||||
pct = d.get('change_pct', 0.0) or 0.0
|
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':
|
elif key == 'close_today':
|
||||||
# 당일종가 — 그 시장이 마감된 뒤에만 그 시장의 종가(=ka10095 price)를 표시. 장중엔 미확정(·).
|
# 당일종가 — 그 시장이 마감된 뒤에만 그 시장의 종가(=ka10095 price)를 표시. 장중엔 미확정(·).
|
||||||
if not closed:
|
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')
|
cls = 'up' if pct > 0 else ('down' if pct < 0 else 'neutral')
|
||||||
sgn = '+' if pct >= 0 else ''
|
sgn = '+' if pct >= 0 else ''
|
||||||
return (
|
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>'
|
f'<span class="ohlc-pct {cls}">{sgn}{pct:.2f}%</span></span>'
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -9314,11 +9316,22 @@ window.openPinModal = openPinModal;
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
// 수신 상태를 화면에 페인팅 — 1초 틱과 패널 swap 직후 재적용이 공유.
|
// 수신 상태를 화면에 페인팅 — 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){
|
function applyState(d){
|
||||||
if(!d || !d.connected) return;
|
if(!d || !d.connected) return;
|
||||||
var codes=codesOnPage();
|
var codes=codesOnPage();
|
||||||
var qs=d.quotes||{}, vis=d.vi||{}, px={};
|
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)); });
|
codes.forEach(function(c){ paintVI(c, !!(vis[c] && vis[c].active)); });
|
||||||
window.__rtPx=px;
|
window.__rtPx=px;
|
||||||
updateScopes(px);
|
updateScopes(px);
|
||||||
|
|||||||
Reference in New Issue
Block a user