ls증권 히스토리 구독 넣음
This commit is contained in:
101
.cursorrules
101
.cursorrules
@@ -83,7 +83,12 @@
|
||||
- 21. 백테 웹페이지 탭 ui 수정시 다른 전략 탭도 모두 수정되어야 한다.
|
||||
- 가상거래내역, 실거래내역 ui 는 모두 동일해야한다.
|
||||
- 22. **봉 정합 다음 할 일**은 `docs/정합성.md` §8 (깨끗한 장일 검증 → 웹백테 1회 → §5 체크). 새 ±1 보정·freeze OFF로 “해결”하지 말 것.
|
||||
# [CRITICAL SYSTEM DIRECTIVES: 절대 엄수 사항 - 위반 시 작동 중지]
|
||||
- 23. **키움/KIS 인프라** — CRITICAL §3 (유량≠빈응답, approval 공유, REST/키발급 한도 준수, 시세실키≠매매모의, REST 웜업 1차→실패시만 증량).
|
||||
- 24. **에이전트 테스트·adhoc 뻘짓 금지** — CRITICAL §4 (스키마 먼저, import/캐시 실명, env 키=config 테이블 등록, 실패 1회만).
|
||||
- 25. **의심·불확실 시 근본원인 먼저** — CRITICAL §5 (MCP·`docs/`·공식 API 문서·기존 SafeRequest/세마포어부터. 추측 패치·한도 무시 재시도 금지).
|
||||
- 26. **국내→해외/탭 이식 — 복붙 ≠ 완료** — CRITICAL §6 (summary 키·전역/종목 저장·폼 덮어쓰기·브라우저 검증). 상세: `.cursor/rules/domestic-port-ui-parity.mdc`
|
||||
- 27. **해외 전략 UI = 국장과 최대한 동일** — CRITICAL §6-1. 꼭 다르게 해야 하면 **구현 전 선보고·승인**. 임의로 생략·단축 금지.
|
||||
# [CRITICAL SYSTEM DIRECTIVES: 절대 엄수 사항 - 위반 시 작업 중지]
|
||||
|
||||
## 0. 🚨 봉 정합·진입 정렬 — 절대 금지 (위반 시 작업 중지)
|
||||
- **신호 = T−1 확정봉, 진입 = T (시가/첫 틱).** `live_backtest_align=True` 잠금.
|
||||
@@ -92,6 +97,9 @@
|
||||
- **`WS_CANDLE_FREEZE_ON_CONFIRM` 끄기(false) 절대 금지.** 사용자 **명시 승인** 없이 DB/기본값을 false·레거시 덮어쓰기로 되돌리지 마라.
|
||||
- **`*_SKIP_HTS_SCAN_DUPES` 를 true로 바꾸기 절대 금지.** (TAIL/MOMENTUM/BREAKOUT/SCALP 포함)
|
||||
사용자가 명시하기 전까지 **false / 0 유지**. “HTS와 맞추려고” true로 바꾸지 마라. (상세: 항목 16 · `hts-condition-grids.mdc`)
|
||||
- **OHLC 폴백으로 숫자 변조 절대 금지.** 틱 청산/진입 ON 이면 봉 OHLC(high/low)로 체결·`max_price`·PnL을 채우지 마라.
|
||||
EOD에 OHLC 폴백 강제·틱 전 봉 high 선반영 = 실매와 다른 엔진. Optuna/파람/웹백테는 `*_TICK_FALLBACK_OHLC` **강제 OFF**.
|
||||
UI에 남은 폴백 체크는 **빨간 위험 표시**일 뿐, 켜서 정합 “맞추기” 금지. (상세: `no-ohlc-fallback-parity.mdc`)
|
||||
|
||||
## 1. 🚨 하드코딩 절대 금지 (NO HARDCODING)
|
||||
- 어떠한 경우에도 코드 내부에 임계값, 비율, 점수, 시간 등의 수치를 직접 하드코딩하지 마라.
|
||||
@@ -103,6 +111,97 @@
|
||||
- 사용자가 "A를 매수 체크 로직으로 옮겨"라고 지시하면, 단순히 A만 옮기지 마라. 사용자의 의도는 **"스캔(Scan) 단계에서는 조건 필터링을 최소화하여 후보를 DB에 최대한 많이 올리고, 실제 매수 직전(Trigger)에 모든 엄격한 필터(보조지표, 호가, 수급 등)를 한 번에 검사하라"**는 뜻이다.
|
||||
- 무거운 연산(API 추가 호출, 분봉 분석 등)은 절대 5분 주기 스캔 함수에 넣지 말고, 매수 타점 체크 함수에 넣어라.
|
||||
|
||||
## 3. 🚨 키움/KIS 인프라 — 유량·approval·REST/키발급 한도 (위반 시 폭주/키 무효)
|
||||
### 3-0. REST·키 발급 한도 — 서버·계정 부하 금지 (필수)
|
||||
- 작성·수정하는 코드·진단·스모크·adhoc는 **키움/한투 REST 초당·일일 유량, WS 구독 한도, OAuth·approval·접근토큰 발급 횟수**를 어기지 않게 설계한다.
|
||||
- REST는 가능하면 **WS/캐시/DB 재사용**. 루프·재큐·벌크·Optuna prepare에서 한도 무시 연타 금지. `SafeRequest`·기존 세마포어·sleep·쿨다운을 **우회하는 새 경로**를 만들지 마라.
|
||||
- **토큰/approval을 “안 되면 다시 발급”으로 때우지 마라.** 공유 캐시·만료 전 재사용·응급 하드캡(§3-2)을 지킨다. 진단 스크립트도 실매와 동일하게 한도를 존중한다.
|
||||
- 한도·에러코드·도메인(실전/모의 REST·WS URL)이 헷갈리면 **추측하지 말고** §5(문서·MCP)로 확인한 뒤 구현한다. (`docs/계정.md` 등)
|
||||
|
||||
### 3-1. API 에러 ≠ 데이터 없음
|
||||
- 키움 `return_code=5`(유량/한도) 등을 “빈 봉·조회 실패”로 취급해 재큐·재시도를 무한히 돌리지 마라.
|
||||
- 유량/429/한도는 **백오프·세마포어·실패 상한 후 재큐 정지**가 필수. “고쳤다” 보고 전 API 폭주 여부를 로그로 확인하라.
|
||||
|
||||
### 3-2. approval 키는 단일 공유
|
||||
- KIS Websocket `approval_key`는 국내·해외·검증 경로가 **같은 KISApprovalManager(공유 캐시)** 를 쓴다.
|
||||
- 모듈/재시작마다 REST로 approval을 새로 받아 타 연결을 무효화하는 코드 금지.
|
||||
- 응급 재발급은 **하드캡(기본 6h 1회)** 없이 돌리지 마라.
|
||||
|
||||
### 3-3. 시세 실키 vs 매매 모의
|
||||
- 진단·스모크가 `KIS_MOCK`만 보고 “전체가 모의”라고 단정하지 마라.
|
||||
- 시세(키움/한투 WS) 실키 강제와 매매 모의는 분리해서 보고·검증하라.
|
||||
|
||||
### 3-4. 백테 REST 웜업 — 평소 최소, 실패 시에만 증량
|
||||
- 전일 장시작 시가 보강 REST는 **짧은 1차(기본 700)** 만 기본으로 한다.
|
||||
- **전일(직전 세션) 장시작이 안 잡힐 때만** 긴 2차(기본 1500)를 **해당 종목 1회** 재시도한다. 전 종목·전 trial에 장봉을 상시 올리지 마라.
|
||||
- Optuna/그리드 trial 경로에서 prepare 이후 **캐시 hit·영구실패면 INFO 로그·REST 재호출 금지**.
|
||||
|
||||
### 3-5. Optuna 새 mode / apply 누락
|
||||
- Grid에 없는 mode(`tpe` 등)를 추가하면 `grids[mode]` **재조회·가정**을 전부 제거하고, 실행 1회로 KeyError 없는지 확인하라.
|
||||
- `--apply-best`/JSON 적용 시 Optuna가 탐색한 축(`setup_*` 등)이 apply 패치·`config_*` 키 목록에 **빠지지 않았는지** 확인. 신규 env 키는 code default + DB 컬럼/키 등록을 한 세트로 한다.
|
||||
|
||||
## 4. 🚨 에이전트 테스트·adhoc·셸 — 뻘짓·토큰 낭비 금지
|
||||
대화에서 실제로 낭비된 패턴을 **반복하지 마라.** 상세: `.cursor/rules/db-adhoc-query-safety.mdc`, `agent-shell-python-safety.mdc`.
|
||||
|
||||
### 4-1. DB — 추측 SELECT/컬럼 금지
|
||||
- SQL 전 **반드시** `SHOW COLUMNS FROM <table>` (또는 DESCRIBE). “있을 것 같다”로 `strategy_id` 등 SELECT 금지.
|
||||
- 대표: `target_candidates`에 **strategy_id 없음**. DDL/문서와 실DB가 다를 수 있음 → 스키마가 진실.
|
||||
- PyMySQL: SQL 문자열 `%`는 포맷 → `LIKE '20260712%'` 금지. `LIKE %s` + `('20260712%',)` 또는 `%%`.
|
||||
- `Unknown column` / `not enough arguments for format string` 나면 **원인 분류 후 1회만** 재실행. 날짜·strategy만 바꿔 같은 쿼리 반복 금지.
|
||||
|
||||
### 4-2. Python 셸 — 문법·심볼 확인 후 실행
|
||||
- `from X import Y if cond else None` 등 **가짜 문법** heredoc 금지. 실행 전 문법 확인 또는 `py_compile` 1회.
|
||||
- 심볼/함수명은 Grep·`hasattr`·`inspect.signature`로 확인 후 import. 시그니처 모르고 `()` 호출 금지.
|
||||
- ImportError 나면 비슷한 이름(`invalidate_env_cache` vs `invalidate_merged_env_cache`, `prev_kr_trading_day` 등)을 **추측 재실행하지 말고** Grep 1회로 실명 확인.
|
||||
|
||||
### 4-3. env/DB 저장 — “넣었다” ≠ “읽힌다”
|
||||
- `MOMENTUM_*`/`TAIL_*`/`SCALP_*` 등은 `classify_config_key` → **해당 `config_*` 테이블**. `ENV_CONFIG_KEYS`·전략 키 튜플·컬럼 마이그레이션에 없으면 `apply_env_patch`해도 **저장·조회가 비거나 overflow만 돌고 get_env가 빈값**.
|
||||
- 신규 키: (1) code `get_env_*` 기본값 (2) `database.py` ENV 키 목록 (3) 필요 시 `*_env_keys.py` (4) apply 패치 맵 — **네 군데 한 세트**. 저장 후 `get_env_from_db`로 **재조회 검증** 필수.
|
||||
- 캐시 무효화는 실명 `invalidate_merged_env_cache()` (존재하지 않는 invalidate_* 추측 금지).
|
||||
|
||||
### 4-4. 백테·Optuna·브라우저 운영 낭비
|
||||
- 주말/휴장 `end=오늘`로 Optuna/백테 돌리지 말 것 → 최근 거래일.
|
||||
- categorical 그리드 변경 후 **같은 study-name 재사용 금지**.
|
||||
- 긴 잡: nohup+로그 경로만. `for+sleep` 폴링 금지.
|
||||
- 백테 웹 브라우저 검증 URL은 **`http://192.168.0.149:5050/` 만** (`127.0.0.1`/`localhost` 금지).
|
||||
- 실패 로그를 사용자에게 길게 반복 붙여 넣지 말 것. 고치고 결과만 보고.
|
||||
|
||||
## 5. 🚨 의심·불확실 → 근본원인 먼저 (땜빵·추측 패치 금지)
|
||||
항목 19와 동일 정신. **코드를 고치기 전에** 원인을 문서로 확정한다.
|
||||
|
||||
### 5-1. 조사 순서 (필수)
|
||||
1. **증상 로그·에러코드** (유량=5, 429, invalid approval, Unknown column 등)를 있는 그대로 분류.
|
||||
2. **`docs/`** (`정합성.md`, `계정.md`, 전략 QA 등) + 레포 내 기존 헬퍼(`SafeRequest`, `KISApprovalManager`, 세마포어) 검색.
|
||||
3. **MCP** (브라우저·관련 서버) / 공식 OpenAPI·키움 문서로 한도·엔드포인트·실전·모의 도메인 확인.
|
||||
4. 근본원인·설계를 **짧게 보고** → 승인 후 수정 (핵심 매매/인프라는 선보고).
|
||||
|
||||
### 5-2. 금지
|
||||
- “일단 재시도·재발급·봉수 늘리기·±1 보정”으로 증상만 가리기.
|
||||
- 한도·키 정책을 **문서 확인 없이** 추측 구현.
|
||||
- 원인 미확정 상태에서 “고쳤다/안전하다” 단정.
|
||||
|
||||
## 6. 🚨 국내→해외/탭 이식 — 복붙 ≠ 완료 (위반 시 허위 보고)
|
||||
국내 탭/API를 “그대로 가져왔다”는 **복사만으로는 완료가 아니다.**
|
||||
UI·summary·저장 테이블을 **브라우저로 확인**하기 전에는 “정합 OK / 버그 없음”을 **단정하지 마라.**
|
||||
(상세: `.cursor/rules/domestic-port-ui-parity.mdc`)
|
||||
|
||||
- **summary 키**: `summarize_trades` 의 `pf` → 응답 `profit_factor`. `bot_pct`·`daily_avg_pct` 필수. `equity`/`daily`/`reasons` 누락 금지 (PF·수익률 0% 버그 재발 금지).
|
||||
- **해외 USD**: PnL·MDD·누적 **`int()` 절삭 금지.**
|
||||
- **저장 분리**: **전역 설정 저장** = `config_us_momentum`(`US_MOMENTUM_*`) ≠ **종목행** `us_momentum_stock_config`. 버튼에 「전역」「종목」명시.
|
||||
- **웹백테 = 폼.** Optuna 폼채우기/종목적용 후 탭·종목 리로드로 폼을 DB 핀으로 **덮어쓰기 금지.** 검증 = 하드새로고침 → 종목선택 → 폼=Optuna → 백테.
|
||||
- **원인 미확인 시** 엔진/cfg 탓 단정 금지. UI 덮어쓰기·키 누락을 먼저 확인.
|
||||
- **`curl`/거래수만 ≠ 완료.** PF·수익률·버튼·테이블까지 브라우저 확인 후 보고.
|
||||
|
||||
### 6-1. 🚨 해외 전략 UI = 국장과 최대한 동일 (선보고 없이 다르게 만들지 말 것)
|
||||
- **기본**: 해외(US_*) 웹·Optuna·결과카드·버튼·표(Top5「보기」/폼/적용)·가상거래·차트는 **대응 국장 탭과 같은 UX**로 맞춘다.
|
||||
“해외라서 단축·생략해도 된다”고 **임의 판단 금지.**
|
||||
- **꼭 다르게 해야 할 때만** (예: USD 표시, HTS 없음, 해외 WS 세션, 종목핀 테이블):
|
||||
1) **무엇을·왜** 국장과 다르게 하는지 **먼저 짧게 보고**
|
||||
2) **사용자 승인 후** 구현
|
||||
3) UI에 「전역/종목」「USD」 등 차이를 **문구로 명시**
|
||||
- 승인 없이 Optuna Top5·보기·후보선택·PF/수익률 카드·설정저장 흐름 등을 빼거나 다르게 만들면 **규칙 위반**.
|
||||
- 엔진 정합(T−1/T·freeze)도 국장과 동일이 기본. 체결가·호가 등 실매 차이도 **선보고** (이미 CRITICAL §0·선수정 원칙과 동일).
|
||||
|
||||
OpenAPI Github 샘플코드 신규 업로드 안내
|
||||
|
||||
안녕하세요, KIS Developers팀입니다.
|
||||
|
||||
Reference in New Issue
Block a user