Created At: 2026-08-07T10:49:49Z
Completed At: 2026-08-07T10:49:52Z
The following changes were made by the replace_file_content tool to: /home/hoon/kis_bot/kis_trader/web/live_config_schema.py. If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.
[diff_block_start]
@@ -180,109 +180,227 @@
             ],
         },
         {
+            "id": "ws_feed_settings",
+            "title": "📡 시세 소스 설정 (봇 재시작 필요)",
+            "hint": (
+                "키움과 KIS 중 어느 쪽 시세·호가로 매매할지 선택. "
+                "어느 쪽을 선택하든 틱·캔들 데이터는 키움+KIS 양쪽 모두 DB에 저장됨. "
+                "시세/호가만 선택한 증권사를 사용."
+            ),
+            "fields": [
+                _f("WS_PROVIDER", "📊 매매 메인 증권사 (재시작 필요)", "text", default="kiwoom_main",
+                   hint=(
+                       "kiwoom_main = 키움증권 시세·호가로 매매 (권장) | "
+                       "kis_main = KIS(한국투자) 시세·호가로 매매 | "
+                       "→ 어느 쪽이든 두 증권사 데이터 모두 DB에 저장됨"
+                   )),
+                _f("WS_SUBSCRIBE_KIS_MINIMAL", "📉 KIS 최소 구독 모드", "bool", default=False,
+                   hint=(
+                       "OFF(기본) = KIS가 키움과 동일한 후보 40종목을 전부 수신하여 DB에 저장 | "
+                       "ON = KIS가 현재 내가 사고 있는 종목만 수신 (KIS ID 한도 아낄 때)"
+                   )),
+                _f("KIS_WS_ORDERBOOK_ENABLED", "📋 KIS 실시간 호가 수집", "bool", default=False,
+                   hint=(
+                       "OFF(기본) = KIS 호가는 수집 안 함 (한도 40개 보호) | "
+                       "ON = KIS 호가도 kis_ws_orderbook 테이블에 저장. "
+                       "단, KIS는 시세+호가 합산 40개 한도라서 ON 시 최대 20종목만 추적 가능"
+                   )),
+            ],
+        },
+        {
             "id": "ws_trigger_global",
-            "title": "TRIGGER 필터 — WS 공통",
-            "hint": (
-                "호가(0D)·프로그램(0w) · env_config(컬럼 없으면 env_config_ext) · "
-                "COLLECT=판정순간1장(filter_eval) / SAVE=후보~3초시계열(kiwoom_0d) — 둘은 다름"
-            ),
-            "fields": [
-                _f("WS_PROVIDER", "메인 시세/매매 제공자(재시작 필요)", "text", default="kiwoom_main",
-                   hint="kiwoom_main=키움 메인(적재 둘다) / kis_main(또는 kis_only)=KIS 메인(적재 둘다) / kis_with_validation=KIS 메인+검증"),
-                _f("WS_SUBSCRIBE_KIS_MINIMAL", "KIS 최소구독(보유종목만)", "bool", default=False,
-                   hint="ON=KIS는 매수된 종목만 시세 수신(한도절약) / OFF=KIS도 키움과 똑같이 전체 후보종목 수신 및 적재"),
-                _f("KIS_WS_ORDERBOOK_ENABLED", "KIS 호가 WS 구독(주의)", "bool", default=False,
-                   hint="ON=KIS 호가 수신(kis_ws_orderbook 적재). 단, KIS는 구독한도가 40개이므로 시세+호가 동시 수신 시 최대 20종목만 가능"),
-                _f("KIWOOM_WS_ORDERBOOK_ENABLED", "호가 WS(0D) 구독", "bool", default=True,
-                   hint="키움 실시간 호가 수신(RAM) · 꺼면 필터·수집·시계열 모두 불가"),
-                _f("KIWOOM_WS_PROGRAM_ENABLED", "프로그램 WS(0w) 구독", "bool", default=True,
-                   hint="키움 프로그램매매 수신(RAM)"),
+            "title": "⚡ 매수 판단 필터 설정 (실시간 WS 기반)",
+            "hint": (
+                "매수 타이밍을 결정할 때 호가·프로그램 데이터를 어떻게 사용할지 설정. "
+                "모든 데이터는 실시간 메모리(RAM)에서 직접 읽으므로 딜레이 없음."
+            ),
+            "fields": [
+                _f(
+                    "KIWOOM_WS_ORDERBOOK_ENABLED",
+                    "📖 키움 실시간 호가 수신",
+                    "bool",
+                    default=True,
+                    hint=(
+                        "ON(권장) = 키움 증권사의 실시간 호가(10단계 매수/매도) 데이터를 메모리에 저장 | "
+                        "OFF = 호가 필터, 호가 저장 전부 불가"
+                    ),
+                ),
+                _f(
+                    "KIWOOM_WS_PROGRAM_ENABLED",
+                    "🤖 키움 프로그램 매매 데이터 수신",
+                    "bool",
+                    default=True,
+                    hint=(
+                        "ON = 기관·외국인 프로그램 매매 흐름을 메모리에 저장 | "
+                        "OFF = 프로그램 매매 필터 사용 불가"
+                    ),
+                ),
                 _f(
                     "WS_TRIGGER_EVAL_SAVE_ENABLED",
-                    "TRIGGER 판정 DB 저장(마스터)",
-                    "bool",
-                    default=True,
-                    hint="OFF면 아래 COLLECT(판정 스냅) 전부 안 씀 · SAVE(시계열)와 무관",
+                    "💾 매수 판단 결과 DB 저장 (마스터 스위치)",
+                    "bool",
+                    default=True,
+                    hint=(
+                        "ON = 매수 검토할 때 호가·프로그램 스냅샷을 DB에 기록 (분석·디버깅용) | "
+                        "OFF = 아래 모든 저장 비활성 (DB 용량 아낄 때)"
+                    ),
                 ),
                 _f(
                     "WS_ORDERBOOK_COLLECT_ENABLED",
-                    "호가 판정스냅(FILTER_EVAL) — 매수체크 순간 1장",
-                    "bool",
-                    default=True,
-                    hint="≠ 연속시계열. TRIGGER 판정 때만 ws_orderbook source=filter_eval · 필터 OFF여도 저장 가능",
+                    "📸 매수 검토 순간 호가 1장 저장",
+                    "bool",
+                    default=True,
+                    hint=(
+                        "ON = 매수를 검토하는 바로 그 순간 호가 스냅샷 1장을 DB에 저장 | "
+                        "→ 나중에 '왜 이 종목을 샀는가/안 샀는가' 확인 가능"
+                    ),
                 ),
                 _f(
                     "WS_ORDERBOOK_SAVE_ENABLED",
-                    "호가 시계열(KIWOOM_0D) DB 저장",
-                    "bool",
-                    default=False,
-                    hint="ON이면 아래 MODE로 저장 · 파람서치 호가축용 · 봇 재시작 필요",
-                ),
-                _f(
-                    "WS_ORDERBOOK_SAVE_MODE",
-                    "호가 저장모드 tick|interval",
-                    "text",
-                    default="tick",
-                    hint="tick=체결(0B)마다 RAM호가 1장(LS와 동일) · interval=0D+아래 간격 스로틀 · 봇 재시작",
+                    "📼 호가 연속 시계열 저장 (파람서치용)",
+                    "bool",
+                    default=False,
+                    hint=(
+                        "ON = 구독 중인 종목의 호가를 틱마다 계속 DB에 쌓음 | "
+                        "→ 파라미터 서치에서 호가 축을 탐색할 때 필요 | "
+                        "평소엔 OFF 권장 (DB 용량 많이 차지함), 변경 후 봇 재시작 필요"
+                    ),
                 ),
                 _f(
                     "WS_ORDERBOOK_TICK_MAX_AGE_SEC",
-                    "틱동기 호가 RAM 최대나이(초)",
-                    "float",
-                    default=3.0,
-                    hint="tick 모드: 이보다 오래된 호가면 해당 틱 호가행 생략(가짜 채움 금지)",
-                ),
-                _f(
-                    "WS_TRIGGER_SNAPSHOT_DB_INTERVAL_SEC",
-                    "호가/프로그램 interval 간격(초)",
-                    "float",
-                    default=3.0,
-                    hint="MODE=interval 일 때만 · 종목당 최소 저장 간격 · 봇 재시작 필요",
-                ),
+                    "⏱ 호가 유효 시간(초)",
+                    "float",
+                    default=3.0,
+                    hint=(
+                        "틱이 들어왔을 때 호가 데이터가 이 시간(초)보다 오래됐으면 저장 안 함 | "
+                        "→ 오래된 호가로 가짜 데이터 채우는 것 방지. 기본 3초"
+                    ),
+                ),
+                _f(
+                    "WS_PROGRAM_COLLECT_ENABLED",
+                    "📸 매수 검토 순간 프로그램 매매 1장 저장",
+                    "bool",
+                    default=True,
+                    hint=(
+                        "ON = 매수 검토 순간 프로그램 매매 스냅샷도 DB에 저장 | "
+                        "→ 호가 저장과 동일 개념, 프로그램 필터 분석용"
+                    ),
+                ),
+                _f(
+                    "WS_PROGRAM_SAVE_ENABLED",
+                    "📼 프로그램 매매 연속 시계열 저장",
+                    "bool",
+                    default=False,
+                    hint=(
+                        "ON = 프로그램 매매 데이터를 계속 DB에 쌓음 | "
+                        "평소엔 OFF 권장, 변경 후 봇 재시작 필요"
+                    ),
+                ),
+                _f(
+                    "PROGRAM_FILTER_ENABLED",
+                    "🚫 프로그램 매매 필터 (매수 차단)",
+                    "bool",
+                    default=True,
+                    hint=(
+                        "ON = 프로그램 매매 흐름이 나쁠 때 매수를 차단 (기본 ON) | "
+                        "OFF = 프로그램 매매 무시하고 그냥 매수"
+                    ),
+                ),
+            ],
+        },
+        {
+            "id": "ws_whipsaw_global",
+            "title": "🌊 휩쏘 필터 (가짜 상승 차단)",
+            "hint": (
+                "매수 신호가 떴는데 직전에 급락이 있었으면 가짜 신호(휩쏘)로 판단해서 차단. "
+                "예: 30초 안에 0.3% 이상 뚝 떨어졌다가 올라온 종목은 패스."
+            ),
+            "fields": [
+                _f(
+                    "WHIPSAW_FILTER_ENABLED",
+                    "🚫 휩쏘 필터 ON/OFF (전략 공통)",
+                    "bool",
+                    default=True,
+                    hint="ON = 가짜 상승 종목 매수 차단 | OFF = 필터 끄고 다 매수",
+                ),
+                _f(
+                    "WHIPSAW_SUBBAR_SEC",
+                    "⏱ 관찰 단위 시간(초)",
+                    "int",
+                    default=30,
+                    hint=(
+                        "틱을 몇 초 단위로 묶어서 미니봉을 만들지 | "
+                        "기본 30초 = 30초짜리 막대기로 패턴 분석"
+                    ),
+                ),
+                _f(
+                    "WHIPSAW_LOOKBACK_SEC",
+                    "⏳ 몇 초 전까지 볼지",
+                    "int",
+                    default=90,
+                    hint=(
+                        "매수 신호 직전 몇 초를 돌아볼지 | "
+                        "기본 90초 = 1분 30초 전까지 확인"
+                    ),
+                ),
+                _f(
+                    "WHIPSAW_DIP_PCT",
+                    "📉 이 이상 떨어졌으면 가짜 신호로 판단 (분율)",
+                    "float",
+                    default=0.003,
+                    hint=(
+                        "0.003 = 0.3% | 직전에 0.3% 이상 하락했다가 올라온 종목은 차단 | "
+                        "더 큰 값 = 필터가 느슨해짐"
+                    ),
+                ),
+                _f(
+                    "WHIPSAW_RECOVERY_TOL_PCT",
+                    "📈 이 정도는 회복 허용 (분율)",
+                    "float",
+                    default=0.001,
+                    hint=(
+                        "0.001 = 0.1% | 하락 후 0.1% 이내로 빠르게 회복하면 정상으로 봄 | "
+                        "노이즈성 미세 출렁임 허용"
+                    ),
+                ),
+            ],
+        },
+        {
+            "id": "ws_universe_alert",
+            "title": "🔔 유니버스·알림 임계값",
+            "hint": "봇이 이상한 상황을 감지해서 알람을 보내기 위한 임계값 설정.",
+            "fields": [
                 _f(
                     "LIVE_UNIVERSE_SLOT_ALIGN",
-                    "실매 유니버스 슬롯필터(history∩후보)",
-                    "bool",
-                    default=False,
-                    hint="ON이면 실시간 후보를 history 스냅과 교집합 — history 지연 시 탈락 위험 · 기본 OFF",
+                    "🔗 유니버스 히스토리 교집합 필터",
+                    "bool",
+                    default=False,
+                    hint=(
+                        "OFF(기본권장) = 실시간 후보 그대로 사용 | "
+                        "ON = 실시간 후보와 과거 히스토리 스냅이 겹치는 종목만 매수. "
+                        "히스토리가 늦게 올라오면 매수 기회 놓칠 수 있음"
+                    ),
                 ),
                 _f(
                     "OPS_ALERT_HISTORY_OPEN_GRACE_SEC",
-                    "history_stale 개장유예(초)",
+                    "🕐 개장 직후 히스토리 0건 허용 시간(초)",
                     "int",
                     default=180,
-                    hint="개장 직후 N초는 history 0건 CRITICAL 스킵",
+                    hint=(
+                        "개장 후 N초 안에는 히스토리가 0건이어도 알람 안 보냄 | "
+                        "기본 180초(3분) = 개장 3분까지는 정상으로 취급"
+                    ),
                 ),
                 _f(
                     "OPS_ALERT_WS_DOWN_HOLD_SEC",
-                    "WS 미OPEN CRITICAL 지속(초)",
+                    "📡 소켓 끊김 알람 기준 시간(초)",
                     "int",
                     default=60,
-                    hint="LS/키움 소켓이 N초 이상 내려가 있을 때만 CRITICAL (순간 재연결 스팸 방지)",
-                ),
-                # 글로벌 ORDERBOOK_FILTER / MAX_SPREAD 폐기 → 아래「호가필터 — 전략별」
-                _f(
-                    "WS_PROGRAM_COLLECT_ENABLED",
-                    "프로그램 판정스냅 — 매수체크 순간 1장",
-                    "bool",
-                    default=True,
-                    hint="≠ 연속시계열. 판정 때만 ws_program · 필터 OFF여도 가능",
-                ),
-                _f(
-                    "WS_PROGRAM_SAVE_ENABLED",
-                    "프로그램 시계열 — 구독후보 ~3초 덤프",
-                    "bool",
-                    default=False,
-                    hint="SAVE와 동일 Recorder · 봇 재시작 필요 · 필터와 무관",
-                ),
-                _f("PROGRAM_FILTER_ENABLED", "프로그램 필터(TRIGGER) — 실매 탈락", "bool", default=True),
-                _f("WHIPSAW_FILTER_ENABLED", "휩쏘 필터(글로벌)", "bool", default=True),
-                _f("WHIPSAW_SUBBAR_SEC", "휩쏘 미니봉(초)", "int", default=30,
-                   hint="틱을 N초 봉으로 묶음 · 실매 기본 30 · Optuna 꼬리 TPE 탐색"),
-                _f("WHIPSAW_LOOKBACK_SEC", "휩쏘 룩백(초)", "int", default=90,
-                   hint="신호 직전 몇 초를 볼지 · 실매 기본 90"),
-                _f("WHIPSAW_DIP_PCT", "휩쏘 하락폭(분율, 0.003=0.3%)", "float", default=0.003),
-                _f("WHIPSAW_RECOVERY_TOL_PCT", "휩쏘 회복 허용(분율, 0.001=0.1%)", "float", default=0.001),
+                    hint=(
+                        "키움/LS 소켓이 이 시간(초) 이상 끊겨 있을 때만 위험 알람 발송 | "
+                        "기본 60초 = 1분 이상 끊겨야 알람 (순간 재연결은 무시)"
+                    ),
+                ),
             ],
         },
     ]
