From 721fe9011ca0307dce072010f779ac657e19f795 Mon Sep 17 00:00:00 2001 From: hyowons Date: Tue, 9 Jun 2026 18:31:59 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B3=B4=EC=9C=A0=EC=A2=85=EB=AA=A9=20?= =?UTF-8?q?=EB=93=80=EC=96=BC=20OHLC=20=E2=80=94=20=ED=98=84=EC=9E=AC?= =?UTF-8?q?=EA=B0=80=20AL=20=ED=86=B5=ED=95=A9(=EB=8F=99=EC=9D=BC=EA=B0=80?= =?UTF-8?q?)+=EB=8B=B9=EC=9D=BC=EC=A2=85=EA=B0=80=20=ED=96=89=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 현재가 행: 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 --- agents/stock/workspace/scripts/behive_web.py | 32 ++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) 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.