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:
@@ -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':
|
||||
# 현재가는 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)
|
||||
pct = d.get('change_pct', 0.0) or 0.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.
|
||||
|
||||
Reference in New Issue
Block a user