feat: 보유종목 듀얼 OHLC — 현재가 AL 통합(동일가)+당일종가 행 추가

- 현재가 행: AL(통합) 현재가를 KRX·NXT 양 컬럼에 공통 표시(동일가).
  등락률만 각 시장 전일종가 대비로 분리 → 가격 같고 % 다름.
- 당일종가 행 신설: 그 시장이 마감된 뒤에만(KRX 15:30·NXT 20:00 이후)
  해당 시장 종가+등락 표시, 장중엔 '·'(미확정).
- _render_ohlc_mini_dual에 al_price·krx_closed·nxt_closed 파라미터 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hyowons
2026-06-09 18:31:59 +09:00
parent 891bc274dc
commit 721fe9011c
+26 -6
View File
@@ -2292,7 +2292,7 @@ def _render_account_kpi(owner: str, label: str, owner_d: dict, balances: dict, j
</section>'''
def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: str = 'none') -> str:
def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: str = 'none', al_price: int = 0, krx_closed: bool = False, nxt_closed: bool = False) -> str:
"""보유종목 자세히 보기용 OHLC mini-table — KRX/NXT 두 거래소 가격·등락률 분리 표시.
dict: {open, high, low, price, change_pct} (price=종가/현재가, change_pct=직전 영업일 종가 대비).
@@ -2314,13 +2314,25 @@ def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: st
nxt = dict(nxt)
nxt['open'] = nxt_baseline
def _cell(d: dict | None, key: str, dim: bool) -> str:
def _cell(d: dict | None, key: str, dim: bool, closed: bool = False) -> str:
dim_cls = ' ohlc-dim' if dim else ''
if not d:
return f'<span class="ohlc-cell-empty{dim_cls}">-</span>'
if key == 'price':
price = d.get('price', 0)
# 현재가는 AL(통합) 가격을 양 컬럼 공통으로 표시(동일가). 등락률만 각 시장 전일종가 대비로 분리.
price = al_price or d.get('price', 0)
base = (d.get('prev_close', 0) or 0) if al_price else 0
if al_price and base:
pct = (price - base) / base * 100
else:
pct = d.get('change_pct', 0.0) or 0.0
elif key == 'close_today':
# 당일종가 — 그 시장이 마감된 뒤에만 그 시장의 종가(=ka10095 price)를 표시. 장중엔 미확정(·).
if not closed:
return f'<span class="ohlc-cell-empty{dim_cls}">·</span>'
price = d.get('price', 0)
base = d.get('prev_close', 0) or 0
pct = ((price - base) / base * 100) if base else (d.get('change_pct', 0.0) or 0.0)
elif key == 'prev_close':
# 전 거래일 종가 — baseline 자체라 등락률 표시 없음.
price = d.get('prev_close', 0)
@@ -2354,8 +2366,9 @@ def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: st
nxt_dim = False
rows = [
('전일종가', 'prev_close'),
('현재가', 'price'),
('당일종가', 'close_today'),
('전일종가', 'prev_close'),
('시가', 'open'),
('고가', 'high'),
('저가', 'low'),
@@ -2370,8 +2383,8 @@ def _render_ohlc_mini_dual(krx: dict | None, nxt: dict | None, active_market: st
]
for lbl, key in rows:
parts.append(f'<span class="ohlc-rl">{lbl}</span>')
parts.append(_cell(krx if has_krx else None, key, krx_dim))
parts.append(_cell(nxt if has_nxt else None, key, nxt_dim))
parts.append(_cell(krx if has_krx else None, key, krx_dim, krx_closed))
parts.append(_cell(nxt if has_nxt else None, key, nxt_dim, nxt_closed))
parts.append('</div>')
return ''.join(parts)
@@ -2657,10 +2670,17 @@ def _render_holding_row(r: dict, total_value: int, show_day_change: bool = False
_nxt_px = ohlc_nxt_for_render.get('price', 0) or 0
ohlc_nxt_for_render['change'] = _nxt_px - _snap_prev
ohlc_nxt_for_render['change_pct'] = ((_nxt_px - _snap_prev) / _snap_prev * 100) if _snap_prev else 0.0
# 당일종가: KRX는 정규장 마감(15:30) 후, NXT는 마감(20:00) 후에만 그 시장 종가 표시.
_now_ohlc = datetime.now(KST)
_hm_ohlc = _now_ohlc.hour * 60 + _now_ohlc.minute
_trd_ohlc = _market_phase_state().get('phase') not in ('holiday', 'weekend')
ohlc_mini_html = _render_ohlc_mini_dual(
ohlc_krx_for_render,
ohlc_nxt_for_render,
active_market=mark.lower(),
al_price=price, # 현재가 행은 AL(통합) 현재가를 양 컬럼 공통 — 등락률만 각 시장 전일종가 대비.
krx_closed=_trd_ohlc and _hm_ohlc >= 15 * 60 + 30,
nxt_closed=_trd_ohlc and _hm_ohlc >= 20 * 60,
)
# 미리보기 등락은 rebase 후 day_change_pct 사용 — 어제 NXT 종가 baseline.