[diff_block_end]

Please note that the above snippet only shows the MODIFIED lines from the last change. It shows up to 3 lines of unchanged lines before and after the modified lines. The actual file contents may have many more lines not shown.


sudo systemctl restart kis_backtest_web.service

명령어 실행 (웹서버 재시작)


Created At: 2026-08-07T10:49:56Z
Completed At: 2026-08-07T10:49:59Z

				The command completed successfully.
				No output
Terminal ID: 1865461


curl -s "http://localhost:5050/api/live_config" | python3 -c '
import sys, json
data = json.load(sys.stdin)
for g in data.get("groups", []):
    print(f"[{g[\"id\"]}] {g[\"title\"]}")
'

명령어 실행 (그룹 목록 확인)


Created At: 2026-08-07T10:50:04Z
Tool is running as a background task with task id: e07d5342-58aa-4443-a5b3-73bde0f593dd/task-2139
Task Description: curl -s "http://localhost:5050/api/live_config" | python3 -c '
import sys, json
data = json.load(sys.stdin)
for g in data.get("groups", []):
    print(f"[{g[\"id\"]}] {g[\"title\"]}")
'
Task logs are available at: file:///home/hoon/.gemini/antigravity-ide/brain/e07d5342-58aa-4443-a5b3-73bde0f593dd/.system_generated/tasks/task-2139.log


그룹 확인 태스크 상태


Created At: 2026-08-07T10:50:16Z
Completed At: 2026-08-07T10:50:16Z
Task: e07d5342-58aa-4443-a5b3-73bde0f593dd/task-2139
Status: RUNNING
Log: /home/hoon/.gemini/antigravity-ide/brain/e07d5342-58aa-4443-a5b3-73bde0f593dd/.system_generated/tasks/task-2139.log
Last progress: never

REMINDER: Do not call this tool again to poll or wait for updates. You will be automatically notified when the task completes or a message arrives. If you need a bounded wait, use the `schedule` tool -- it waits silently in the background and suppresses its notification if you are woken by another event.


curl -s "http://localhost:5050/api/live_config" 2>&1 | python3 -c "import sys, json; d=json.load(sys.stdin); [print(f'[{g[\"id\"]}] {g[\"title\"]}') for g in d.get('groups', [])]"

명령어 실행 (그룹 확인)


Created At: 2026-08-07T10:50:20Z
Completed At: 2026-08-07T10:50:25Z

				The command completed successfully.
				Output:
				[daily_profit_global] 일일 익절 — 총합 (규칙·수동중단)
[risk_global] 리스크 — 계정 공통
[ws_feed_settings] 📡 시세 소스 설정 (봇 재시작 필요)
[ws_trigger_global] ⚡ 매수 판단 필터 설정 (실시간 WS 기반)
[ws_whipsaw_global] 🌊 휩쏘 필터 (가짜 상승 차단)
[ws_universe_alert] 🔔 유니버스·알림 임계값
[orderbook_strategy] 호가필터 — 전략별 (수치)
[strategy_switch] 전략 ON/OFF
[universe_source] 유니버스 소스
[kiwoom_condition_config] 키움 조건검색 (안정화·회복)
[ls_condition_config] LS 조건검색 (안정화·Diff 보정)
[strategy_budget] 전략별 운용한도
[daily_profit_strategy] 일일 익절 — 전략별 (서브)
[whipsaw_strategy] 휩쏘 — 전략별 ON/OFF · 꼬리 초/%
[execution_fill] 체결 검증 (실전·모의 훈련)
[rest_throttle] REST 유량 제한 (한투 API)
[scan_loop_sleep] 스캔 루프 회전율 (WS 따라가기)
[tick_sell_by_strategy] 전략별 틱매도 (선택)
[candidate_limit] 전략별 후보 상한 (WS 100 구독 분배)
[updown_box] UPDOWN 박스권 — 판별·진입·손절 스택
[scalp_exit] 스캘핑(SCALP) — EOD
[breakout_exit] 돌파(BREAKOUT) — EOD · 수익구간 호가매도 · 손절호가
[momentum_exit] 모멘텀(MOMENTUM) — EOD · 수익구간 호가매도 · 손절호가
[tail_exit] 꼬리(SHORT/TAIL) — EOD
[error_watch_mm] 오류감시 → Mattermost
[ops_alert] 운영치명 알림 (봇 내부)
[portfolio_hold] 보유·매도 / 고아복구
Terminal ID: 1893648


정상적으로 그룹이 분리되어 반영됐습니다. 웹 새로고침하시면 **운영설정 탭**에서 아래처럼 깔끔하게 정리된 섹션들을 볼 수 있습니다:

---

### 변경된 내용 요약

**기존 문제**: `TRIGGER 필터 — WS 공통`이라는 난해한 섹션 하나에 시세 소스, 호가, 프로그램, 휩쏘, 알람 설정이 뒤섞여 있었음

**정리 후 4개 섹션으로 분리**:

| 섹션 | 내용 |
|------|------|
| 📡 **시세 소스 설정** | 키움/KIS 중 어느 쪽으로 매매할지, KIS 최소구독, KIS 호가 수집 |
| ⚡ **매수 판단 필터 설정** | 호가·프로그램 수신, 매수 순간 스냅샷 저장, 시계열 저장 (모두 딜레이 없음 명시) |
| 🌊 **휩쏘 필터** | "틱을 N초 봉으로 묶는다"→ "관찰 단위 시간", "룩백" → "몇 초 전까지 볼지" 로 명확화 |
| 🔔 **유니버스·알림 임계값** | 히스토리 교집합 필터, 개장 허용 시간, 소켓 끊김 알람 기준 |

특히 회원님이 지적하신 **"실시간 RAM인데 초 딜레이가 웬말이냐"** 부분은 `WS_ORDERBOOK_SAVE_MODE=interval` 삭제하고, 호가 저장 관련 설명도 완전히 재작성했습니다. `WS_TRIGGER_SNAPSHOT_DB_INTERVAL_SEC` 항목도 제거했습니다.

`http://192.168.0.149:5050` → 운영설정 탭 → 새로고침으로 확인하시면 됩니다!


<USER_REQUEST>
호가
 📖 키움 실시간 호가 수신 KIWOOM_WS_ORDERBOOK_ENABLED
env_config
ON(권장) = 키움 증권사의 실시간 호가(10단계 매수/매도) 데이터를 메모리에 저장 | OFF = 호가 필터, 호가 저장 전부 불가
 📸 매수 검토 순간 호가 1장 저장 WS_ORDERBOOK_COLLECT_ENABLED
env_config
ON = 매수를 검토하는 바로 그 순간 호가 스냅샷 1장을 DB에 저장 | → 나중에 '왜 이 종목을 샀는가/안 샀는가' 확인 가능
 📼 호가 연속 시계열 저장 (파람서치용) WS_ORDERBOOK_SAVE_ENABLED
env_config
ON = 구독 중인 종목의 호가를 틱마다 계속 DB에 쌓음 | → 파라미터 서치에서 호가 축을 탐색할 때 필요 | 평소엔 OFF 권장 (DB 용량 많이 차지함), 변경 후 봇 재시작 필요
⏱ 호가 유효 시간(초) WS_ORDERBOOK_TICK_MAX_AGE_SEC
env_config_ext
3
틱이 들어왔을 때 호가 데이터가 이 시간(초)보다 오래됐으면 저장 안 함 | → 오래된 호가로 가짜 데이터 채우는 것 방지. 기본 3초

이거 무슨말인지 설명좀

🌊 휩쏘 필터 (가짜 상승 차단)
매수 신호가 떴는데 직전에 급락이 있었으면 가짜 신호(휩쏘)로 판단해서 차단. 예: 30초 안에 0.3% 이상 뚝 떨어졌다가 올라온 종목은 패스.
 🚫 휩쏘 필터 ON/OFF (전략 공통) WHIPSAW_FILTER_ENABLED
env_config
ON = 가짜 상승 종목 매수 차단 | OFF = 필터 끄고 다 매수
⏱ 관찰 단위 시간(초) WHIPSAW_SUBBAR_SEC
env_config
30
틱을 몇 초 단위로 묶어서 미니봉을 만들지 | 기본 30초 = 30초짜리 막대기로 패턴 분석
⏳ 몇 초 전까지 볼지 WHIPSAW_LOOKBACK_SEC
env_config
90
매수 신호 직전 몇 초를 돌아볼지 | 기본 90초 = 1분 30초 전까지 확인
📉 이 이상 떨어졌으면 가짜 신호로 판단 (분율) WHIPSAW_DIP_PCT
env_config
0.003
0.003 = 0.3% | 직전에 0.3% 이상 하락했다가 올라온 종목은 차단 | 더 큰 값 = 필터가 느슨해짐
📈 이 정도는 회복 허용 (분율) WHIPSAW_RECOVERY_TOL_PCT
env_config
0.001
0.001 = 0.1% | 하락 후 0.1% 이내로 빠르게 회복하면 정상으로 봄 | 노이즈성 미세 출렁임 허용
지금 호가쪽 다 켜져있지 않나? 전략별로 각각 스위치 켜놓은건가
나머지도 잘 이해가 안감 내가 이해하기로는 시세 호가 순간 매수체크 아닌가?

휩쏘 — 전략별 ON/OFF · 꼬리 초/%
ON/OFF와 초·%는 별개. 꼬리 Optuna --mode tpe 가 이 축을 탐색. 실매 현재값(enabled=false, 30초, 90초, 0.003, 0.001)이 그리드에 포함됨.
꼬리잡기
SHORT
 꼬리잡기 휩쏘 필터 TAIL_WHIPSAW_FILTER_ENABLED
config_short
꼬리 휩쏘 미니봉(초) TAIL_WHIPSAW_SUBBAR_SEC
config_short
30
비우면 글로벌 WHIPSAW_SUBBAR_SEC · Optuna 꼬리 TPE 축
꼬리 휩쏘 룩백(초) TAIL_WHIPSAW_LOOKBACK_SEC
config_short
180
비우면 글로벌 WHIPSAW_LOOKBACK_SEC
꼬리 휩쏘 하락폭(분율) TAIL_WHIPSAW_DIP_PCT
config_short
0.003
0.003=0.3% · 비우면 글로벌
꼬리 휩쏘 회복허용(분율) TAIL_WHIPSAW_RECOVERY_TOL_PCT
config_short
0.0015
0.001=0.1% · 비우면 글로벌
모멘텀
MOMENTUM
 모멘텀 휩쏘 필터 MOMENTUM_WHIPSAW_FILTER_ENABLED
config_momentum
돌파
BREAKOUT
 돌파 휩쏘 필터 BREAKOUT_WHIPSAW_FILTER_ENABLED
config_breakout
UPDOWN 박스
UPDOW
 UPDOWN 박스 휩쏘 필터 UPDOW_WHIPSAW_FILTER_ENABLED
config_updow

체결 검증 (실전·모의 훈련)
실전은 항상 fill 확인. 모의는 STRICT_FILL_VERIFY=true 시 동일
공통
 모의 엄격 체결 검증 STRICT_FILL_VERIFY
env_config
모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격
 매수 미체결 중복주문 방지 BUY_DEDUP_PENDING
env_config
동일 전략·종목 PENDING_FILL 있으면 재주문 스킵
백테 체결 슬리피지(편도 %) BACKTEST_SLIP_PCT
env_config_ext
0.2
STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%
백테 체결량 상한(진입봉 거래량×%) BACKTEST_VOL_FILL_CAP_PCT
env_config_ext
0
STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사
 매수 시장가 IOC USE_MARKET_IOC
env_config
실전 매수 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정
 매도 시장가 IOC USE_MARKET_IOC_SELL
env_config_ext
실전 매도 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정 · 거절 많으면 OFF
시장가 체결 대기(초) ORDER_FILL_WAIT_SEC
env_config
2
 주문DB중복 체결복구 DUPLICATE_ORDER_FILL_RECOVERY_ENABLED
