feat: Enhance trading system with new permanent subscription features and order book management

Changes:
- Added a new API endpoint for managing permanent subscriptions, allowing users to enable or disable subscriptions dynamically.
- Implemented a function to fill candle data from Kiwoom, ensuring that only relevant data is inserted into the database.
- Introduced a mechanism to handle master subscription states, improving the management of subscription statuses.
- Updated the database schema to include new fields for managing subscription states and order book filtering.

Impact:
- These enhancements improve the flexibility and reliability of the trading system, allowing for better management of subscriptions and order book data, while reducing the risk of data inconsistencies.

히스토리 align 제거 븅신같은 초기설계 아예 제거
진입모드에 구멍메움
호가진입을 켜도 호가가 안들어올때 호가 안보고 그냥 사버림
This commit is contained in:
Your Name
2026-08-15 23:01:14 +09:00
parent 4a18ce2697
commit 36a3e2b4a1
94 changed files with 6368 additions and 1639 deletions

View File

@@ -184,8 +184,8 @@ def build_live_config_groups() -> List[GroupDef]:
"title": "📡 시세 소스 설정 (봇 재시작 필요)",
"hint": (
"키움과 KIS 중 어느 쪽 시세·호가로 매매할지 선택. "
"어느 쪽을 선택하든 틱·캔들 데이터는 키움+KIS 양쪽 모두 DB에 저장됨. "
"시세/호가만 선택한 증권사를 사용."
"분봉 저장은 증권사별(source=kiwoom|kis, channel=ws|rest|rollup)로 분리. "
"갭보정은 키움 REST만. 영구구독 KR은 LS WS."
),
"fields": [
_f("LIVE_TICK_PROVIDER", "📊 실매매 틱(시세) 소스 (재시작 필요)", "text", default="kiwoom",
@@ -231,6 +231,20 @@ def build_live_config_groups() -> List[GroupDef]:
"OFF(기본)=VALIDATION/조건이력/ls_condition 전략이 있을 때만 기동. "
"키: env_config LS_APP_KEY_REAL / LS_APP_SECRET_REAL 필요."
)),
_f("PERMANENT_SUBSCRIBE_ENABLED", "📡 영구구독 마스터 (재시작 필요)", "bool", default=True,
hint=(
"ON(기본)=테이블 enabled 종목을 KR=LS WS / US=해외 WS 로 구독. "
"OFF=행은 유지하고 구독만 안 함. LS 틱/봉 DB는 enabled 코드만."
)),
_f("WS_GAP_FILL_KIS_FALLBACK", "⛔ KIS REST 갭보정 (쓰지 말 것)", "bool", default=False,
hint=(
"페이지 REST라 느림. 코드가 ON이어도 호출하지 않음. "
"후보 갭보정은 키움 ka10080 → ws_candles(source=kiwoom,channel=rest)만."
)),
_f("PERM_LS_FILL_BARS", "영구구독 확정봉 가져오기 봉수", "int", default=500,
hint="키움 ka10080 → ls_ws_candles INSERT IGNORE. ws_candles 에 넣지 않음."),
_f("PERM_LS_FILL_SLEEP_MIN", "확정봉 가져오기 종목간 sleep 최소(초)", "float", default=1.0),
_f("PERM_LS_FILL_SLEEP_MAX", "확정봉 가져오기 종목간 sleep 최대(초)", "float", default=3.0),
_f("KIS_APP_KEY_OB_REAL", "🔑 KIS 실전 호가 전용 앱키 (선택)", "text",
hint="호가 전용 2번째 실전 앱키(시세 키와 역할 분리). 미입력 시 메인 세션+SAVE 플래그 현행. spill 틱용 아님."),
_f("KIS_APP_SECRET_OB_REAL", "🔑 KIS 실전 호가 전용 시크릿 (선택)", "text",
@@ -275,12 +289,33 @@ def build_live_config_groups() -> List[GroupDef]:
_f(
"WS_ORDERBOOK_TICK_MAX_AGE_SEC",
"⏱ 호가 유효 시간(초)",
"⏱ 호가 저장 유효 시간(초)",
"float",
default=3.0,
default=30.0,
hint=(
"틱이 들어왔을 때 호가 데이터가 이 시간(초)보다 오래됐으면 저장 안 함 | "
"→ 오래된 호가로 가짜 데이터 채우는 것 방지. 기본 3초"
"0D 덤프·시계열 저장용. 이 초보다 오래된 호가는 저장 안 함. "
"진입 필터 판정 나이와 무관(아래 FILTER_MAX_AGE). 코드 기본 30"
),
),
_f(
"WS_ORDERBOOK_FILTER_MAX_AGE_SEC",
"⏱ 진입 호가필터 RAM 나이(초)",
"float",
default=0.0,
hint=(
"0(기본)=마지막 RAM 호가로 검사(만료로 건너뛰지 않음) | "
"양수=그 초보다 오래면 스냅 없음으로 취급. REST 없음"
),
),
_f(
"WS_ORDERBOOK_FILTER_REJECT_IF_EMPTY",
"⛔ 호가 사진 없으면 매수 안 함",
"bool",
default=True,
hint=(
"ON(기본)=사기 직전 호가창 사진이 한 장도 없으면 이번엔 안 삼 "
"(다음 검사에서 사진 있으면 다시 봄) | "
"OFF=예전처럼 사진 없어도 통과(눈 가리고 사기). REST 없음"
),
),
_f(
@@ -398,17 +433,6 @@ def build_live_config_groups() -> List[GroupDef]:
"title": "🔔 유니버스·알림 임계값",
"hint": "봇이 이상한 상황을 감지해서 알람을 보내기 위한 임계값 설정.",
"fields": [
_f(
"LIVE_UNIVERSE_SLOT_ALIGN",
"🔗 유니버스 히스토리 교집합 필터",
"bool",
default=False,
hint=(
"OFF(기본권장) = 실시간 후보 그대로 사용 | "
"ON = 실시간 후보와 과거 히스토리 스냅이 겹치는 종목만 매수. "
"히스토리가 늦게 올라오면 매수 기회 놓칠 수 있음"
),
),
_f(
"OPS_ALERT_HISTORY_OPEN_GRACE_SEC",
"🕐 개장 직후 히스토리 0건 허용 시간(초)",
@@ -1072,11 +1096,6 @@ def build_live_config_groups() -> List[GroupDef]:
_f("STRATEGY_ENV_CACHE_TTL_SEC", "전략설정 RAM TTL(초)", "float", default=1.0,
hint="config_* reload 매루프 SELECT 완화 · 기본 1초 · 웹 저장 시 즉시 무효화 · "
"유니버스/봉 분슬롯과 무관(임계값만)"),
_f("UNIVERSE_SLOT_CACHE_TTL_SEC", "유니버스슬롯 RAM TTL(초)", "float", default=1.0,
hint="history∩후보 정합 ON 유지 · 같은 슬롯키면 N초 RAM · 슬롯 바뀌면 즉시 DB 재조회"),
_f("UNIVERSE_SLOT_FLIGHT_WAIT_SEC", "유니버스슬롯 flight대기(초)", "float", default=5.0,
hint="TTL 만료 시 같은 키 DB SELECT 1회(single-flight) · 대기자 Event 상한 · "
"분슬롯 freeze 아님"),
_f("TICK_SELL_ENABLED", "틱매도(공통)", "bool", default=False,
hint="ON=WS 현재가 갱신마다 매도검사(백테 틱청산에 근접) · OFF=루프(~0.1초)만 · "
"전략별 *_TICK_SELL_ENABLED 가 비어있지 않으면 그쪽 우선 · 기본 OFF"),