diff --git a/agents/stock/workspace/scripts/behive_web.py b/agents/stock/workspace/scripts/behive_web.py
index 3945e2e..5cab8f2 100644
--- a/agents/stock/workspace/scripts/behive_web.py
+++ b/agents/stock/workspace/scripts/behive_web.py
@@ -2292,7 +2292,7 @@ def _render_account_kpi(owner: str, label: str, owner_d: dict, balances: dict, j
'''
-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'-'
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'·'
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'{lbl}')
- 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('')
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.