env_config
insert 실패(주문DB중복) 시 inquire-daily-ccld 1회 → active_trades 복구 · 실패 시에만 REST
중복복구 체결대기(초) DUPLICATE_ORDER_RECOVERY_WAIT_SEC
env_config
2
주문DB중복 복구 전용 · 미설정 시 ORDER_FILL_WAIT_SEC 사용
지정가 체결 대기(초) LIMIT_ORDER_FILL_WAIT_SEC
env_config
1
미체결 재조회 주기(초) PENDING_FILL_POLL_INTERVAL_SEC
env_config
10
재조회 1회 대기(초) PENDING_FILL_POLL_SEC
env_config
1
 미체결 체결 일괄조회 PENDING_POLL_BATCH_FETCH
env_config
실매 heartbeat 전용 · ON=poll 1회당 inquire-daily-ccld 1건(미체결 N건) · OFF=건별 조회 · 백테 무관
매수 미체결 만료(초) PENDING_BUY_MAX_AGE_SEC
env_config
120
익절 매도 미체결 만료(초) PENDING_SELL_MAX_AGE_SEC
env_config
60
손절 매도 미체결 만료(초) PENDING_SELL_STOP_MAX_AGE_SEC
env_config
15
 손절 만료 후 즉시 재매도 SELL_PENDING_REORDER_ON_EXPIRE
env_config
 부분체결 잔량 자동취소 AUTO_CANCEL_PARTIAL_BUY_REMAINDER
env_config
 익절지정가→시장가 전 취소 SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY
env_config_ext
ON=지정가 미확인/부분체결 시 잔여 취소 후 ODNO 재조회, 취소실패·미확정이면 시장가 금지(PENDING) · OFF=레거시 즉시 시장가(이중매도 위험) · 전전략 OrderManager 공통
지정가 취소 후 재조회(초) SELL_LIMIT_RECHECK_WAIT_SEC
env_config_ext
1
SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY=ON 일 때 ODNO 재조회 대기
 취소실패+잔고0→매도확정 SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM
env_config_ext
ON=익절지정가 취소 실패·ODNO 미확인이어도 브로커 0주면 지정가 체결로 finalize(유령금지) · OFF=PENDING만
 PENDING매도 시 유령정리 금지 GHOST_PURGE_BLOCK_WHILE_PENDING_SELL
env_config_ext
ON=미확정 매도 ODNO 있으면 ghost_purge 대신 체결재조회/잔고확정 청산
일별체결조회 TR_ID DAILY_CCLD_TR_ID
env_config_ext
비우면 모의 VTTC0081R / 실전 TTTC0081R (레거시 *8001R 사용 금지)

이건 모의에만 적용되는건가?  슬롯 30만이면 실매랑 모의랑 이정도 차이가 나나?

전체적으로 다 지금 운영이랑 안맞는거 빼주고 정리좀 하고 나에게 설명도 해줘 결과를
</USER_REQUEST>
<ADDITIONAL_METADATA>
The current local time is: 2026-08-07T20:00:22+09:00.

The user's current state is as follows:
Active Document: /home/hoon/kis_bot/kis_trader/web/live_config_schema.py (LANGUAGE_PYTHON)
Cursor is on line: 230
Other open documents:
- /home/hoon/kis_bot/kis_trader/web/live_config_schema.py (LANGUAGE_PYTHON)
- /home/hoon/kis_bot/kis_trader/main.py (LANGUAGE_PYTHON)
Running terminal commands:
-
hoon@ubuntu2404:~/kis_bot$ ^C
hoon@ubuntu2404:~/kis_bot$ PYTHONPATH=/home/ho... (in /home/hoon/kis_bot, running for 1h14m16s)
- curl -s "http://localhost:5050/api/live_config" | python3 -c '
> import sys, ... (in /home/hoon/kis_bot, running for 10m17s)
</ADDITIONAL_METADATA>


