fix(시세): LS spill-only·토큰 파일캐시·호가 snap_time 3초컷
- _feed_fallback 미러 OFF, LS cap/grace/hold RAM을 KIS·키움 spill과 정합 - LS 접근토큰 .ls_token_cache_*.json (재시작 재사용, revoke 루프 없음) - 호가 RAM을 틱과 동일 LIVE_FEED_FALLBACK(snap_time)로 컷, 필터 max_age=0은 유지 - 익절 지정가 로그에 실제 호가 벤더(kis/kiwoom/ls 1·2·3차) 표기 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
52
docs/호가.md
52
docs/호가.md
@@ -6,6 +6,56 @@
|
||||
|
||||
---
|
||||
|
||||
## 0-0b. 벤더 공통: 실시간 호가(RAM) vs 틱동기 호가(DB) — 2026-08-25
|
||||
|
||||
**UH3 없음.** LS 체결=`US3`, 호가=`UH1`. (한투=`H0STCNT0`/`H0STASP0`, 키움=`0B`/`0D`)
|
||||
|
||||
| | RAM (실매 필터가 봄) | DB 호가 (`*_ORDERBOOK_SAVE_MODE=tick` 기본) |
|
||||
|--|----------------------|-----------------------------------------------|
|
||||
| **한투** | H0STASP0 올 때마다 | **H0STCNT0(체결) 1건** → 그때 RAM 1장 → `ws_orderbook` |
|
||||
| **키움** | 0D 올 때마다 | **0B(체결) 1건** → 그때 RAM 1장 → `ws_orderbook` |
|
||||
| **LS** | UH1 올 때마다 | **US3(체결) 1건** → 그때 RAM 1장 → `ls_ws_orderbook` |
|
||||
|
||||
- `MODE=interval` = 호가 메시지(UH1/0D/ASP0) 쪽에서 간격 저장. **세 증권사 공통 스위치**이지 LS 전용 신기능이 아님.
|
||||
- `LS_WS_TICK_SAVE` = `ls_ws_ticks` INSERT. **구독 전체**(영구∪후보∪보유) — 호가와 동일. 봉·VI만 영구.
|
||||
- `BT_TICK_LS_THIRD_FALLBACK`(기본 true) = 백테/옵투나 틱: 같은 초 1·2차 없으면 `ls_ws_ticks` (나이=폴백 3초).
|
||||
- 실매는 DB를 안 보고 **RAM**. DB는 백테/옵투나 재현용 샘플.
|
||||
|
||||
### 2026-08-25 LS `ls_ws_orderbook` 0건 — 원인 (코드)
|
||||
|
||||
의도(US3 틱동기)는 한투·키움과 **같음**. 문제는:
|
||||
|
||||
1. 장중 **Bye ≈ 매분** → OPEN 직후 구독 복구가 `sends≈1`(JIF만)로 **미완료**.
|
||||
2. 서버에 **US3/UH1 REG가 안 붙음** → 체결·호가 수신 없음 → tick 모드라 DB 0.
|
||||
3. 미완료인데도 `recovering=False` 로 풀리던 버그 → 워치독이 틱없음으로 또 끊음 (악순환).
|
||||
|
||||
**수정(동작) 2026-08-27:** `ls_ws.py` + `ls_token.py`
|
||||
|
||||
1. **OPEN마다 `_ws_reconnect_step=0` 리셋 제거** — Bye 플랩 시 1초 연타 원인.
|
||||
2. **조기 CLOSE/Bye 서킷** (`LS_WS_STABLE_OPEN_SEC`/`EARLY_BYE_STREAK`/`BYE_CIRCUIT_SLEEP_SEC`) — streak 도달 시 로컬 토큰 무효화+1회 재발급 후 대기.
|
||||
3. **REG 미완료면 `recovering` 유지** — `reg_ok`일 때만 해제·step/streak 리셋.
|
||||
4. adhoc에서 `fetch_ls_access_token` 강제 발급 **금지** (봇 프로세스 토큰 무효화).
|
||||
|
||||
`LS_WS_ENABLED` / TICK·ORDERBOOK_SAVE / 3차 spill **끄지 않음** (옵션1).
|
||||
|
||||
#### Bye ≈ 매분 — 로그·git으로 좁힌 것 (2026-08-25 journal)
|
||||
|
||||
| 비교 | Aug24 (정상 수집) | Aug25 (DB 0) |
|
||||
|------|-------------------|--------------|
|
||||
| 시간대당 `LSWebSocket.*Bye` | **0** (09~15시) | **~54~59**/시간 (≈매분) |
|
||||
| 같은 시간 `LS WS watchdog` | 드묾(장초 1회 등) | **장중 시간대 0** |
|
||||
| OPEN 복구 | `sends≈15~339` 완료 | 거의 항상 `sends≈1` (JIF만) |
|
||||
|
||||
- Bye 페이로드: `opcode=8` + `\x03\xe8Bye` = WebSocket **정상종료(1000) + 서버가 보낸 Bye**. 우리 워치독 문구(`틱 없음 → 강제 재연결`)와 **무관**.
|
||||
- 패턴: `OPEN(sends≈1)` → 약 **60초** 유지 → `Bye`+`CLOSE` → **같은 초~1초 안**에 다시 `OPEN(sends≈1)`. 침묵 워치독(grace30+silence45≈75초)보다 **먼저** 서버가 끊음.
|
||||
- 05:07 봇 재시작 이후 **07:00부터** 이미 동일 루프(장 시작 전). Aug24 18:37은 `KR=169 sends≈339`로 복구 성공 이력 있음.
|
||||
- `sends≈1` + KR 수백: REG 루프가 JIF 직후 `_opened` 해제되어 abort된 **형태**(가설).
|
||||
검증 키: CLOSE `ws_same=False`가 OPEN/REG 중 끼는지, 복구 로그 `abort_why=opened_cleared`. **미확정**.
|
||||
|
||||
**아직 단정 금지:** 이중세션(조건식 AFR vs 시세)·계정 한도·서버 idle 정책만의 단독 원인. 위는 “워치독 매분 킥”은 **아님**까지 확정.
|
||||
|
||||
---
|
||||
|
||||
## 0-0. 「호가 쌓기」는 설계가 아니다 (헷갈림 방지)
|
||||
|
||||
**DB에 호가 한 장씩 넣는 것(저장)은 이미 돌아가는 수집 기능이다.**
|
||||
@@ -157,7 +207,7 @@ AND라서 하나라도 깨지면 탈락 → 체감이 셈.
|
||||
### 키움 조건 vs LS 조건 (진입·수익구간 호가매도 공통)
|
||||
- `kiwoom_condition` / `condition` → 호가 **키움 0D RAM** · DB `ws_orderbook`
|
||||
- `ls_condition` → 호가 **LS UH1 RAM** · DB `ls_ws_orderbook` (키움으로 메우지 않음)
|
||||
수익구간·손절호가도 같은 스냅샷 API. **2026-08 운영:** 4전략 유니버스는 키움 조건이 본체. LS는 틱/호가 **구독 spill 3차**이지 “LS 전용 종목”이 아님 (`LIVE_OB_PROVIDER=kiwoom`).
|
||||
수익구간·손절호가도 같은 스냅샷 API. **2026-08 운영:** 4전략 유니버스는 키움 조건이 본체. 호가 구독/읽기 체인 **kis(2키 OB 41)→kiwoom→ls(3차)**. LS는 spill 3차지 “LS 전용 종목”이 아님 (`LIVE_OB_PROVIDER=kis`, `WS_OB_SUBSCRIBE_CHAIN=kis,kiwoom,ls`).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user