--- description: 해외=국장 UI 최대한 동일. 꼭 다를 때만 선보고·승인. 이식 시 summary·저장·브라우저 검증. alwaysApply: true --- # 국내 이식·해외 UI 정합 (절대) ## A. 해외 전략 UI = 국장과 최대한 동일 (선보고) - **기본**: 해외(`US_*`) 웹·Optuna·결과카드·버튼·표(Top5「보기」/폼/적용)·가상거래·차트는 **대응 국장 탭과 같은 UX**. - “해외라서 단축·생략” **임의 판단 금지.** - **꼭 다르게 해야 할 때만** (USD 표시, HTS 없음, 해외 WS 세션, 종목핀 테이블 등): 1. **무엇을·왜** 다르게 하는지 **구현 전 짧게 보고** 2. **사용자 승인 후** 구현 3. UI에 차이(「전역/종목」「USD」) **문구로 명시** - 승인 없이 Optuna Top5·보기·후보선택·PF/수익률·설정저장 흐름을 빼거나 다르게 만들면 **위반**. - 엔진도 국장과 동일이 기본(T−1/T·freeze). 체결가·호가 등 실매 차이도 **선보고**. --- 국내 탭/API를 “그대로 가져왔다”는 **복사만으로는 완료가 아니다.** 해외·신규 탭에서 아래를 **브라우저로 확인**하기 전에는 “정합 OK / 버그 없음”을 **단정하지 마라.** ## 0. 정신 (이 대화에서 실제로 난 사고) - 원인 미확인 상태로 **엔진·cfg 불일치**로 넘기지 마라. UI가 Optuna 폼을 **탭 재클릭/종목 리로드로 DB 핀으로 덮어쓴** 경우처럼, **표시·적용 경로**를 먼저 검증하라. - “국내랑 같은 코드” ≠ “국내랑 같은 화면 숫자.” **summary 키·저장 테이블·버튼 의미**가 하나라도 빠지면 사용자에게는 버그다. - Optuna「보기」없이 1위 단축만 두는 것도 **국장 UI와 다름** → 선보고 없이 하면 위반. ## 1. 웹 백테 summary ↔ 렌더 키 (필수 체크리스트) 국내 `summarize_trades` / 웹 렌더는 키가 다를 수 있다. 이식 시 **응답 JSON과 DOM id를 대조**하라. | 화면 | 흔한 버그 | 올바른 소스 | |------|-----------|-------------| | Profit Factor | `stats.profit_factor` 없음 → **0** | `stats["pf"]` → summary `profit_factor` | | 총 수익률(운용한도) | summary에 미포함 → **0%** | `stats["bot_pct"]` | | 일평균 수익률 | summary에 미포함 → **0%** | `stats["daily_avg_pct"]` | | 누적/일별/사유 차트 | `equity`/`daily`/`reasons` 미포함 → 빈 차트 | 국내 모멘텀/스캘프 웹과 **동일 필드** | | 피크 누적 | context 미표시 | `peak_cum_pnl` / `peak_cum_at` | **완료 전:** 백테 1회 후 PF·bot%·일평균%·PnL·거래수가 **0이 아닌 기대값**(또는 의도적 0)인지 확인. `curl 200` / “거래만 나옴”만으로는 **미완료**. ## 2. 통화·절삭 (해외 USD) - USD PnL·MDD·누적은 **`int()` 절삭 금지.** 소수(센트) 유지. - `summarize_trades`가 `total_pnl`을 int로 돌려도, **해외 응답의 표시용 total_pnl은 거래 합산 float**을 쓸 것. - 운용한도 분모(`total_budget_*`) 단위(USD vs KRW)를 라벨·bot_pct 계산과 **혼동하지 말 것.** ## 3. 저장 대상 분리 (버튼·테이블·문구) | UI | 저장처 | 금지 | |----|--------|------| | **전역 설정 저장** | `config_us_momentum` (`US_MOMENTUM_*`) + env 스냅샷 | 종목행 테이블에 쓰는 척 | | **종목행 적용 / 선택종목 저장** | `us_momentum_stock_config` | 전역 `US_MOMENTUM_*`만 바꾸고 종목핀 됐다고 말하기 | | Optuna 탭(전역) | 전역만 | 종목 cfg에 몰래 쓰기 | | 해외탭 종목 Optuna | 종목 cfg만 | 전역에 적용했다고 말하기 | - 버튼 문구에 **「전역」/「종목」**을 명시하라. (`봇에 설정저장`처럼 모호한 이름 금지 — 이식·신규 시) - help 문구·tooltip에 **테이블명**을 적어라. ## 4. 폼 · Optuna · 종목핀 · 백테 소스 오브 트루스 - **웹 백테 = 폼 값.** DB 종목핀을 몰래 덮어쓰지 마라 (`use_stock_cfg` 명시 시에만). - **폼에 넣기 / 종목행 적용**은 사용자가 고른 후보(보기→선택) 또는 명시된 단축(학습1위)과 **같은 소스**. - Optuna UI는 국장처럼 **Top5 + 보기 + 골라 적용**이 기본. 단축만 두고 보기 생략 = §A 위반. - **폼에 넣기 직후 탭 click / 종목 select**가 폼을 DB로 덮으면 **버그**. 이미 활성 탭이면 재클릭 금지. - upsert 시 Optuna가 안 준 컬럼을 **NULL로 지우지 마라**. ## 5. “고쳤다/같다” 보고 전 최소 검증 1. 해당 탭 **하드 새로고침** (`192.168.0.149:5050` — localhost 금지) 2. **국장 대응 탭과 UI 목록 대조** (빠진 버튼·표·카드가 있으면 미완료 또는 선보고 차이 목록) 3. Optuna → 보기/선택 → 폼/종목행 → 백테 숫자가 **한 세트**로 일치 4. summary: `profit_factor`, `bot_pct`, `daily_avg_pct` + equity/daily/reasons 5. 콘솔 `Uncaught`/`ReferenceError` 없음 하나라도 미확인이면 **안전하다/국내와 동일하다**고 말하지 마라. 잔여 위험을 명시하라.