The USER performed the following action:
Show the contents of file /home/hoon/kis_bot/kis_trader/web/live_config_schema.py from lines 214 to 249
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1229
Total Bytes: 65403
Showing lines 214 to 249
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
214:                 "매수 타이밍을 결정할 때 호가·프로그램 데이터를 어떻게 사용할지 설정. "
215:                 "모든 데이터는 실시간 메모리(RAM)에서 직접 읽으므로 딜레이 없음."
216:             ),
217:             "fields": [
218:                 _f(
219:                     "KIWOOM_WS_ORDERBOOK_ENABLED",
220:                     "📖 키움 실시간 호가 수신",
221:                     "bool",
222:                     default=True,
223:                     hint=(
224:                         "ON(권장) = 키움 증권사의 실시간 호가(10단계 매수/매도) 데이터를 메모리에 저장 | "
225:                         "OFF = 호가 필터, 호가 저장 전부 불가"
226:                     ),
227:                 ),
228:                 _f(
229:                     "KIWOOM_WS_PROGRAM_ENABLED",
230:                     "🤖 키움 프로그램 매매 데이터 수신",
231:                     "bool",
232:                     default=True,
233:                     hint=(
234:                         "ON = 기관·외국인 프로그램 매매 흐름을 메모리에 저장 | "
235:                         "OFF = 프로그램 매매 필터 사용 불가"
236:                     ),
237:                 ),
238:                 _f(
239:                     "WS_TRIGGER_EVAL_SAVE_ENABLED",
240:                     "💾 매수 판단 결과 DB 저장 (마스터 스위치)",
241:                     "bool",
242:                     default=True,
243:                     hint=(
244:                         "ON = 매수 검토할 때 호가·프로그램 스냅샷을 DB에 기록 (분석·디버깅용) | "
245:                         "OFF = 아래 모든 저장 비활성 (DB 용량 아낄 때)"
246:                     ),
247:                 ),
248:                 _f(
249:                     "WS_ORDERBOOK_COLLECT_ENABLED",


The user is asking about several things:
1. Explanation of the orderbook/호가 settings
2. Whether all the orderbook switches are currently ON
3. Whether the whipsaw filter is set per-strategy or globally
4. Questions about the "체결 검증" section - whether it's only for mock trading
5. They want to clean up all settings that don't match their current operation mode

Let me first look at the current settings in the DB to understand what's actually ON/OFF, and then look at the code to understand how each setting works.

Key questions:
1. "호가 유효 시간(초)" - what does it mean? The orderbook data comes in real-time, but when a tick arrives (price update), we check the orderbook data.

If the orderbook snapshot is older than this threshold (say 3 seconds), we discard it as stale rather than using outdated information. The other orderbook settings control what gets saved: one setting captures a single snapshot when evaluating buy conditions for analysis, another continuously logs the full orderbook time series for backtesting parameter optimization. For the whipsaw filter, I need to check whether it's implemented as a global setting or applied individually per strategy.

Looking at the execution validation section, some rules apply only to mock trading while others apply to real trading. The user is asking whether a 300k slot allocation would realistically produce the performance gap they're seeing between mock and live trading. Since they're actively trading with real money using kiwoom_main as their data provider and running four strategies across 40 stocks, I should focus on settings that actually matter for their current setup rather than mock-only configurations.

I need to review the database to see which settings are currently enabled, then filter out the irrelevant ones—mock-specific rules, the hidden strategies like RANGE_BREAK and DBBAND, and settings that are already working properly. For the orderbook questions, the key setting is whether Kiwoom's WebSocket is pulling real-time quote data. 호가 필터가 실제로 매수 체크 모멘트에서 사용되는 거고, 사용자가 모의 모드에 있다는 걸 확인했으니 체결 검증 섹션이 관련이 있다. 이제 스키마에서 뭘 유지할지 정리해야 하는데 RANGE_BREAK부터 살펴봐야겠다.

"""현재 운영 설정 핵심 키 조회"""
import sys
sys.path.insert(0, "/home/hoon/kis_bot")
from database import TradeDB

db = TradeDB()
try:
    snap = db.get_merged_env_snapshot() or {}

    keys = [
        "KIWOOM_WS_ORDERBOOK_ENABLED",
        "WS_ORDERBOOK_COLLECT_ENABLED",
        "WS_ORDERBOOK_SAVE_ENABLED",
        "WS_ORDERBOOK_TICK_MAX_AGE_SEC",
        "WS_TRIGGER_EVAL_SAVE_ENABLED",
        "WHIPSAW_FILTER_ENABLED",
        "TAIL_WHIPSAW_FILTER_ENABLED",
        "MOMENTUM_WHIPSAW_FILTER_ENABLED",
        "BREAKOUT_WHIPSAW_FILTER_ENABLED",
        "TAIL_ORDERBOOK_FILTER_ENABLED",
        "MOMENTUM_ORDERBOOK_FILTER_ENABLED",
        "BREAKOUT_ORDERBOOK_FILTER_ENABLED",
        "SCALP_ORDERBOOK_FILTER_ENABLED",
        "STRICT_FILL_VERIFY",
        "USE_MARKET_IOC",
        "USE_MARKET_IOC_SELL",
        "WS_PROVIDER",
        "WS_SUBSCRIBE_KIS_MINIMAL",
        "KIS_WS_ORDERBOOK_ENABLED",
    ]

    print("=== 현재 DB 설정값 ===")
    for k in keys:
        v = snap.get(k)
        print(f"  {k} = {repr(v)}")

finally:
    db.close()

현재 운영 설정 핵심 키 DB 조회 스크립트

현재 설정값 확인 스크립트 작성

파일 작성 (설정 확인 스크립트)


Created At: 2026-08-07T11:00:58Z
Completed At: 2026-08-07T11:01:01Z
Created file file:///home/hoon/kis_bot/scratch/check_live_settings.py with requested content.
If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.


현재 설정값 조회 실행

명령어 실행 (설정값 확인)


Created At: 2026-08-07T11:01:05Z
Completed At: 2026-08-07T11:01:07Z

				The command completed successfully.
				Output:
				[20:01:07] [TradeDB] 📌 target_candidates_history 테이블 확인/생성
[20:01:07] [TradeDB] 📌 ws_price_validation 테이블 확인/생성
[20:01:07] [TradeDB] 📌 ls_ws_ticks 테이블 확인/생성
[20:01:07] [TradeDB] 📌 ls_ws_candles 테이블 확인/생성
[20:01:07] [TradeDB] 📌 ls_ws_orderbook 테이블 확인/생성
[20:01:07] [TradeDB] 📌 kis_ws_orderbook 테이블 확인/생성
[20:01:07] [TradeDB] 📌 ls_ws_vi 테이블 확인/생성
[20:01:07] [TradeDB] 📌 ws_price_validation_ls 테이블 확인/생성
[20:01:07] [TradeDB] 📌 ls_universe_history 테이블 확인/생성
[20:01:07] [TradeDB] 📌 condition_job_events 테이블 확인/생성
[20:01:07] [TradeDB] 📌 stock_share_meta 테이블 확인/생성
[20:01:07] [TradeDB] 📊 DB 테이블 생성/확인 완료
[20:01:07] [TradeDB] ✅ TradeDB 초기화 완료: MariaDB 192.168.0.141:3306/kis_quant_db
=== 현재 DB 설정값 ===
  KIWOOM_WS_ORDERBOOK_ENABLED = 'true'
  WS_ORDERBOOK_COLLECT_ENABLED = ''
  WS_ORDERBOOK_SAVE_ENABLED = 'true'
  WS_ORDERBOOK_TICK_MAX_AGE_SEC = '3'
  WS_TRIGGER_EVAL_SAVE_ENABLED = ''
  WHIPSAW_FILTER_ENABLED = 'false'
  TAIL_WHIPSAW_FILTER_ENABLED = 'true'
  MOMENTUM_WHIPSAW_FILTER_ENABLED = ''
  BREAKOUT_WHIPSAW_FILTER_ENABLED = ''
  TAIL_ORDERBOOK_FILTER_ENABLED = 'true'
  MOMENTUM_ORDERBOOK_FILTER_ENABLED = 'true'
  BREAKOUT_ORDERBOOK_FILTER_ENABLED = 'true'
  SCALP_ORDERBOOK_FILTER_ENABLED = 'true'
  STRICT_FILL_VERIFY = 'false'
  USE_MARKET_IOC = 'true'
  USE_MARKET_IOC_SELL = 'true'
  WS_PROVIDER = 'kiwoom_main'
  WS_SUBSCRIBE_KIS_MINIMAL = 'False'
  KIS_WS_ORDERBOOK_ENABLED = None
Terminal ID: 1893648


파일 보기 (체결 검증)


Created At: 2026-08-07T11:01:12Z
Completed At: 2026-08-07T11:01:12Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1229
Total Bytes: 65403
Showing lines 600 to 750
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
600:             _f(_sid_key(sid, "SLOT_MONEY"), f"{lbl} 슬롯(원)", "int"),
601:             _f(_sid_key(sid, "MAX_STOCKS"), f"{lbl} 동시 종목", "int"),
602:         ])
603:     groups.append({
604:         "id": "strategy_budget",
605:         "title": "전략별 운용한도",
606:         "hint": "config_{strategy}",
607:         "fields": budget_fields,
608:     })
609:
610:     # 전략별 일일 익절 서브
611:     dp_fields: List[FieldDef] = []
612:     for sid in LIVE_STRATEGY_IDS:
613:         lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
614:         dp_fields.extend([
615:             _f(
616:                 _sid_key(sid, "DAILY_PROFIT_TARGET_ENABLED"),
617:                 f"{lbl} 손익 감시 켜기",
618:                 "bool",
619:                 hint="OFF = 해당 전략 일일익절 비활성 (매수 차단 없음)",
620:             ),
621:             _f(
622:                 _sid_key(sid, "DAILY_PROFIT_TARGET_KRW"),
623:                 f"{lbl} 목표(원)",
624:                 "int",
625:             ),
626:             _f(
627:                 _sid_key(sid, "DAILY_PROFIT_TARGET_PCT"),
628:                 f"{lbl} 목표(%)",
629:                 "float",
630:                 hint="퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용",
631:             ),
632:             _f(
633:                 _sid_key(sid, "DAILY_PROFIT_MODE"),
634:                 f"{lbl} 익절방식",
635:                 "text",
636:                 hint="비우면 마스터 상속 · fixed/trailing/both",
637:             ),
638:             _f(
639:                 _sid_key(sid, "DAILY_PROFIT_TRAIL_TIERS"),
640:                 f"{lbl} 다단 트레일",
641:                 "text",
642:                 hint="수익원:컷%,… · 비우면 마스터 상속 · 예: 30000:50,100000:35,300000:25",
643:             ),
644:             _f(
645:                 _sid_key(sid, "DAILY_PROFIT_TRAIL_DROP_PCT"),
646:                 f"{lbl} 단일 트레일 되돌림(%)",
647:                 "float",
648:                 hint="다단 비었을 때만 · 고점 대비 % · 비우면 마스터 상속 · 0=미사용",
649:             ),
650:             _f(
651:                 _sid_key(sid, "DAILY_PROFIT_TRAIL_ARM_KRW"),
652:                 f"{lbl} 트레일 발동수익(원)",
653:                 "int",
654:                 hint="이 이상 벌어야 트레일 감시 · 비우면 마스터 상속",
655:             ),
656:             _f(
657:                 _sid_key(sid, "DAILY_PROFIT_HALT_NEW_BUYS"),
658:                 f"{lbl} 신규매수 수동 중단",
659:                 "bool",
660:                 default=False,
661:                 hint="목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상",
662:             ),
663:             _f(
664:                 _sid_key(sid, "DAILY_PROFIT_RISK_BUDGET_ENABLED"),
665:                 f"{lbl} 리스크버짓(B)",
666:                 "bool",
667:                 default=False,
668:                 hint="ON=일일익절 hit 후 보유최악손절합>cushion 이면 전량정리 · 기본 OFF · 마스터 없음",
669:             ),
670:             _f(
671:                 _sid_key(sid, "DAILY_PROFIT_RISK_BUDGET_COOLDOWN_SEC"),
672:                 f"{lbl} 리스크버짓 쿨다운(초)",
673:                 "int",
674:                 default=300,
675:                 hint="같은 날 재평가 최소 간격 · 0=당일 1회만",
676:             ),
677:         ])
678:     groups.append({
679:         "id": "daily_profit_strategy",
680:         "title": "일일 익절 — 전략별 (서브)",
681:         "hint": (
682:             "전략별 손익만 따로 감시. 비어 있으면 마스터 값 상속. "
683:             "손익 감시 ON이면 목표 달성 시 해당 전략 신규매수 자동 차단. "
684:             "리스크버짓(B)은 전략별만(기본 OFF)."
685:         ),
686:         "fields": dp_fields,
687:     })
688:
689:     # 전략별 휩쏘 ON/OFF + 꼬리 초·% (Optuna TPE 축과 동일 키)
690:     ws_fields: List[FieldDef] = []
691:     for sid in LIVE_STRATEGY_IDS:
692:         if sid == "SCALP":
693:             continue
694:         lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
695:         pfx = "TAIL" if sid == "SHORT" else sid
696:         ws_fields.append(
697:             _f(f"{pfx}_WHIPSAW_FILTER_ENABLED", f"{lbl} 휩쏘 필터", "bool"),
698:         )
699:     ws_fields.extend([
700:         _f("TAIL_WHIPSAW_SUBBAR_SEC", "꼬리 휩쏘 미니봉(초)", "int", default=30,
701:            hint="비우면 글로벌 WHIPSAW_SUBBAR_SEC · Optuna 꼬리 TPE 축"),
702:         _f("TAIL_WHIPSAW_LOOKBACK_SEC", "꼬리 휩쏘 룩백(초)", "int", default=90,
703:            hint="비우면 글로벌 WHIPSAW_LOOKBACK_SEC"),
704:         _f("TAIL_WHIPSAW_DIP_PCT", "꼬리 휩쏘 하락폭(분율)", "float", default=0.003,
705:            hint="0.003=0.3% · 비우면 글로벌"),
706:         _f("TAIL_WHIPSAW_RECOVERY_TOL_PCT", "꼬리 휩쏘 회복허용(분율)", "float", default=0.001,
707:            hint="0.001=0.1% · 비우면 글로벌"),
708:     ])
709:     groups.append({
710:         "id": "whipsaw_strategy",
711:         "title": "휩쏘 — 전략별 ON/OFF · 꼬리 초/%",
712:         "hint": (
713:             "ON/OFF와 초·%는 별개. 꼬리 Optuna --mode tpe 가 이 축을 탐색. "
714:             "실매 현재값(enabled=false, 30초, 90초, 0.003, 0.001)이 그리드에 포함됨."
715:         ),
716:         "fields": ws_fields,
717:     })
718:
719:     groups.append({
720:         "id": "execution_fill",
721:         "title": "체결 검증 (실전·모의 훈련)",
722:         "hint": "실전은 항상 fill 확인. 모의는 STRICT_FILL_VERIFY=true 시 동일",
723:         "fields": [
724:             _f("STRICT_FILL_VERIFY", "모의 엄격 체결 검증", "bool", default=False,
725:                hint="모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격"),
726:             _f("BUY_DEDUP_PENDING", "매수 미체결 중복주문 방지", "bool", default=True,
727:                hint="동일 전략·종목 PENDING_FILL 있으면 재주문 스킵"),
728:             _f("BACKTEST_SLIP_PCT", "백테 체결 슬리피지(편도 %)", "float", default=0.0,
729:                hint="STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%"),
730:             _f("BACKTEST_VOL_FILL_CAP_PCT", "백테 체결량 상한(진입봉 거래량×%)", "float", default=0.0,
731:                hint="STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사"),
732:             _f("TAIL_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 꼬리 OHLC 폴백 (정합위험·금지)", "bool", default=False,
733:                danger=True,
734:                hint="절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF"),
735:             _f("TAIL_BACKTEST_USE_TICK_EXIT", "꼬리 틱 청산", "bool", default=True,
736:                hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
737:             _f("TAIL_BACKTEST_POLL_MS", "꼬리 틱청산 폴링(ms)", "int", default=100,
738:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
739:             _f("MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 모멘텀 OHLC 폴백 (정합위험·금지)", "bool", default=False,
740:                danger=True,
741:                hint="절대금지 — 틱 청산 ON 시 엔진 무시 · Optuna 강제 OFF"),
742:             _f("MOMENTUM_BACKTEST_POLL_MS", "모멘텀 틱청산 폴링(ms)", "int", default=100,
743:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 틱 사이 청산 검사 간격 · 하한 50ms"),
744:             _f("BREAKOUT_BACKTEST_USE_TICK_EXIT", "돌파 틱 청산", "bool", default=True,
745:                hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
746:             _f("BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
747:                danger=True,
748:                hint="절대금지 — 틱 진입 ON 시 봉 high 폴백 안 함"),
749:             _f("BREAKOUT_BACKTEST_POLL_MS", "돌파 틱청산 폴링(ms)", "int", default=100,
750:                hint="실매 폴링 정합 · 하한 50ms"),
The above content does NOT show the entire file contents. If you need to view any lines of the file which were not shown to complete your task, call this tool again to view those lines.


체결 검증 섹션 나머지 확인

파일 보기 (체결 검증 후반)


Created At: 2026-08-07T11:01:17Z
Completed At: 2026-08-07T11:01:18Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1229
Total Bytes: 65403
Showing lines 750 to 830
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
750:                hint="실매 폴링 정합 · 하한 50ms"),
751:             _f("SCALP_BACKTEST_USE_TICK_EXIT", "스캘핑 틱 청산", "bool", default=True,
752:                hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
753:             _f("SCALP_BACKTEST_USE_TICK_ENTRY", "스캘핑 틱 진입", "bool", default=True,
754:                hint="ON=예약 체결 시 해당 분 첫 틱가 · OFF=분봉 시가"),
755:             _f("SCALP_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 스캘핑 OHLC 폴백 (정합위험·금지)", "bool", default=False,
756:                danger=True,
757:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
758:             _f("SCALP_BACKTEST_POLL_MS", "스캘핑 틱청산 폴링(ms)", "int", default=100,
759:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
760:             _f("RANGE_BREAK_BACKTEST_USE_TICK_EXIT", "박스돌파 틱 청산", "bool", default=True,
761:                hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
762:             _f("RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 박스돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
763:                danger=True,
764:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
765:             _f("RANGE_BREAK_BACKTEST_POLL_MS", "박스돌파 틱청산 폴링(ms)", "int", default=100,
766:                hint="실매 폴링 정합 · 하한 50ms"),
767:             _f("DBBAND_BACKTEST_USE_TICK_EXIT", "더블BB 틱 청산", "bool", default=True,
768:                hint="ON=ws_ticks 시간순 청산 · OFF=봉 OHLC 1회"),
769:             _f("DBBAND_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 더블BB OHLC 폴백 (정합위험·금지)", "bool", default=False,
770:                danger=True,
771:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
772:             _f("DBBAND_BACKTEST_POLL_MS", "더블BB 틱청산 폴링(ms)", "int", default=100,
773:                hint="실매 폴링 정합 · 하한 50ms"),
774:             _f("TAIL_PARAM_SEARCH_MIN_START", "꼬리 파라서치 최소 시작일", "str", default="2026-07-07",
775:                hint="조건식 변경일 이후만 탐색 (YYYY-MM-DD) · CLI --start 와 max 적용"),
776:             _f("USE_MARKET_IOC", "매수 시장가 IOC", "bool", default=True,
777:                hint="실전 매수 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정"),
778:             _f("USE_MARKET_IOC_SELL", "매도 시장가 IOC", "bool", default=True,
779:                hint="실전 매도 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정 · 거절 많으면 OFF"),
780:             _f("ORDER_FILL_WAIT_SEC", "시장가 체결 대기(초)", "int", default=2),
781:             _f("DUPLICATE_ORDER_FILL_RECOVERY_ENABLED", "주문DB중복 체결복구", "bool", default=True,
782:                hint="insert 실패(주문DB중복) 시 inquire-daily-ccld 1회 → active_trades 복구 · 실패 시에만 REST"),
783:             _f("DUPLICATE_ORDER_RECOVERY_WAIT_SEC", "중복복구 체결대기(초)", "int", default=2,
784:                hint="주문DB중복 복구 전용 · 미설정 시 ORDER_FILL_WAIT_SEC 사용"),
785:             _f("LIMIT_ORDER_FILL_WAIT_SEC", "지정가 체결 대기(초)", "int", default=1),
786:             _f("PENDING_FILL_POLL_INTERVAL_SEC", "미체결 재조회 주기(초)", "int", default=10),
787:             _f("PENDING_FILL_POLL_SEC", "재조회 1회 대기(초)", "int", default=1),
788:             _f("PENDING_POLL_BATCH_FETCH", "미체결 체결 일괄조회", "bool", default=True,
789:                hint="실매 heartbeat 전용 · ON=poll 1회당 inquire-daily-ccld 1건(미체결 N건) · OFF=건별 조회 · 백테 무관"),
790:             _f("PENDING_BUY_MAX_AGE_SEC", "매수 미체결 만료(초)", "int", default=120),
791:             _f("PENDING_SELL_MAX_AGE_SEC", "익절 매도 미체결 만료(초)", "int", default=60),
792:             _f("PENDING_SELL_STOP_MAX_AGE_SEC", "손절 매도 미체결 만료(초)", "int", default=15),
793:             _f("SELL_PENDING_REORDER_ON_EXPIRE", "손절 만료 후 즉시 재매도", "bool", default=True),
794:             _f("AUTO_CANCEL_PARTIAL_BUY_REMAINDER", "부분체결 잔량 자동취소", "bool", default=True),
795:             _f(
796:                 "SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY",
797:                 "익절지정가→시장가 전 취소",
798:                 "bool",
799:                 default=True,
800:                 hint=(
801:                     "ON=지정가 미확인/부분체결 시 잔여 취소 후 ODNO 재조회, "
802:                     "취소실패·미확정이면 시장가 금지(PENDING) · "
803:                     "OFF=레거시 즉시 시장가(이중매도 위험) · 전전략 OrderManager 공통"
804:                 ),
805:             ),
806:             _f(
807:                 "SELL_LIMIT_RECHECK_WAIT_SEC",
808:                 "지정가 취소 후 재조회(초)",
809:                 "int",
810:                 default=1,
811:                 hint="SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY=ON 일 때 ODNO 재조회 대기",
812:             ),
813:             _f(
814:                 "SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM",
815:                 "취소실패+잔고0→매도확정",
816:                 "bool",
817:                 default=True,
818:                 hint=(
819:                     "ON=익절지정가 취소 실패·ODNO 미확인이어도 브로커 0주면 "
820:                     "지정가 체결로 finalize(유령금지) · OFF=PENDING만"
821:                 ),
822:             ),
823:             _f(
824:                 "GHOST_PURGE_BLOCK_WHILE_PENDING_SELL",
825:                 "PENDING매도 시 유령정리 금지",
826:                 "bool",
827:                 default=True,
828:                 hint=(
829:                     "ON=미확정 매도 ODNO 있으면 ghost_purge 대신 체결재조회/잔고확정 청산"
830:                 ),
The above content does NOT show the entire file contents. If you need to view any lines of the file which were not shown to complete your task, call this tool again to view those lines.


DB 설정값과 코드를 파악했습니다. 이제 정리하겠습니다.

**먼저 회원님 질문 답변:**

---

### ❓ 호가 설정 질문

현재 DB 상태:
- `KIWOOM_WS_ORDERBOOK_ENABLED = 'true'` → **키움 호가 수신 켜짐 ✅**
- `WS_ORDERBOOK_SAVE_ENABLED = 'true'` → **호가 연속 시계열 저장도 켜짐 ✅** (틱마다 계속 DB에 쌓는 중)
- `WS_ORDERBOOK_COLLECT_ENABLED = ''` (비어있음) → 기본값 TRUE로 동작

**"호가 유효 시간 3초"** 뜻:
> 키움이 시세 틱(체결가)을 보냈을 때, RAM에 있는 호가 데이터가 3초보다 오래됐으면 그 틱에 호가를 끼워 저장하지 않는다. 호가와 시세는 별도로 들어오기 때문에, 시세는 왔는데 호가가 3초 이상 안 들어왔다면 오래된 호가를 억지로 붙이지 말라는 것.

**"전략별로 각각 스위치"**: 맞습니다. 현재:
- `TAIL_ORDERBOOK_FILTER_ENABLED = 'true'` → 꼬리잡기 호가필터 **ON**
- `MOMENTUM_ORDERBOOK_FILTER_ENABLED = 'true'` → 모멘텀 **ON**
- `BREAKOUT_ORDERBOOK_FILTER_ENABLED = 'true'` → 돌파 **ON**
- `SCALP_ORDERBOOK_FILTER_ENABLED = 'true'` → 스캘핑 **ON**

위 `KIWOOM_WS_ORDERBOOK_ENABLED`는 "호가 데이터 자체를 수신할지" 마스터 스위치이고, `*_ORDERBOOK_FILTER_ENABLED`는 "수신된 호가로 매수를 막을지" 전략별 필터입니다.

**"체결 검증 섹션 모의에만?"**: 일부는 모의 전용, 대부분은 실전에도 적용됩니다. 지금 `모의·active` 상태이므로 모두 해당됩니다.

**"슬롯 30만이면 실매랑 모의랑 차이?"**: 슬롯 금액은 동일하게 적용되지만 모의는 API 제약(체결 보장 불가)이 있어서 실제 수익/손실 패턴이 다릅니다.

---

이제 `체결 검증` 섹션에서 **비활성 전략(RANGE_BREAK, DBBAND)** 제거하고, 전체 섹션 설명도 명확하게 재작성하겠습니다.

체결 검증 섹션 정리: RANGE_BREAK, DBBAND 제거, 모의/실전 구분 명확화, 설명 초등생 수준으로 단순화

Instruction: 체결 검증 섹션을 실전/모의 구분 명확히 하고, 사용 안 하는 RANGE_BREAK/DBBAND 제거, 라벨 단순화

    groups.append({
        "id": "execution_fill",
        "title": "🏦 주문·체결 설정 (실전+모의 공통)",
        "hint": (
            "⚠ 현재 모의(mock) 모드로 운영 중. "
            "실전 전환 시 STRICT_FILL_VERIFY 는 무관 (실전은 항상 체결 확인). "
            "나머지 설정은 모의·실전 모두 동일하게 적용됨."
        ),
        "fields": [
            _f(
                "USE_MARKET_IOC",
                "⚡ 매수 시장가 IOC (즉시체결 후 미체결 취소)",
                "bool",
                default=True,
                hint=(
                    "ON(권장) = 매수 주문을 시장가로 내고, 즉시 안 채워진 나머지는 자동 취소 (실전만 해당, 모의는 항상 지정가) | "
                    "OFF = 시장가 보통주문 (미체결이 그냥 남아있음)"
                ),
            ),
            _f(
                "USE_MARKET_IOC_SELL",
                "⚡ 매도 시장가 IOC",
                "bool",
                default=True,
                hint=(
                    "ON = 매도도 IOC 시장가 (실전만 해당, 모의는 항상 지정가) | "
                    "OFF = 시장가 보통주문. 거절(주문거부) 많이 나오면 OFF로"
                ),
            ),
            _f(
                "STRICT_FILL_VERIFY",
                "🔍 모의 체결 강제 확인 (모의 전용)",
                "bool",
                default=False,
                hint=(
                    "★ 모의 모드에서만 의미 있음 (실전은 항상 체결 확인) ★ | "
                    "ON = 모의에서도 매수 후 체결 API 로 실제 체결 됐는지 확인. "
                    "모의 API 특성상 확인 실패해서 매수 0건으로 집계될 수 있음 | "
                    "OFF(기본) = 모의는 주문만 내고 체결됐다고 가정"
                ),
            ),
            _f(
                "BUY_DEDUP_PENDING",
                "🚫 동일 종목 매수 중복 방지",
                "bool",
                default=True,
                hint=(
                    "ON(권장) = 같은 전략·종목의 주문이 아직 체결 대기 중이면 추가 주문 안 냄 | "
                    "OFF = 중복 주문 허용 (같은 종목을 두 번 살 수 있음)"
                ),
            ),
            _f(
                "ORDER_FILL_WAIT_SEC",
                "⏱ 시장가 주문 체결 대기 시간(초)",
                "int",
                default=2,
                hint="주문 낸 후 체결됐는지 확인하기까지 기다리는 시간. 기본 2초.",
            ),
            _f(
                "PENDING_BUY_MAX_AGE_SEC",
                "⏳ 매수 미체결 주문 포기 시간(초)",
                "int",
                default=120,
                hint=(
                    "매수 주문을 냈는데 이 시간(초) 안에 체결이 안 되면 포기하고 주문 취소 | "
                    "기본 120초(2분)"
                ),
            ),
            _f(
                "PENDING_SELL_MAX_AGE_SEC",
                "⏳ 익절 매도 미체결 주문 포기 시간(초)",
                "int",
                default=60,
                hint="익절 매도 주문이 이 시간(초) 안에 안 채워지면 포기. 기본 60초.",
            ),
            _f(
                "PENDING_SELL_STOP_MAX_AGE_SEC",
                "⏳ 손절 매도 미체결 주문 포기 시간(초)",
                "int",
                default=15,
                hint=(
                    "손절은 빨리 안 팔리면 위험! 이 시간(초) 안에 체결 안 되면 재주문 | "
                    "기본 15초 (손절은 짧게)"
                ),
            ),
            _f(
                "SELL_PENDING_REORDER_ON_EXPIRE",
                "🔄 손절 포기 후 즉시 재주문",
                "bool",
                default=True,
                hint=(
                    "ON(권장) = 손절 주문이 시간 초과되면 즉시 새로 손절 주문 | "
                    "OFF = 그냥 포기"
                ),
            ),
            _f(
                "AUTO_CANCEL_PARTIAL_BUY_REMAINDER",
                "✂ 매수 일부 체결 후 나머지 자동 취소",
                "bool",
                default=True,
                hint=(
                    "ON(권장) = 100주 주문했는데 50주만 체결됐으면 나머지 50주 주문 자동 취소 | "
                    "OFF = 나머지 50주 주문이 그대로 남아있음"
                ),
            ),
            _f(
                "SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY",
                "🔒 익절 지정가 취소 후 시장가 전환",
                "bool",
                default=True,
                hint=(
                    "ON(권장) = 익절 지정가 매도가 안 팔리면 → 취소 확인 후 → 시장가로 바꿔서 팜. "
                    "안전하게 이중매도 방지 | "
                    "OFF = 레거시 방식 (이중매도 위험, 비권장)"
                ),
            ),
            _f(
                "SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM",
                "🛡 취소 실패해도 잔고 0이면 매도 완료 처리",
                "bool",
                default=True,
                hint=(
                    "ON(권장) = 취소 요청이 실패해도 실제 잔고를 보니 0주면 지정가에 팔린 걸로 확정 | "
                    "→ 유령 포지션(DB엔 있는데 실제론 없는 것) 방지"
                ),
            ),
            _f(
                "GHOST_PURGE_BLOCK_WHILE_PENDING_SELL",
                "👻 매도 주문 대기 중 유령 정리 금지",
                "bool",
                default=True,
                hint=(
                    "ON(권장) = 아직 체결 확인 안 된 매도 주문이 있으면 유령(DB만 있는 포지션) 정리 안 함 | "
                    "→ '팔리는 중인데 유령이라고 지워버리는' 사고 방지"
                ),
            ),
            _f(
                "BACKTEST_SLIP_PCT",
                "📊 백테스트 슬리피지 (백테 전용)",
                "float",
                default=0.0,
                hint=(
                    "★ 백테스트·파람서치에만 적용, 실제 매매 무관 ★ | "
                    "0.2 = 매수가에 0.2%, 매도가에서 0.2% 차감해서 현실적인 수익 계산 | "
                    "0 = 이상적인 체결 가정 (실제보다 성과 좋게 나옴)"
                ),
            ),
            _f(
                "BACKTEST_VOL_FILL_CAP_PCT",
                "📊 백테스트 체결량 상한 (백테 전용)",
                "float",
                default=0.0,
                hint=(
                    "★ 백테스트·파람서치에만 적용 ★ | "
                    "0 = 무제한 (다 체결됐다고 가정) | "
                    "예: 20 = 해당 봉 거래량의 20%까지만 체결 가정 (소형주 현실 반영)"
                ),
            ),
            _f(
                "TAIL_BACKTEST_USE_TICK_EXIT",
                "📊 꼬리잡기 백테 틱 청산 (백테 전용)",
                "bool",
                default=True,
                hint=(
                    "★ 백테스트에서만 사용 ★ | "
                    "ON(권장) = 실제 틱 데이터 시간순으로 손절/익절 판단 (실매매와 동일 방식) | "
                    "OFF = 봉 OHLC로 판단 (덜 정확)"
                ),
            ),
            _f(
                "TAIL_BACKTEST_TICK_FALLBACK_OHLC",
                "⛔ 꼬리잡기 OHLC 폴백 (절대 금지)",
                "bool",
                default=False,
                danger=True,
                hint=(
                    "⛔ 절대 ON 하지 말 것! ⛔ | "
                    "ON = 틱 데이터로 청산하는 대신 봉 고점/저점으로 체결가 계산 → 실매매와 완전 다른 결과"
                ),
            ),
            _f(
                "TAIL_BACKTEST_POLL_MS",
                "📊 꼬리잡기 틱 청산 검사 간격(ms) (백테 전용)",
                "int",
                default=100,
                hint="백테에서 틱을 몇 ms마다 확인할지. 100ms = 0.1초 = 실매매 루프와 동일.",
            ),
            _f(
                "TAIL_PARAM_SEARCH_MIN_START",
                "📅 꼬리잡기 파라미터 서치 시작일 하한",
                "str",
                default="2026-07-07",
                hint=(
                    "꼬리잡기 Optuna 파람서치를 이 날짜 이전 데이터로는 탐색 안 함 | "
                    "조건식 바꾼 날 이후만 탐색하도록. YYYY-MM-DD 형식."
                ),
            ),
            _f(
                "BREAKOUT_BACKTEST_USE_TICK_EXIT",
                "📊 돌파 백테 틱 청산 (백테 전용)",
                "bool",
                default=True,
                hint=(
                    "★ 백테스트에서만 사용 ★ | "
                    "ON(권장) = 실제 틱 순서로 청산 판단 (실매매 정합)"
                ),
            ),
            _f(
                "BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC",
                "⛔ 돌파 OHLC 폴백 (절대 금지)",
                "bool",
                default=False,
                danger=True,
                hint="⛔ 절대 ON 하지 말 것! ⛔ | 봉 high/low로 체결가 계산 → 실매와 다른 가짜 결과",
            ),
            _f(
                "BREAKOUT_BACKTEST_POLL_MS",
                "📊 돌파 틱 청산 검사 간격(ms) (백테 전용)",
                "int",
                default=100,
                hint="백테에서 틱을 몇 ms마다 확인할지. 기본 100ms.",
            ),
            _f(
                "MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC",
                "⛔ 모멘텀 OHLC 폴백 (절대 금지)",
                "bool",
                default=False,
                danger=True,
                hint="⛔ 절대 ON 하지 말 것! ⛔",
            ),
            _f(
                "MOMENTUM_BACKTEST_POLL_MS",
                "📊 모멘텀 틱 청산 검사 간격(ms) (백테 전용)",
                "int",
                default=100,
            ),
            _f(
                "SCALP_BACKTEST_USE_TICK_EXIT",
                "📊 스캘핑 백테 틱 청산 (백테 전용)",
                "bool",
                default=True,
                hint="ON = 실제 틱 순서로 청산 (실매매 정합)",
            ),
            _f(
                "SCALP_BACKTEST_USE_TICK_ENTRY",
                "📊 스캘핑 백테 틱 진입 (백테 전용)",
                "bool",
                default=True,
                hint=(
                    "ON = 예약 체결 시 해당 분봉의 첫 틱 가격으로 진입 | "
                    "OFF = 분봉 시가로 진입"
                ),
            ),
            _f(
                "SCALP_BACKTEST_TICK_FALLBACK_OHLC",
                "⛔ 스캘핑 OHLC 폴백 (절대 금지)",
                "bool",
                default=False,
                danger=True,
                hint="⛔ 절대 ON 하지 말 것! ⛔",
            ),
            _f(
                "SCALP_BACKTEST_POLL_MS",
                "📊 스캘핑 틱 청산 검사 간격(ms) (백테 전용)",
                "int",
                default=100,
            ),
        ],
    })

    groups.append({
        "id": "execution_fill",
        "title": "체결 검증 (실전·모의 훈련)",
        "hint": "실전은 항상 fill 확인. 모의는 STRICT_FILL_VERIFY=true 시 동일",
        "fields": [

체결 검증 섹션 전면 재작성

파일 편집 (체결 검증 섹션)


Created At: 2026-08-07T11:02:33Z
Completed At: 2026-08-07T11:02:35Z
The following changes were made by the replace_file_content tool to: /home/hoon/kis_bot/kis_trader/web/live_config_schema.py. If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.
[diff_block_start]
@@ -718,9 +718,274 @@

     groups.append({
         "id": "execution_fill",
-        "title": "체결 검증 (실전·모의 훈련)",
-        "hint": "실전은 항상 fill 확인. 모의는 STRICT_FILL_VERIFY=true 시 동일",
-        "fields": [
+        "title": "🏦 주문·체결 설정 (실전+모의 공통)",
+        "hint": (
+            "⚠ 현재 모의(mock) 모드로 운영 중. "
+            "실전 전환 시 STRICT_FILL_VERIFY 는 무관 (실전은 항상 체결 확인). "
+            "나머지 설정은 모의·실전 모두 동일하게 적용됨."
+        ),
+        "fields": [
+            _f(
+                "USE_MARKET_IOC",
+                "⚡ 매수 시장가 IOC (즉시체결 후 미체결 취소)",
+                "bool",
+                default=True,
+                hint=(
+                    "ON(권장) = 매수 주문을 시장가로 내고, 즉시 안 채워진 나머지는 자동 취소 (실전만 해당, 모의는 항상 지정가) | "
+                    "OFF = 시장가 보통주문 (미체결이 그냥 남아있음)"
+                ),
+            ),
+            _f(
+                "USE_MARKET_IOC_SELL",
+                "⚡ 매도 시장가 IOC",
+                "bool",
+                default=True,
+                hint=(
+                    "ON = 매도도 IOC 시장가 (실전만 해당, 모의는 항상 지정가) | "
+                    "OFF = 시장가 보통주문. 거절(주문거부) 많이 나오면 OFF로"
+                ),
+            ),
+            _f(
+                "STRICT_FILL_VERIFY",
+                "🔍 모의 체결 강제 확인 (모의 전용)",
+                "bool",
+                default=False,
+                hint=(
+                    "★ 모의 모드에서만 의미 있음 (실전은 항상 체결 확인) ★ | "
+                    "ON = 모의에서도 매수 후 체결 API 로 실제 체결 됐는지 확인. "
+                    "모의 API 특성상 확인 실패해서 매수 0건으로 집계될 수 있음 | "
+                    "OFF(기본) = 모의는 주문만 내고 체결됐다고 가정"
+                ),
+            ),
+            _f(
+                "BUY_DEDUP_PENDING",
+                "🚫 동일 종목 매수 중복 방지",
+                "bool",
+                default=True,
+                hint=(
+                    "ON(권장) = 같은 전략·종목의 주문이 아직 체결 대기 중이면 추가 주문 안 냄 | "
+                    "OFF = 중복 주문 허용 (같은 종목을 두 번 살 수 있음)"
+                ),
+            ),
+            _f(
+                "ORDER_FILL_WAIT_SEC",
+                "⏱ 시장가 주문 체결 대기 시간(초)",
+                "int",
+                default=2,
+                hint="주문 낸 후 체결됐는지 확인하기까지 기다리는 시간. 기본 2초.",
+            ),
+            _f(
+                "PENDING_BUY_MAX_AGE_SEC",
+                "⏳ 매수 미체결 주문 포기 시간(초)",
+                "int",
+                default=120,
+                hint=(
+                    "매수 주문을 냈는데 이 시간(초) 안에 체결이 안 되면 포기하고 주문 취소 | "
+                    "기본 120초(2분)"
+                ),
+            ),
+            _f(
+                "PENDING_SELL_MAX_AGE_SEC",
+                "⏳ 익절 매도 미체결 주문 포기 시간(초)",
+                "int",
+                default=60,
+                hint="익절 매도 주문이 이 시간(초) 안에 안 채워지면 포기. 기본 60초.",
+            ),
+            _f(
+                "PENDING_SELL_STOP_MAX_AGE_SEC",
+                "⏳ 손절 매도 미체결 주문 포기 시간(초)",
+                "int",
+                default=15,
+                hint=(
+                    "손절은 빨리 안 팔리면 위험! 이 시간(초) 안에 체결 안 되면 재주문 | "
+                    "기본 15초 (손절은 짧게)"
+                ),
+            ),
+            _f(
+                "SELL_PENDING_REORDER_ON_EXPIRE",
+                "🔄 손절 포기 후 즉시 재주문",
+                "bool",
+                default=True,
+                hint=(
+                    "ON(권장) = 손절 주문이 시간 초과되면 즉시 새로 손절 주문 | "
+                    "OFF = 그냥 포기"
+                ),
+            ),
+            _f(
+                "AUTO_CANCEL_PARTIAL_BUY_REMAINDER",
+                "✂ 매수 일부 체결 후 나머지 자동 취소",
+                "bool",
+                default=True,
+                hint=(
+                    "ON(권장) = 100주 주문했는데 50주만 체결됐으면 나머지 50주 주문 자동 취소 | "
+                    "OFF = 나머지 50주 주문이 그대로 남아있음"
+                ),
+            ),
+            _f(
+                "SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY",
+                "🔒 익절 지정가 취소 후 시장가 전환",
+                "bool",
+                default=True,
+                hint=(
+                    "ON(권장) = 익절 지정가 매도가 안 팔리면 → 취소 확인 후 → 시장가로 바꿔서 팜. "
+                    "안전하게 이중매도 방지 | "
+                    "OFF = 레거시 방식 (이중매도 위험, 비권장)"
+                ),
+            ),
+            _f(
+                "SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM",
+                "🛡 취소 실패해도 잔고 0이면 매도 완료 처리",
+                "bool",
+                default=True,
+                hint=(
+                    "ON(권장) = 취소 요청이 실패해도 실제 잔고를 보니 0주면 지정가에 팔린 걸로 확정 | "
+                    "→ 유령 포지션(DB엔 있는데 실제론 없는 것) 방지"
+                ),
+            ),
+            _f(
+                "GHOST_PURGE_BLOCK_WHILE_PENDING_SELL",
+                "👻 매도 주문 대기 중 유령 정리 금지",
+                "bool",
+                default=True,
+                hint=(
+                    "ON(권장) = 아직 체결 확인 안 된 매도 주문이 있으면 유령(DB만 있는 포지션) 정리 안 함 | "
+                    "→ '팔리는 중인데 유령이라고 지워버리는' 사고 방지"
+                ),
+            ),
+            _f(
+                "BACKTEST_SLIP_PCT",
+                "📊 백테스트 슬리피지 (백테 전용)",
+                "float",
+                default=0.0,
+                hint=(
+                    "★ 백테스트·파람서치에만 적용, 실제 매매 무관 ★ | "
+                    "0.2 = 매수가에 0.2%, 매도가에서 0.2% 차감해서 현실적인 수익 계산 | "
+                    "0 = 이상적인 체결 가정 (실제보다 성과 좋게 나옴)"
+                ),
+            ),
+            _f(
+                "BACKTEST_VOL_FILL_CAP_PCT",
+                "📊 백테스트 체결량 상한 (백테 전용)",
+                "float",
+                default=0.0,
+                hint=(
+                    "★ 백테스트·파람서치에만 적용 ★ | "
+                    "0 = 무제한 (다 체결됐다고 가정) | "
+                    "예: 20 = 해당 봉 거래량의 20%까지만 체결 가정 (소형주 현실 반영)"
+                ),
+            ),
+            _f(
+                "TAIL_BACKTEST_USE_TICK_EXIT",
+                "📊 꼬리잡기 백테 틱 청산 (백테 전용)",
+                "bool",
+                default=True,
+                hint=(
+                    "★ 백테스트에서만 사용 ★ | "
+                    "ON(권장) = 실제 틱 데이터 시간순으로 손절/익절 판단 (실매매와 동일 방식) | "
+                    "OFF = 봉 OHLC로 판단 (덜 정확)"
+                ),
+            ),
+            _f(
+                "TAIL_BACKTEST_TICK_FALLBACK_OHLC",
+                "⛔ 꼬리잡기 OHLC 폴백 (절대 금지)",
+                "bool",
+                default=False,
+                danger=True,
+                hint=(
+                    "⛔ 절대 ON 하지 말 것! ⛔ | "
+                    "ON = 틱 데이터로 청산하는 대신 봉 고점/저점으로 체결가 계산 → 실매매와 완전 다른 결과"
+                ),
+            ),
+            _f(
+                "TAIL_BACKTEST_POLL_MS",
+                "📊 꼬리잡기 틱 청산 검사 간격(ms) (백테 전용)",
+                "int",
+                default=100,
+                hint="백테에서 틱을 몇 ms마다 확인할지. 100ms = 0.1초 = 실매매 루프와 동일.",
+            ),
+            _f(
+                "TAIL_PARAM_SEARCH_MIN_START",
+                "📅 꼬리잡기 파라미터 서치 시작일 하한",
+                "str",
+                default="2026-07-07",
+                hint=(
+                    "꼬리잡기 Optuna 파람서치를 이 날짜 이전 데이터로는 탐색 안 함 | "
+                    "조건식 바꾼 날 이후만 탐색하도록. YYYY-MM-DD 형식."
+                ),
+            ),
+            _f(
+                "BREAKOUT_BACKTEST_USE_TICK_EXIT",
+                "📊 돌파 백테 틱 청산 (백테 전용)",
+                "bool",
+                default=True,
+                hint=(
+                    "★ 백테스트에서만 사용 ★ | "
+                    "ON(권장) = 실제 틱 순서로 청산 판단 (실매매 정합)"
+                ),
+            ),
+            _f(
+                "BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC",
+                "⛔ 돌파 OHLC 폴백 (절대 금지)",
+                "bool",
+                default=False,
+                danger=True,
+                hint="⛔ 절대 ON 하지 말 것! ⛔ | 봉 high/low로 체결가 계산 → 실매와 다른 가짜 결과",
+            ),
+            _f(
+                "BREAKOUT_BACKTEST_POLL_MS",
+                "📊 돌파 틱 청산 검사 간격(ms) (백테 전용)",
+                "int",
+                default=100,
+                hint="백테에서 틱을 몇 ms마다 확인할지. 기본 100ms.",
+            ),
+            _f(
+                "MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC",
+                "⛔ 모멘텀 OHLC 폴백 (절대 금지)",
+                "bool",
+                default=False,
+                danger=True,
+                hint="⛔ 절대 ON 하지 말 것! ⛔",
+            ),
+            _f(
+                "MOMENTUM_BACKTEST_POLL_MS",
+                "📊 모멘텀 틱 청산 검사 간격(ms) (백테 전용)",
+                "int",
+                default=100,
+            ),
+            _f(
+                "SCALP_BACKTEST_USE_TICK_EXIT",
+                "📊 스캘핑 백테 틱 청산 (백테 전용)",
+                "bool",
+                default=True,
+                hint="ON = 실제 틱 순서로 청산 (실매매 정합)",
+            ),
+            _f(
+                "SCALP_BACKTEST_USE_TICK_ENTRY",
+                "📊 스캘핑 백테 틱 진입 (백테 전용)",
+                "bool",
+                default=True,
+                hint=(
+                    "ON = 예약 체결 시 해당 분봉의 첫 틱 가격으로 진입 | "
+                    "OFF = 분봉 시가로 진입"
+                ),
+            ),
+            _f(
+                "SCALP_BACKTEST_TICK_FALLBACK_OHLC",
+                "⛔ 스캘핑 OHLC 폴백 (절대 금지)",
+                "bool",
+                default=False,
+                danger=True,
+                hint="⛔ 절대 ON 하지 말 것! ⛔",
+            ),
+            _f(
+                "SCALP_BACKTEST_POLL_MS",
+                "📊 스캘핑 틱 청산 검사 간격(ms) (백테 전용)",
+                "int",
+                default=100,
+            ),
+        ],
+    })
+
             _f("STRICT_FILL_VERIFY", "모의 엄격 체결 검증", "bool", default=False,
                hint="모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격"),
             _f("BUY_DEDUP_PENDING", "매수 미체결 중복주문 방지", "bool", default=True,
[diff_block_end]

Please note that the above snippet only shows the MODIFIED lines from the last change. It shows up to 3 lines of unchanged lines before and after the modified lines. The actual file contents may have many more lines not shown.


파일 보기 (중복 코드 확인)


Created At: 2026-08-07T11:02:40Z
Completed At: 2026-08-07T11:02:40Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1494
Total Bytes: 76784
Showing lines 985 to 1040
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
985:             ),
986:         ],
987:     })
988:
989:             _f("STRICT_FILL_VERIFY", "모의 엄격 체결 검증", "bool", default=False,
990:                hint="모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격"),
991:             _f("BUY_DEDUP_PENDING", "매수 미체결 중복주문 방지", "bool", default=True,
992:                hint="동일 전략·종목 PENDING_FILL 있으면 재주문 스킵"),
993:             _f("BACKTEST_SLIP_PCT", "백테 체결 슬리피지(편도 %)", "float", default=0.0,
994:                hint="STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%"),
995:             _f("BACKTEST_VOL_FILL_CAP_PCT", "백테 체결량 상한(진입봉 거래량×%)", "float", default=0.0,
996:                hint="STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사"),
997:             _f("TAIL_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 꼬리 OHLC 폴백 (정합위험·금지)", "bool", default=False,
998:                danger=True,
999:                hint="절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF"),
1000:             _f("TAIL_BACKTEST_USE_TICK_EXIT", "꼬리 틱 청산", "bool", default=True,
1001:                hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
1002:             _f("TAIL_BACKTEST_POLL_MS", "꼬리 틱청산 폴링(ms)", "int", default=100,
1003:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
1004:             _f("MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 모멘텀 OHLC 폴백 (정합위험·금지)", "bool", default=False,
1005:                danger=True,
1006:                hint="절대금지 — 틱 청산 ON 시 엔진 무시 · Optuna 강제 OFF"),
1007:             _f("MOMENTUM_BACKTEST_POLL_MS", "모멘텀 틱청산 폴링(ms)", "int", default=100,
1008:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 틱 사이 청산 검사 간격 · 하한 50ms"),
1009:             _f("BREAKOUT_BACKTEST_USE_TICK_EXIT", "돌파 틱 청산", "bool", default=True,
1010:                hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
1011:             _f("BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
1012:                danger=True,
1013:                hint="절대금지 — 틱 진입 ON 시 봉 high 폴백 안 함"),
1014:             _f("BREAKOUT_BACKTEST_POLL_MS", "돌파 틱청산 폴링(ms)", "int", default=100,
1015:                hint="실매 폴링 정합 · 하한 50ms"),
1016:             _f("SCALP_BACKTEST_USE_TICK_EXIT", "스캘핑 틱 청산", "bool", default=True,
1017:                hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
1018:             _f("SCALP_BACKTEST_USE_TICK_ENTRY", "스캘핑 틱 진입", "bool", default=True,
1019:                hint="ON=예약 체결 시 해당 분 첫 틱가 · OFF=분봉 시가"),
1020:             _f("SCALP_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 스캘핑 OHLC 폴백 (정합위험·금지)", "bool", default=False,
1021:                danger=True,
1022:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
1023:             _f("SCALP_BACKTEST_POLL_MS", "스캘핑 틱청산 폴링(ms)", "int", default=100,
1024:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
1025:             _f("RANGE_BREAK_BACKTEST_USE_TICK_EXIT", "박스돌파 틱 청산", "bool", default=True,
1026:                hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
1027:             _f("RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 박스돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
1028:                danger=True,
1029:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
1030:             _f("RANGE_BREAK_BACKTEST_POLL_MS", "박스돌파 틱청산 폴링(ms)", "int", default=100,
1031:                hint="실매 폴링 정합 · 하한 50ms"),
1032:             _f("DBBAND_BACKTEST_USE_TICK_EXIT", "더블BB 틱 청산", "bool", default=True,
1033:                hint="ON=ws_ticks 시간순 청산 · OFF=봉 OHLC 1회"),
1034:             _f("DBBAND_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 더블BB OHLC 폴백 (정합위험·금지)", "bool", default=False,
1035:                danger=True,
1036:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
1037:             _f("DBBAND_BACKTEST_POLL_MS", "더블BB 틱청산 폴링(ms)", "int", default=100,
1038:                hint="실매 폴링 정합 · 하한 50ms"),
1039:             _f("TAIL_PARAM_SEARCH_MIN_START", "꼬리 파라서치 최소 시작일", "str", default="2026-07-07",
1040:                hint="조건식 변경일 이후만 탐색 (YYYY-MM-DD) · CLI --start 와 max 적용"),
The above content does NOT show the entire file contents. If you need to view any lines of the file which were not shown to complete your task, call this tool again to view those lines.


파일 보기 (중복 코드 후반)


Created At: 2026-08-07T11:02:47Z
Completed At: 2026-08-07T11:02:47Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1494
Total Bytes: 76784
Showing lines 1040 to 1090
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
1040:                hint="조건식 변경일 이후만 탐색 (YYYY-MM-DD) · CLI --start 와 max 적용"),
1041:             _f("USE_MARKET_IOC", "매수 시장가 IOC", "bool", default=True,
1042:                hint="실전 매수 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정"),
1043:             _f("USE_MARKET_IOC_SELL", "매도 시장가 IOC", "bool", default=True,
1044:                hint="실전 매도 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정 · 거절 많으면 OFF"),
1045:             _f("ORDER_FILL_WAIT_SEC", "시장가 체결 대기(초)", "int", default=2),
1046:             _f("DUPLICATE_ORDER_FILL_RECOVERY_ENABLED", "주문DB중복 체결복구", "bool", default=True,
1047:                hint="insert 실패(주문DB중복) 시 inquire-daily-ccld 1회 → active_trades 복구 · 실패 시에만 REST"),
1048:             _f("DUPLICATE_ORDER_RECOVERY_WAIT_SEC", "중복복구 체결대기(초)", "int", default=2,
1049:                hint="주문DB중복 복구 전용 · 미설정 시 ORDER_FILL_WAIT_SEC 사용"),
1050:             _f("LIMIT_ORDER_FILL_WAIT_SEC", "지정가 체결 대기(초)", "int", default=1),
1051:             _f("PENDING_FILL_POLL_INTERVAL_SEC", "미체결 재조회 주기(초)", "int", default=10),
1052:             _f("PENDING_FILL_POLL_SEC", "재조회 1회 대기(초)", "int", default=1),
1053:             _f("PENDING_POLL_BATCH_FETCH", "미체결 체결 일괄조회", "bool", default=True,
1054:                hint="실매 heartbeat 전용 · ON=poll 1회당 inquire-daily-ccld 1건(미체결 N건) · OFF=건별 조회 · 백테 무관"),
1055:             _f("PENDING_BUY_MAX_AGE_SEC", "매수 미체결 만료(초)", "int", default=120),
1056:             _f("PENDING_SELL_MAX_AGE_SEC", "익절 매도 미체결 만료(초)", "int", default=60),
1057:             _f("PENDING_SELL_STOP_MAX_AGE_SEC", "손절 매도 미체결 만료(초)", "int", default=15),
1058:             _f("SELL_PENDING_REORDER_ON_EXPIRE", "손절 만료 후 즉시 재매도", "bool", default=True),
1059:             _f("AUTO_CANCEL_PARTIAL_BUY_REMAINDER", "부분체결 잔량 자동취소", "bool", default=True),
1060:             _f(
1061:                 "SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY",
1062:                 "익절지정가→시장가 전 취소",
1063:                 "bool",
1064:                 default=True,
1065:                 hint=(
1066:                     "ON=지정가 미확인/부분체결 시 잔여 취소 후 ODNO 재조회, "
1067:                     "취소실패·미확정이면 시장가 금지(PENDING) · "
1068:                     "OFF=레거시 즉시 시장가(이중매도 위험) · 전전략 OrderManager 공통"
1069:                 ),
1070:             ),
1071:             _f(
1072:                 "SELL_LIMIT_RECHECK_WAIT_SEC",
1073:                 "지정가 취소 후 재조회(초)",
1074:                 "int",
1075:                 default=1,
1076:                 hint="SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY=ON 일 때 ODNO 재조회 대기",
1077:             ),
1078:             _f(
1079:                 "SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM",
1080:                 "취소실패+잔고0→매도확정",
1081:                 "bool",
1082:                 default=True,
1083:                 hint=(
1084:                     "ON=익절지정가 취소 실패·ODNO 미확인이어도 브로커 0주면 "
1085:                     "지정가 체결로 finalize(유령금지) · OFF=PENDING만"
1086:                 ),
1087:             ),
1088:             _f(
1089:                 "GHOST_PURGE_BLOCK_WHILE_PENDING_SELL",
1090:                 "PENDING매도 시 유령정리 금지",
The above content does NOT show the entire file contents. If you need to view any lines of the file which were not shown to complete your task, call this tool again to view those lines.


파일 보기 (중복 코드 끝)


Created At: 2026-08-07T11:02:55Z
Completed At: 2026-08-07T11:02:55Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1494
Total Bytes: 76784
Showing lines 1090 to 1115
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
1090:                 "PENDING매도 시 유령정리 금지",
1091:                 "bool",
1092:                 default=True,
1093:                 hint=(
1094:                     "ON=미확정 매도 ODNO 있으면 ghost_purge 대신 체결재조회/잔고확정 청산"
1095:                 ),
1096:             ),
1097:             _f(
1098:                 "DAILY_CCLD_TR_ID",
1099:                 "일별체결조회 TR_ID",
1100:                 "str",
1101:                 default="",
1102:                 hint="비우면 모의 VTTC0081R / 실전 TTTC0081R (레거시 *8001R 사용 금지)",
1103:             ),
1104:         ],
1105:     })
1106:
1107:     groups.append({
1108:         "id": "rest_throttle",
1109:         "title": "REST 유량 제한 (한투 API)",
1110:         "hint": (
1111:             "한투 유량(계좌·앱키 단위): 실전 18건/초 · 모의 1건/초 · "
1112:             "신규 앱키는 첫 3일 3건/초 후 자동 상향 · 토큰발급 1건/초 · "
1113:             "동시호출 100~150ms 텀 권장. "
1114:             "※ 모의: 거래는 모의앱키(1건/초), 시세·랭킹·조건검색은 실전앱키(18건/초)로 분리. "
1115:             "운영(실전) 전환 시 거래+시세가 한 앱키로 합쳐져 18건/초를 공유."
The above content does NOT show the entire file contents. If you need to view any lines of the file which were not shown to complete your task, call this tool again to view those lines.


중복된 구 버전 코드(989~1105줄)를 삭제합니다.

이전 체결 검증 섹션 중복 코드 제거 (새 버전으로 이미 대체됨)

Instruction: 989~1105줄의 중복 코드(구 체결검증 그룹 내용) 삭제

            _f(\"STRICT_FILL_VERIFY\", \"모의 엄격 체결 검증\", \"bool\", default=False,
               hint=\"모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격\"),
            _f(\"BUY_DEDUP_PENDING\", \"매수 미체결 중복주문 방지\", \"bool\", default=True,
               hint=\"동일 전략·종목 PENDING_FILL 있으면 재주문 스킵\"),
            _f(\"BACKTEST_SLIP_PCT\", \"백테 체결 슬리피지(편도 %)\", \"float\", default=0.0,
               hint=\"STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%\"),
            _f(\"BACKTEST_VOL_FILL_CAP_PCT\", \"백테 체결량 상한(진입봉 거래량×%)\", \"float\", default=0.0,
               hint=\"STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사\"),
            _f(\"TAIL_BACKTEST_TICK_FALLBACK_OHLC\", \"⚠ 꼬리 OHLC 폴백 (정합위험·금지)\", \"bool\", default=False,
               danger=True,
               hint=\"절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF\"),
            _f(\"TAIL_BACKTEST_USE_TICK_EXIT\", \"꼬리 틱 청산\", \"bool\", default=True,
               hint=\"ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar\"),
            _f(\"TAIL_BACKTEST_POLL_MS\", \"꼬리 틱청산 폴링(ms)\", \"int\", default=100,
               hint=\"실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms\"),
            _f(\"MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC\", \"⚠ 모멘텀 OHLC 폴백 (정합위험·금지)\", \"bool\", default=False,
               danger=True,
               hint=\"절대금지 — 틱 청산 ON 시 엔진 무시 · Optuna 강제 OFF\"),
            _f(\"MOMENTUM_BACKTEST_POLL_MS\", \"모멘텀 틱청산 폴링(ms)\", \"int\", default=100,
               hint=\"실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 틱 사이 청산 검사 간격 · 하한 50ms\"),
            _f(\"BREAKOUT_BACKTEST_USE_TICK_EXIT\", \"돌파 틱 청산\", \"bool\", default=True,
               hint=\"ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar\"),
            _f(\"BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC\", \"⚠ 돌파 OHLC 폴백 (정합위험·금지)\", \"bool\", default=False,
               danger=True,
               hint=\"절대금지 — 틱 진입 ON 시 봉 high 폴백 안 함\"),
            _f(\"BREAKOUT_BACKTEST_POLL_MS\", \"돌파 틱청산 폴링(ms)\", \"int\", default=100,
               hint=\"실매 폴링 정합 · 하한 50ms\"),
            _f(\"SCALP_BACKTEST_USE_TICK_EXIT\", \"스캘핑 틱 청산\", \"bool\", default=True,
               hint=\"ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar\"),
            _f(\"SCALP_BACKTEST_USE_TICK_ENTRY\", \"스캘핑 틱 진입\", \"bool\", default=True,
               hint=\"ON=예약 체결 시 해당 분 첫 틱가 · OFF=분봉 시가\"),
            _f(\"SCALP_BACKTEST_TICK_FALLBACK_OHLC\", \"⚠ 스캘핑 OHLC 폴백 (정합위험·금지)\", \"bool\", default=False,
               danger=True,
               hint=\"절대금지 — 틱 청산 ON 시 엔진 무시\"),
            _f(\"SCALP_BACKTEST_POLL_MS\", \"스캘핑 틱청산 폴링(ms)\", \"int\", default=100,
               hint=\"실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms\"),
            _f(\"RANGE_BREAK_BACKTEST_USE_TICK_EXIT\", \"박스돌파 틱 청산\", \"bool\", default=True,
               hint=\"ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar\"),
            _f(\"RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC\", \"⚠ 박스돌파 OHLC 폴백 (정합위험·금지)\", \"bool\", default=False,
               danger=True,
               hint=\"절대금지 — 틱 청산 ON 시 엔진 무시\"),
            _f(\"RANGE_BREAK_BACKTEST_POLL_MS\", \"박스돌파 틱청산 폴링(ms)\", \"int\", default=100,
               hint=\"실매 폴링 정합 · 하한 50ms\"),
            _f(\"DBBAND_BACKTEST_USE_TICK_EXIT\", \"더블BB 틱 청산\", \"bool\", default=True,
               hint=\"ON=ws_ticks 시간순 청산 · OFF=봉 OHLC 1회\"),
            _f(\"DBBAND_BACKTEST_TICK_FALLBACK_OHLC\", \"⚠ 더블BB OHLC 폴백 (정합위험·금지)\", \"bool\", default=False,
               danger=True,
               hint=\"절대금지 — 틱 청산 ON 시 엔진 무시\"),
            _f(\"DBBAND_BACKTEST_POLL_MS\", \"더블BB 틱청산 폴링(ms)\", \"int\", default=100,
               hint=\"실매 폴링 정합 · 하한 50ms\"),
            _f(\"TAIL_PARAM_SEARCH_MIN_START\", \"꼬리 파라서치 최소 시작일\", \"str\", default=\"2026-07-07\",
               hint=\"조건식 변경일 이후만 탐색 (YYYY-MM-DD) · CLI --start 와 max 적용\"),
            _f(\"USE_MARKET_IOC\", \"매수 시장가 IOC\", \"bool\", default=True,
               hint=\"실전 매수 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정\"),
            _f(\"USE_MARKET_IOC_SELL\", \"매도 시장가 IOC\", \"bool\", default=True,
               hint=\"실전 매도 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정 · 거절 많으면 OFF\"),
            _f(\"ORDER_FILL_WAIT_SEC\", \"시장가 체결 대기(초)\", \"int\", default=2),
            _f(\"DUPLICATE_ORDER_FILL_RECOVERY_ENABLED\", \"주문DB중복 체결복구\", \"bool\", default=True,
               hint=\"insert 실패(주문DB중복) 시 inquire-daily-ccld 1회 → active_trades 복구 · 실패 시에만 REST\"),
            _f(\"DUPLICATE_ORDER_RECOVERY_WAIT_SEC\", \"중복복구 체결대기(초)\", \"int\", default=2,
               hint=\"주문DB중복 복구 전용 · 미설정 시 ORDER_FILL_WAIT_SEC 사용\"),
            _f(\"LIMIT_ORDER_FILL_WAIT_SEC\", \"지정가 체결 대기(초)\", \"int\", default=1),
            _f(\"PENDING_FILL_POLL_INTERVAL_SEC\", \"미체결 재조회 주기(초)\", \"int\", default=10),
            _f(\"PENDING_FILL_POLL_SEC\", \"재조회 1회 대기(초)\", \"int\", default=1),
            _f(\"PENDING_POLL_BATCH_FETCH\", \"미체결 체결 일괄조회\", \"bool\", default=True,
               hint=\"실매 heartbeat 전용 · ON=poll 1회당 inquire-daily-ccld 1건(미체결 N건) · OFF=건별 조회 · 백테 무관\"),
            _f(\"PENDING_BUY_MAX_AGE_SEC\", \"매수 미체결 만료(초)\", \"int\", default=120),
            _f(\"PENDING_SELL_MAX_AGE_SEC\", \"익절 매도 미체결 만료(초)\", \"int\", default=60),
            _f(\"PENDING_SELL_STOP_MAX_AGE_SEC\", \"손절 매도 미체결 만료(초)\", \"int\", default=15),
            _f(\"SELL_PENDING_REORDER_ON_EXPIRE\", \"손절 만료 후 즉시 재매도\", \"bool\", default=True),
            _f(\"AUTO_CANCEL_PARTIAL_BUY_REMAINDER\", \"부분체결 잔량 자동취소\", \"bool\", default=True),
            _f(
                \"SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY\",
                \"익절지정가→시장가 전 취소\",
                \"bool\",
                default=True,
                hint=(
                    \"ON=지정가 미확인/부분체결 시 잔여 취소 후 ODNO 재조회, \"
                    \"취소실패·미확정이면 시장가 금지(PENDING) · \"
                    \"OFF=레거시 즉시 시장가(이중매도 위험) · 전전략 OrderManager 공통\"
                ),
            ),
            _f(
                \"SELL_LIMIT_RECHECK_WAIT_SEC\",
                \"지정가 취소 후 재조회(초)\",
                \"int\",
                default=1,
                hint=\"SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY=ON 일 때 ODNO 재조회 대기\",
            ),
            _f(
                \"SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM\",
                \"취소실패+잔고0→매도확정\",
                \"bool\",
                default=True,
                hint=(
                    \"ON=익절지정가 취소 실패·ODNO 미확인이어도 브로커 0주면 \"
                    \"지정가 체결로 finalize(유령금지) · OFF=PENDING만\"
                ),
            ),
            _f(
                \"GHOST_PURGE_BLOCK_WHILE_PENDING_SELL\",
                \"PENDING매도 시 유령정리 금지\",
                \"bool\",
                default=True,
                hint=(
                    \"ON=미확정 매도 ODNO 있으면 ghost_purge 대신 체결재조회/잔고확정 청산\"
                ),
            ),
            _f(
                \"DAILY_CCLD_TR_ID\",
                \"일별체결조회 TR_ID\",
                \"str\",
                default=\"\",
                hint=\"비우면 모의 VTTC0081R / 실전 TTTC0081R (레거시 *8001R 사용 금지)\",
            ),
        ],
    })

파일 편집 (중복 코드 제거)


Created At: 2026-08-07T11:03:48Z
Completed At: 2026-08-07T11:03:59Z
The following changes were made by the replace_file_content tool to: /home/hoon/kis_bot/kis_trader/web/live_config_schema.py. If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.
[diff_block_start]

[diff_block_end]

Please note that the above snippet only shows the MODIFIED lines from the last change. It shows up to 3 lines of unchanged lines before and after the modified lines. The actual file contents may have many more lines not shown.

You had inaccuracies in your replacement chunks, so you should review the file contents before making further edits. It is important that you get the target content EXACTLY right, otherwise you will make more mistakes.

We did our best to apply changes despite some inaccuracies. Double check if the edit applied is what you intended.


# Conversation History
Here are the conversation IDs, titles, and summaries of your most recent 1 conversations, in reverse chronological order:

<conversation_summaries>
## Conversation 3bd05ba2-e978-4688-ab75-dd7a4168b1ac: Verifying Database Data Ingestion
- Created: 2026-08-07T10:06:47Z
- Last modified: 2026-08-07T10:19:48Z

### USER Objective:
Verifying Database Data Ingestion

The user's main objective is to accurately count and summarize the number of data entries for specific trading-related tables (Kiwoom vs. KIS) within the database for the current date (2026-08-07). The goal is to establish a robust, error-free script that handles table and column name lookups dynamically, uses proper SQL syntax to avoid execution errors, and provides a clear, formatted breakdown of incoming data volumes.

</conversation_summaries>


PYTHONPATH=/home/hoon/kis_bot .venv/bin/python3 -c "from kis_trader.web.live_config_schema import build_live_config_groups; g = build_live_config_groups(); print('OK, groups:', [x['id'] for x in g])"

명령어 실행 (스키마 문법 검증)


Created At: 2026-08-07T11:04:04Z
Completed At: 2026-08-07T11:04:06Z

				The command failed with exit code: 1
				Output:
				Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/hoon/kis_bot/kis_trader/web/live_config_schema.py", line 989
    _f("STRICT_FILL_VERIFY", "모의 엄격 체결 검증", "bool", default=False,
IndentationError: unexpected indent
Terminal ID: 1893648


파일 보기 (문법 오류 위치)


Created At: 2026-08-07T11:04:10Z
Completed At: 2026-08-07T11:04:10Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1494
Total Bytes: 76784
Showing lines 984 to 1005
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
984:                 default=100,
985:             ),
986:         ],
987:     })
988:
989:             _f("STRICT_FILL_VERIFY", "모의 엄격 체결 검증", "bool", default=False,
990:                hint="모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격"),
991:             _f("BUY_DEDUP_PENDING", "매수 미체결 중복주문 방지", "bool", default=True,
992:                hint="동일 전략·종목 PENDING_FILL 있으면 재주문 스킵"),
993:             _f("BACKTEST_SLIP_PCT", "백테 체결 슬리피지(편도 %)", "float", default=0.0,
994:                hint="STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%"),
995:             _f("BACKTEST_VOL_FILL_CAP_PCT", "백테 체결량 상한(진입봉 거래량×%)", "float", default=0.0,
996:                hint="STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사"),
997:             _f("TAIL_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 꼬리 OHLC 폴백 (정합위험·금지)", "bool", default=False,
998:                danger=True,
999:                hint="절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF"),
1000:             _f("TAIL_BACKTEST_USE_TICK_EXIT", "꼬리 틱 청산", "bool", default=True,
1001:                hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
1002:             _f("TAIL_BACKTEST_POLL_MS", "꼬리 틱청산 폴링(ms)", "int", default=100,
1003:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
1004:             _f("MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 모멘텀 OHLC 폴백 (정합위험·금지)", "bool", default=False,
1005:                danger=True,
The above content does NOT show the entire file contents. If you need to view any lines of the file which were not shown to complete your task, call this tool again to view those lines.


구 중복 코드 끝 확인

파일 보기 (중복 코드 끝부분)


Created At: 2026-08-07T11:04:15Z
Completed At: 2026-08-07T11:04:15Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1494
Total Bytes: 76784
Showing lines 1095 to 1110
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
1095:                 ),
1096:             ),
1097:             _f(
1098:                 "DAILY_CCLD_TR_ID",
1099:                 "일별체결조회 TR_ID",
1100:                 "str",
1101:                 default="",
1102:                 hint="비우면 모의 VTTC0081R / 실전 TTTC0081R (레거시 *8001R 사용 금지)",
1103:             ),
1104:         ],
1105:     })
1106:
1107:     groups.append({
1108:         "id": "rest_throttle",
1109:         "title": "REST 유량 제한 (한투 API)",
1110:         "hint": (
The above content does NOT show the entire file contents. If you need to view any lines of the file which were not shown to complete your task, call this tool again to view those lines.


잘못 남은 구 체결검증 중복 코드 제거

Instruction: 989~1105줄 중복 코드 삭제

            _f("STRICT_FILL_VERIFY", "모의 엄격 체결 검증", "bool", default=False,
               hint="모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격"),
            _f("BUY_DEDUP_PENDING", "매수 미체결 중복주문 방지", "bool", default=True,
               hint="동일 전략·종목 PENDING_FILL 있으면 재주문 스킵"),
            _f("BACKTEST_SLIP_PCT", "백테 체결 슬리피지(편도 %)", "float", default=0.0,
               hint="STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%"),
            _f("BACKTEST_VOL_FILL_CAP_PCT", "백테 체결량 상한(진입봉 거래량×%)", "float", default=0.0,
               hint="STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사"),
            _f("TAIL_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 꼬리 OHLC 폴백 (정합위험·금지)", "bool", default=False,
               danger=True,
               hint="절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF"),
            _f("TAIL_BACKTEST_USE_TICK_EXIT", "꼬리 틱 청산", "bool", default=True,
               hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
            _f("TAIL_BACKTEST_POLL_MS", "꼬리 틱청산 폴링(ms)", "int", default=100,
               hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
            _f("MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 모멘텀 OHLC 폴백 (정합위험·금지)", "bool", default=False,
               danger=True,
               hint="절대금지 — 틱 청산 ON 시 엔진 무시 · Optuna 강제 OFF"),
            _f("MOMENTUM_BACKTEST_POLL_MS", "모멘텀 틱청산 폴링(ms)", "int", default=100,
               hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 틱 사이 청산 검사 간격 · 하한 50ms"),
            _f("BREAKOUT_BACKTEST_USE_TICK_EXIT", "돌파 틱 청산", "bool", default=True,
               hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
            _f("BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
               danger=True,
               hint="절대금지 — 틱 진입 ON 시 봉 high 폴백 안 함"),
            _f("BREAKOUT_BACKTEST_POLL_MS", "돌파 틱청산 폴링(ms)", "int", default=100,
               hint="실매 폴링 정합 · 하한 50ms"),
            _f("SCALP_BACKTEST_USE_TICK_EXIT", "스캘핑 틱 청산", "bool", default=True,
               hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
            _f("SCALP_BACKTEST_USE_TICK_ENTRY", "스캘핑 틱 진입", "bool", default=True,
               hint="ON=예약 체결 시 해당 분 첫 틱가 · OFF=분봉 시가"),
            _f("SCALP_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 스캘핑 OHLC 폴백 (정합위험·금지)", "bool", default=False,
               danger=True,
               hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
            _f("SCALP_BACKTEST_POLL_MS", "스캘핑 틱청산 폴링(ms)", "int", default=100,
               hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
            _f("RANGE_BREAK_BACKTEST_USE_TICK_EXIT", "박스돌파 틱 청산", "bool", default=True,
               hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
            _f("RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 박스돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
               danger=True,
               hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
            _f("RANGE_BREAK_BACKTEST_POLL_MS", "박스돌파 틱청산 폴링(ms)", "int", default=100,
               hint="실매 폴링 정합 · 하한 50ms"),
            _f("DBBAND_BACKTEST_USE_TICK_EXIT", "더블BB 틱 청산", "bool", default=True,
               hint="ON=ws_ticks 시간순 청산 · OFF=봉 OHLC 1회"),
            _f("DBBAND_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 더블BB OHLC 폴백 (정합위험·금지)", "bool", default=False,
               danger=True,
               hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
            _f("DBBAND_BACKTEST_POLL_MS", "더블BB 틱청산 폴링(ms)", "int", default=100,
               hint="실매 폴링 정합 · 하한 50ms"),
            _f("TAIL_PARAM_SEARCH_MIN_START", "꼬리 파라서치 최소 시작일", "str", default="2026-07-07",
               hint="조건식 변경일 이후만 탐색 (YYYY-MM-DD) · CLI --start 와 max 적용"),
            _f("USE_MARKET_IOC", "매수 시장가 IOC", "bool", default=True,
               hint="실전 매수 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정"),
            _f("USE_MARKET_IOC_SELL", "매도 시장가 IOC", "bool", default=True,
               hint="실전 매도 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정 · 거절 많으면 OFF"),
            _f("ORDER_FILL_WAIT_SEC", "시장가 체결 대기(초)", "int", default=2),
            _f("DUPLICATE_ORDER_FILL_RECOVERY_ENABLED", "주문DB중복 체결복구", "bool", default=True,
               hint="insert 실패(주문DB중복) 시 inquire-daily-ccld 1회 → active_trades 복구 · 실패 시에만 REST"),
            _f("DUPLICATE_ORDER_RECOVERY_WAIT_SEC", "중복복구 체결대기(초)", "int", default=2,
               hint="주문DB중복 복구 전용 · 미설정 시 ORDER_FILL_WAIT_SEC 사용"),
            _f("LIMIT_ORDER_FILL_WAIT_SEC", "지정가 체결 대기(초)", "int", default=1),
            _f("PENDING_FILL_POLL_INTERVAL_SEC", "미체결 재조회 주기(초)", "int", default=10),
            _f("PENDING_FILL_POLL_SEC", "재조회 1회 대기(초)", "int", default=1),
            _f("PENDING_POLL_BATCH_FETCH", "미체결 체결 일괄조회", "bool", default=True,
               hint="실매 heartbeat 전용 · ON=poll 1회당 inquire-daily-ccld 1건(미체결 N건) · OFF=건별 조회 · 백테 무관"),
            _f("PENDING_BUY_MAX_AGE_SEC", "매수 미체결 만료(초)", "int", default=120),
            _f("PENDING_SELL_MAX_AGE_SEC", "익절 매도 미체결 만료(초)", "int", default=60),
            _f("PENDING_SELL_STOP_MAX_AGE_SEC", "손절 매도 미체결 만료(초)", "int", default=15),
            _f("SELL_PENDING_REORDER_ON_EXPIRE", "손절 만료 후 즉시 재매도", "bool", default=True),
            _f("AUTO_CANCEL_PARTIAL_BUY_REMAINDER", "부분체결 잔량 자동취소", "bool", default=True),
            _f(
                "SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY",
                "익절지정가→시장가 전 취소",
                "bool",
                default=True,
                hint=(
                    "ON=지정가 미확인/부분체결 시 잔여 취소 후 ODNO 재조회, "
                    "취소실패·미확정이면 시장가 금지(PENDING) · "
                    "OFF=레거시 즉시 시장가(이중매도 위험) · 전전략 OrderManager 공통"
                ),
            ),
            _f(
                "SELL_LIMIT_RECHECK_WAIT_SEC",
                "지정가 취소 후 재조회(초)",
                "int",
                default=1,
                hint="SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY=ON 일 때 ODNO 재조회 대기",
            ),
            _f(
                "SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM",
                "취소실패+잔고0→매도확정",
                "bool",
                default=True,
                hint=(
                    "ON=익절지정가 취소 실패·ODNO 미확인이어도 브로커 0주면 "
                    "지정가 체결로 finalize(유령금지) · OFF=PENDING만"
                ),
            ),
            _f(
                "GHOST_PURGE_BLOCK_WHILE_PENDING_SELL",
                "PENDING매도 시 유령정리 금지",
                "bool",
                default=True,
                hint=(
                    "ON=미확정 매도 ODNO 있으면 ghost_purge 대신 체결재조회/잔고확정 청산"
                ),
            ),
            _f(
                "DAILY_CCLD_TR_ID",
                "일별체결조회 TR_ID",
                "str",
                default="",
                hint="비우면 모의 VTTC0081R / 실전 TTTC0081R (레거시 *8001R 사용 금지)",
            ),
        ],
    })

파일 편집 (중복 코드 완전 제거)