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:
Your Name
2026-08-27 15:21:21 +09:00
parent ba2f9f0953
commit 5e44b86f8b
24 changed files with 1923 additions and 203 deletions

View File

@@ -199,25 +199,24 @@ def build_live_config_groups() -> List[GroupDef]:
"한투 60초 캐시는 안 씀. MINIMAL 이면 한투 RAM 은 보유만. "
"저장 후 kis_trader_main 재시작"
)),
_f("LIVE_OB_PROVIDER", "📊 실매매 호가(OB) 소스 (재시작 필요)", "select", default="kiwoom",
_f("LIVE_OB_PROVIDER", "📊 실매매 호가(OB) 소스 (재시작 필요)", "select", default="kis",
choices=[
{"value": "kiwoom", "label": "키움 (kiwoom)"},
{"value": "kis", "label": "한투 (kis)"},
{"value": "kiwoom", "label": "키움 (kiwoom)"},
],
hint=(
"호가 1차. 키움=kiwoom / 한투=kis. LS는 여기 없음(3차 UH1). "
"호가 1차. 한투=kis(2키 OB 세션 41) / 키움=kiwoom. LS는 여기 없음(3차 UH1). "
"폴백 나이 넘으면 그 벤더는 없는 것과 같고 2차→3차. "
"만료로 None 만 만들어서 필터 ON 통과 구멍을 만들지 않음. "
"kis 선택 시 아래 'KIS 실시간 호가 수집' ON + 2번째 앱키(KIS_APP_KEY_OB_REAL). "
"저장 후 kis_trader_main 재시작"
"기본 체인: kis→kiwoom→ls. 저장 후 kis_trader_main 재시작"
)),
_f("LIVE_FEED_FALLBACK_MAX_AGE_SEC", "⏱ 시세·호가 읽기 폴백 나이(초)", "float", default=3.0,
hint=(
"비교 = 그 틱의 체결시각(키움 FID20 / 한투 chetime) vs 서버 지금. "
"1차·2차·3차 모두 같음. 보조가 늦으면 3차, 매도는 REST. "
"키움 시각에서 한투 시각을 빼서 늦다고 하지 않음. "
"넘기면 그 벤더 실패. 적재(공책)와 분리. 기본 3. "
"분봉 쓰레기 판정 나이도 이 값(봉 끝시각 대비)."
"틱: 체결시각(키움 FID20 / 한투·LS chetime) vs 서버 지금 → 초과면 RAM 미반영. "
"호가: snap_time(한투 BSOP_HOUR / LS hotime / 키움 FID20)도 동일 초로 "
"RAM 미반영·읽기 체인 실패(필터 max_age=0=마지막 RAM 은 예외). "
"1·2·3차 같음. 0이면 나이 컷 OFF. 기본 3. 적재(공책)와 분리."
)),
_f("TRIGGER_FEED_DETAIL_LOG", "📝 트리거 로그에 틱·호가·벤더 상세", "bool", default=True,
hint=(
@@ -263,12 +262,12 @@ def build_live_config_groups() -> List[GroupDef]:
hint="ON = 키움 호가를 ws_orderbook 테이블에 저장 (기본값: ON)"),
_f("WS_TICK_SAVE_KIS", "📈 KIS 체결 틱 수집", "bool", default=True,
hint="ON = KIS 체결 틱을 ws_ticks 테이블에 저장 (기본값: ON)"),
_f("WS_ORDERBOOK_SAVE_KIS", "📋 KIS 실시간 호가 수집", "bool", default=False,
_f("WS_ORDERBOOK_SAVE_KIS", "📋 KIS 실시간 호가 수집", "bool", default=True,
danger=True,
hint=(
"한투 호가는 2번째 앱키(KIS_APP_KEY_OB_REAL) 전용 세션만. "
"메인 시세 41과 합산 금지. 2키 없으면 ON 해도 호가 구독·적재 안 함. "
"2키 세션 한도는 호가 전용 41."
"2키 세션 한도는 호가 전용 41. LIVE_OB_PROVIDER=kis 일 때 ON 권장."
)),
_f("WS_SUBSCRIBE_KIS_MINIMAL", "📉 KIS 최소 구독 모드", "bool", default=False,
hint=(
@@ -284,24 +283,36 @@ def build_live_config_groups() -> List[GroupDef]:
)),
_f("WS_TICK_SUBSCRIBE_CHAIN", "📡 틱 구독 spill 체인(csv)", "text", default="",
hint="비우면 LIVE_TICK_PROVIDER→나머지→ls. 예: kiwoom,kis,ls"),
_f("WS_OB_SUBSCRIBE_CHAIN", "📡 호가 구독 spill 체인(csv)", "text", default="",
hint="비우면 LIVE_OB_PROVIDER→나머지→ls(3차 RAM). 예: kis,kiwoom,ls"),
_f("WS_OB_SUBSCRIBE_CHAIN", "📡 호가 구독 spill 체인(csv)", "text", default="kis,kiwoom,ls",
hint="기본 kis,kiwoom,ls. 비우면 LIVE_OB_PROVIDER→나머지→ls(3차 RAM)."),
_f("LS_WS_ENABLED", "📡 LS WS 기동 (재시작 필요)", "bool", default=False,
hint=(
"ON = LS증권 실시간 WS 기동 — 구독 spill 3차·영구구독·읽기 폴백 RAM. "
"OFF(기본)=VALIDATION/조건이력/ls_condition 전략이 있을 때만 기동. "
"키: env_config LS_APP_KEY_REAL / LS_APP_SECRET_REAL 필요."
)),
_f("LS_FEED_FALLBACK_SUBSCRIBE", "📡 LS 3차 폴백 구독 (메인 유니버스)", "bool", default=True,
_f("LS_FEED_FALLBACK_SUBSCRIBE", "📡 LS 유니버스 RAM 미러 (레거시)", "bool", default=False,
hint=(
"ON(기본)=영구 외에 메인 틱/호가 구독 집합(후보보유grace)을 LS에 시세+UH1 붙임. "
"3차가 실제로 있게 함. 후보 갭 REST 와 별개"
"OFF(기본)=KIS·키움과 동일 spill 3차만. ON=후보보유grace 전체를 LS에 "
"벌크 미러(_feed_fallback) — 200+ REG·07:00 Bye 위험. 영구는 별도(_permanent)"
)),
_f("LS_WS_HOLD_RAM_KEEP_HOLDINGS", "📡 LS hold RAM 보유 유지", "bool", default=True,
hint=(
"ON(기본)=장마감 hold 시 영구+보유 종목만 LS RAM 유지(07:00 replay 축소). "
"OFF=영구(_permanent)만 유지"
)),
_f("LS_WS_MAX_SUBSCRIPTIONS", "📡 LS 로컬 구독 한도", "int", default=100,
hint="spill 3차 LS 종목 상한. 0=무제한(비권장). 키움 100과 유사."),
_f("LS_WS_TICK_SAVE", "📈 LS 체결 틱 DB 적재", "bool", default=False,
hint=(
"OFF(기본)=후보 틱은 ls_ws_ticks 에 안 쌓음(옵투나 3차 틱 없음). RAM 은 구독 ON. "
"영구 ETF 틱은 persist 게이트(영구만) + 이 스위치. "
"OFF 여도 아래 LS 호가 DB 적재는 별개로 동작"
"ON=구독 중 종목(영구후보보유grace) US3 → ls_ws_ticks. "
"호가 DB 게이트와 동일. OFF=테이블 미적재(RAM·3차 폴백은 구독 ON이면 유지). "
"봉·VI 는 영구만. 옵투나 틱 3차는 BT_TICK_LS_THIRD_FALLBACK"
)),
_f("BT_TICK_LS_THIRD_FALLBACK", "📈 백테/옵투나 틱 3차 LS", "bool", default=True,
hint=(
"ON(기본)=ws_ticks 로드 후 같은 초에 1·2차 없으면 ls_ws_ticks 채움. "
"나이=LIVE_FEED_FALLBACK_MAX_AGE_SEC(기본3). history_source=ls 본체와 별개"
)),
_f("LS_WS_ALSO_HOGA", "📋 LS 호가(UH1) 구독 (재시작 필요)", "bool", default=True,
hint=(