ls증권 히스토리 구독 넣음

This commit is contained in:
Your Name
2026-07-30 18:05:07 +09:00
parent 61bec4bd1d
commit 67eab24603
1593 changed files with 135733 additions and 1232 deletions

View File

@@ -43,3 +43,5 @@ print({m: len(a) for m, a in fn().items()} if callable(fn) else "no _scalp_grids
- “한 번에 여러 전략 import + 조건부 트릭”보다 **짧은 확정 코드 1회**.
- 실패 로그를 사용자에게 길게 반복 붙여 넣지 말 것. 고치고 결과만 보고.
- ImportError/AttributeError 시 비슷한 심볼명 추측 재실행 금지 → Grep 1회 (`invalidate_merged_env_cache` 등).
- 상세 절대규칙: `.cursorrules` CRITICAL §4.

View File

@@ -48,3 +48,9 @@ rows = db.conn.execute(
("20260712%",),
).fetchall()
```
## 5. env 신규 키 — “patch했다” ≠ DB에 남음 (`.cursorrules` CRITICAL §4-3)
- `MOMENTUM_*` 등은 `config_momentum` 키 목록·컬럼에 없으면 `apply_env_patch` 후에도 `get_env_from_db`가 빈값일 수 있음.
- 신규 키: ENV_CONFIG_KEYS(또는 전략 키 튜플) + code default + apply 맵 + 저장 후 **재조회 검증**.
- 캐시 무효: `invalidate_merged_env_cache()` (이름 추측 금지).

View File

@@ -0,0 +1,81 @@
---
description: 해외=국장 UI 최대한 동일. 꼭 다를 때만 선보고·승인. 이식 시 summary·저장·브라우저 검증.
alwaysApply: true
---
# 국내 이식·해외 UI 정합 (절대)
## A. 해외 전략 UI = 국장과 최대한 동일 (선보고)
- **기본**: 해외(`US_*`) 웹·Optuna·결과카드·버튼·표(Top5「보기」/폼/적용)·가상거래·차트는 **대응 국장 탭과 같은 UX**.
- “해외라서 단축·생략” **임의 판단 금지.**
- **꼭 다르게 해야 할 때만** (USD 표시, HTS 없음, 해외 WS 세션, 종목핀 테이블 등):
1. **무엇을·왜** 다르게 하는지 **구현 전 짧게 보고**
2. **사용자 승인 후** 구현
3. UI에 차이(「전역/종목」「USD」) **문구로 명시**
- 승인 없이 Optuna Top5·보기·후보선택·PF/수익률·설정저장 흐름을 빼거나 다르게 만들면 **위반**.
- 엔진도 국장과 동일이 기본(T1/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` 없음
하나라도 미확인이면 **안전하다/국내와 동일하다**고 말하지 마라. 잔여 위험을 명시하라.

View File

@@ -0,0 +1,45 @@
---
description: 백테·Optuna·파람서치에서 OHLC 폴백으로 체결·고점·PnL 숫자 변조 절대 금지
alwaysApply: true
---
# OHLC 폴백 숫자 변조 절대 금지 (실매↔백테 정합)
## 한 줄
틱 청산/틱 진입 ON 이면 **봉 OHLC(high/low)로 체결가·max_price·손익을 채우거나 보정하지 않는다.**
체크박스·env `*_TICK_FALLBACK_OHLC=true` 여도 **엔진은 무시**한다. Optuna/파람은 **강제 False**.
## 왜
실매는 WS 틱만으로 고점·청산을 본다.
백테가 틱 전에 3분봉 `high`를 `max_price`에 넣거나, 틱 없을 때 OHLC intrabar로 래칫/손절을 내면 **미래 고점 look-ahead·유령 청산**으로 실매와 다른 엔진이 된다.
## 절대 금지
- 틱 청산 루프에서 `pos["max_price"] = max(..., bar.high / holding_peak)` **선반영**
- `tick_fallback_ohlc or is_eod` 로 EOD에 OHLC 폴백 **강제**
- Optuna / Grid 파람 / 웹백테가 OHLC 폴백 ON 으로 **랭킹·PnL 변조**
- “틱 없으면 OHLC로라도 거래 수 맞추기”
## 허용
- 틱 청산 **OFF** 인 레거시 순수 OHLC 모드 (폴백이 아님 — 봉이 본체)
- EOD: 틱 미청산 시 **직전가/종가로 장마감 플랫만** (봉 고저로 래칫 재계산 금지)
## 해외 모멘텀 — 국장과 “다르게 설계”한 게 아님 (오해 금지)
- **실매**: 국장·해외 모두 WS 현재가(틱 캐시)로 청산 판정 (`check_sell_signal_momentum_live`). DB `ws_ticks` 테이블을 장중 리플레이하지 않음.
- **백테/Optuna**: 동일 `momentum_backtest_*` 경로. `market=US` 이면 **`ws_ticks_us`** (국장은 `ws_ticks`). 틱 ON 기본 · OHLC로 고점/체결 변조 금지(본 규칙).
- “해외=순수 분봉·틱청산 해당 없음”은 **잘못된 메모**다. 틱+OHLC 혼입 버그 점검에서 해외를 빼 말하면 **안 된다** — 국장과 같은 정합 규칙을 적용한다.
## 구현 앵커
- `resolve_backtest_sell`: `use_tick_exit` → OHLC 폴백 무시
- `tail_engine` Phase1: 틱 ON 시 봉 high 로 max 선반영 금지
- Optuna/파람: `backtest_tick_fallback_ohlc = False` 강제
- UI: `*_FALLBACK_OHLC` / 꼬리 체크 = **빨간 음영** (위험 표시)
## 보고
고치기 전 “폴백으로 맞추자”고 제안하지 말 것. 잔여 갭은 **틱 공백·체결 슬리피지·미청산 보유**로 분류.