Created At: 2026-08-07T10:39:36Z
Completed At: 2026-08-07T10:39:40Z

				The command completed successfully.
				Output:
				<truncated 24 bytes>
GLOBAL_MIN_GAP_SEC","label":"\uc804\uc5ed \ucd5c\uc18c\uac04\uaca9(\ucd08)","raw":null,"table":"env_config_ext","type":"int","value":20},{"default":900,"key":"OPS_ALERT_SESSION_START_HM","label":"\uc7a5\uc911\uac8c\uc774\ud2b8 \uc2dc\uc791 HHMM","raw":null,"table":"env_config_ext","type":"int","value":900},{"default":1535,"key":"OPS_ALERT_SESSION_END_HM","label":"\uc7a5\uc911\uac8c\uc774\ud2b8 \uc885\ub8cc HHMM","raw":null,"table":"env_config_ext","type":"int","value":1535},{"default":180,"hint":"\uc7a5\uc911 \uc720\ub2c8\ubc84\uc2a4 0 \uc774 \uc774 \uc2dc\uac04 \uc774\uc0c1\uc774\uba74 \uc54c\ub9bc","key":"OPS_ALERT_UNIVERSE_ZERO_SEC","label":"\uc720\ub2c8\ubc84\uc2a40 \uc9c0\uc18d(\ucd08)","raw":null,"table":"env_config_ext","type":"int","value":180},{"default":600,"hint":"\ud0a4\uc6c0 history \ub2f9\uc77c \ucd5c\uc2e0 \uc2a4\ub0c5\uc0f7\uc774 \uc774\ubcf4\ub2e4 \uc624\ub798\uba74 \uc54c\ub9bc","key":"OPS_ALERT_HISTORY_STALE_SEC","label":"\ud788\uc2a4\ud1a0\ub9ac \uacf5\ubc31(\ucd08)","raw":null,"table":"env_config_ext","type":"int","value":600},{"default":3,"key":"OPS_ALERT_ORDER_REJECT_STREAK","label":"\uc8fc\ubb38\uac70\ubd80 \uc5f0\uc18d N\ud68c","raw":null,"table":"env_config_ext","type":"int","value":3},{"default":5,"key":"OPS_ALERT_RATE_LIMIT_STREAK","label":"\uc720\ub7c9 \uc5f0\uc18d N\ud68c","raw":null,"table":"env_config_ext","type":"int","value":5},{"default":true,"key":"OPS_ALERT_VI_ENABLED","label":"VI \ubc1c\ub3d9 \uc54c\ub9bc","raw":null,"table":"env_config_ext","type":"bool","value":true},{"default":true,"key":"OPS_ALERT_MARKET_GUARD_ENABLED","label":"MarketGuard PANIC \uc54c\ub9bc","raw":null,"table":"env_config_ext","type":"bool","value":true}],"hint":"\uc2e4\ub9e4 \ud504\ub85c\uc138\uc2a4 \uc548\uc5d0\uc11c \ud1a0\ud070/WS/\uc720\ub2c8\ubc84\uc2a40/\uc8fc\ubb38\uac70\ubd80/\uc720\ub7c9/VI/MarketGuard PANIC \uc744 \uc2dc\uc2a4\ud15c MM(+TG)\ub85c \ubcf4\ub0c4. journal \uc624\ub958\uac10\uc2dc\uc640 \ubcc4\uac1c\u00b7\ubcf4\uc644.","id":"ops_alert","title":"\uc6b4\uc601\uce58\uba85 \uc54c\ub9bc (\ubd07 \ub0b4\ubd80)"},{"fields":[{"default":"","hint":"\uc27c\ud45c(,) \uad6c\ubd84 \uc885\ubaa9\ucf54\ub4dc \uc608: 005930,000660 \u00b7 HTS \uc9c1\uc811 \ub9e4\uc218\u00b7\uc7a5\uae30 \ubcf4\uc720\ubd84 \ubcf4\ud638 \u00b7 \uc77c\uad04\ub9e4\ub3c4\u00b7\uace0\uc544\ubcf5\uad6c \uc81c\uc678","key":"MANUAL_HOLD_CODES","label":"\uc218\ub3d9 \ubcf4\uc720 \ubcf4\ud638 \uc885\ubaa9","raw":"","table":"env_config","type":"text","value":""},{"default":0.3,"hint":"\ubbf8\ub4f1\ub85d \ubd07\uace0\uc544 \uc77c\uad04 \uc2dc\uc7a5\uac00\ub9e4\ub3c4 \uc2dc REST 429 \ubc29\uc9c0 \u00b7 \uc885\ubaa9\ub9c8\ub2e4 sleep","key":"BULK_SELL_INTERVAL_SEC","label":"\uc77c\uad04\ub9e4\ub3c4 \uc885\ubaa9 \uac04\uaca9(\ucd08)","raw":"","table":"env_config","type":"float","value":0.3},{"default":true,"hint":"\ub9e4\uc77c 15:36~16:00 1\ud68c \u00b7 \uc2e4\uacc4\uc88c \uc794\uace0\u2194active_trades \ub300\uc870 \u00b7 orders BUY \uc788\ub294 \ubbf8\uae30\ub85d\ubd84\ub9cc \ubcf5\uad6c \u00b7 \uc218\ub3d9\u00b7MANUAL_HOLD \uc81c\uc678","key":"ORPHAN_RECONCILE_ENABLED","label":"\uc7a5\ub9c8\uac10 \uace0\uc544\ubcf5\uad6c","raw":"","table":"env_config","type":"bool","value":true},{"default":true,"hint":"\ud65c\uc131 \uc804\ub7b5 \uc911 \uac00\uc7a5 \uc774\ub978 EOD \u2212 N\ubd84 1\ud68c \u00b7 EOD \uccad\uc0b0 \uc804 active_trades \ubc18\uc601","key":"ORPHAN_RECONCILE_PRE_EOD_ENABLED","label":"Pre-EOD \uace0\uc544\ubcf5\uad6c","raw":"","table":"env_config","type":"bool","value":true},{"default":7,"hint":"\uc608: BREAKOUT EOD 15:15 \u2192 15:08 \uc2e4\ud589 \u00b7 REST \uc794\uace0 1\ud68c/\uc77c","key":"ORPHAN_RECONCILE_PRE_EOD_LEAD_MIN","label":"Pre-EOD \uc120\ud589(\ubd84)","raw":"","table":"env_config","type":"int","value":7},{"default":true,"hint":"ON=\ub9e4\uc218 \uc774\ud6c4 \uc7a5\ub9c8\uac10\uccad\uc0b0 \ub4f1 \ud788\uc2a4\ud1a0\ub9ac \uc788\uc73c\uba74 \uace0\uc544\ubcf5\uad6c\ub85c active \ub2e4\uc2dc \uc548 \ub123\uc74c","key":"ORPHAN_SKIP_AFTER_SELL_HISTORY","label":"\uccad\uc0b0\ud788\uc2a4\ud1a0\ub9ac \uc788\uc73c\uba74 \uc7ac\ub4f1\ub85d\uae08\uc9c0","raw":null,"table":"env_config_ext","type":"bool","value":true},{"default":"\uc7a5\ub9c8\uac10\uccad\uc0b0,eod","hint":"\uc27c\ud45c \uad6c\ubd84 \ud0a4\uc6cc\ub4dc. \ube44\uc6b0\uba74 \ub9e4\uc218 \uc774\ud6c4 \ubaa8\ub4e0 \uccad\uc0b0 \ud788\uc2a4\ud1a0\ub9ac \uae08\uc9c0","key":"ORPHAN_SKIP_SELL_REASONS","label":"\uc7ac\ub4f1\ub85d\uae08\uc9c0 \uccad\uc0b0\uc0ac\uc720","raw":null,"table":"env_config_ext","type":"str","value":"\uc7a5\ub9c8\uac10\uccad\uc0b0,eod"},{"default":true,"hint":"ON=active\uc5d0 \ub0a8\uc558\ub294\ub370 \ub9e4\uc218 \uc774\ud6c4 \uccad\uc0b0 \ud788\uc2a4\ud1a0\ub9ac\uba74 DB \ud589 \uc0ad\uc81c","key":"ORPHAN_PURGE_ACTIVE_AFTER_SELL_HISTORY","label":"\uccad\uc0b0\ud6c4 \uc720\ub839 active \uc815\ub9ac","raw":null,"table":"env_config_ext","type":"bool","value":true},{"default":true,"hint":"ON=\ube0c\ub85c\ucee4 0\uc8fc\uc778\ub370 active_trades \ub0a8\uc740 \uc885\ubaa9 \uc0ad\uc81c(\uc218\ub3d9\ubcf4\ud638 \uc81c\uc678) \u00b7 Pre/Post EOD \ub3d9\uc77c \uc794\uace0\uc870\ud68c\uc5d0\uc11c \ucc98\ub9ac","key":"GHOST_PURGE_ON_RECONCILE","label":"\uace0\uc544\ubcf5\uad6c \uc2dc \uc720\ub839\uc794\uace0 \uc0ad\uc81c","raw":"1","table":"env_config","type":"bool","value":true},{"default":true,"hint":"ON=\uc720\ub839 \uc0ad\uc81c \uc2dc trade_history \uc5d0 sell_reason=ghost_purge (realized_pnl=0) \u00b7 OFF=\uc0ad\uc81c\ub9cc \u00b7 \uc804\uc804\ub7b5 \uacf5\ud1b5","key":"GHOST_PURGE_RECORD_HISTORY","label":"\uc720\ub839\uc815\ub9ac \uc2dc \uac70\ub798\ub0b4\uc5ed \uae30\ub85d","raw":"true","table":"env_config_ext","type":"bool","value":true},{"default":false,"hint":"\uae30\ubcf8 OFF \u00b7 ON=N\ubd84\ub9c8\ub2e4 \uc794\uace0 REST \u00b7 \uc54c\ub9bc/\uc790\ub3d9\ubcf5\uad6c\ub294 \ubcc4\ub3c4 \ud0a4","key":"INTRADAY_HOLDINGS_DRIFT_ENABLED","label":"\uc7a5\uc911 qty \ub4dc\ub9ac\ud504\ud2b8 \uac10\uc2dc","raw":"","table":"env_config","type":"bool","value":false},{"default":300,"hint":"INTRADAY_HOLDINGS_DRIFT_ENABLED=ON \uc77c \ub54c\ub9cc","key":"INTRADAY_HOLDINGS_DRIFT_INTERVAL_SEC","label":"\ub4dc\ub9ac\ud504\ud2b8 \uc870\ud68c\uc8fc\uae30(\ucd08)","raw":"","table":"env_config","type":"int","value":300},{"default":false,"hint":"OFF=\uc54c\ub9bc\ub9cc \u00b7 ON=active_trades qty \ubcf4\uc815(\uae30\ubcf8 OFF)","key":"INTRADAY_HOLDINGS_DRIFT_AUTO_RECOVER","label":"\ub4dc\ub9ac\ud504\ud2b8 \uc790\ub3d9\ubcf5\uad6c","raw":"","table":"env_config","type":"bool","value":false}],"hint":"\ubcf4\uc720\u00b7\ub9e4\ub3c4 \ud0ed \uc77c\uad04\ub9e4\ub3c4\u00b7\uc218\ub3d9 \ubcf4\ud638\u00b7\uc7a5\ub9c8\uac10 \ud6c4 DB \ub3d9\uae30\ud654. MANUAL_HOLD_CODES \uc5d0 \ub123\uc740 \uc885\ubaa9\uc740 \uc77c\uad04\ub9e4\ub3c4\u00b7\uace0\uc544\ubcf5\uad6c \ubaa8\ub450 \uc81c\uc678.","id":"portfolio_hold","title":"\ubcf4\uc720\u00b7\ub9e4\ub3c4 / \uace0\uc544\ubcf5\uad6c"}],"ok":true,"status":{"global":{"budget_krw":1200000,"buy_halted":false,"profit_target_hit":false,"realized_pnl_krw":-14770,"return_pct":-0.308,"target_enabled":false,"target_krw":300000.0,"target_pct":100.0},"notes":{"halt_scope":"\uc2e0\uaddc \ub9e4\uc218\ub9cc \uc911\ub2e8 \u2014 \ubcf4\uc720 \uc885\ubaa9 \uc190\uc808\u00b7\uc775\uc808 \uc720\uc9c0","pnl_source":"trade_history \ub2f9\uc77c \uc2e4\ud604 (\uc218\uc218\ub8cc\u00b7\uc138\uae08 \ubc18\uc601, \ubd07 \uc2e4\ud604\uacfc \ub3d9\uc77c)"},"strategies":[{"budget_limit_krw":1200000,"buy_halted":false,"enabled":true,"label":"\uaf2c\ub9ac\uc7a1\uae30","profit_target_hit":false,"realized_pnl_krw":0,"return_pct":0.0,"strategy_id":"SHORT"},{"budget_limit_krw":1200000,"buy_halted":false,"enabled":true,"label":"\ubaa8\uba58\ud140","profit_target_hit":false,"realized_pnl_krw":0,"return_pct":0.0,"strategy_id":"MOMENTUM"},{"budget_limit_krw":1200000,"buy_halted":false,"enabled":true,"label":"\ub3cc\ud30c","profit_target_hit":false,"realized_pnl_krw":0,"return_pct":0.0,"strategy_id":"BREAKOUT"},{"budget_limit_krw":0,"buy_halted":false,"enabled":false,"label":"60\ubd84 \ud558\ub77d\ub9e4\uc218","profit_target_hit":false,"realized_pnl_krw":0,"return_pct":0.0,"strategy_id":"UPDOW"}]}}
Terminal ID: 1865461


The following is an <EPHEMERAL_MESSAGE> not actually sent by the user. It is provided by the system as a set of reminders and general important information to pay attention to. Do NOT respond to this message, just act accordingly.

<EPHEMERAL_MESSAGE>
<planning_mode>
You're in planning mode. Exercise judgement on whether the user's last request warrants a plan and take action accordingly.
If the user's request warrants a plan then follow this workflow:
1. Research first before taking actions. Do not use your code editing tools or run modifying commands during this time.
2. Create an implementation plan artifact with `request_feedback = true` to request approval. Include any open questions for the user directly in the implementation plan. Don't use the ask_question tool to ask these questions. Stop calling tools and allow the user to review the plan and provide feedback or approval.
3. After receiving approval, begin execution. Create and update the task artifact as you work.
4. Verify any work that you have done.
5. Create a walkthrough artifact to present your work to the user. When writing artifacts, make sure to follow the artifact formatting guidelines and use github alerts to highlight critical sections.
If the user's request does NOT warrant a plan then continue your work WITHOUT making a plan or requesting user feedback.
</planning_mode>
<bash_command_reminder>
CRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing. CRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought
CRITICAL INSTRUCTION 1: ...
CRITICAL INSTRUCTION 2: ...'.
</bash_command_reminder>
</EPHEMERAL_MESSAGE>


**Prioritizing Specific Tools**

I'm making sure to prioritize the most appropriate tools. I'm actively avoiding `cat`, `grep`, `ls`, and `sed` within Bash scripts unless absolutely essential. Specifically, I'm refraining from using `cat` for file creation or appending, and I'm always reaching for `grep_search` instead of standard `grep`. Avoid `ls` and `cat` for listing.

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

api 응답 필드 파싱 확인


Created At: 2026-08-07T10:39:46Z
Tool is running as a background task with task id: e07d5342-58aa-4443-a5b3-73bde0f593dd/task-2117
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", []):
    if g.get("id") == "ws_trigger_global":
        for f in g.get("fields", []):
            print(f["key"], f["value"])
'
Task logs are available at: file:///home/hoon/.gemini/antigravity-ide/brain/e07d5342-58aa-4443-a5b3-73bde0f593dd/.system_generated/tasks/task-2117.log


api 응답 로그 확인

명령어 실행 (로그 조회)


Created At: 2026-08-07T10:39:56Z
Completed At: 2026-08-07T10:39:57Z

				The command completed successfully.
				Output:
				WS_PROVIDER kiwoom_main
WS_SUBSCRIBE_KIS_MINIMAL False
KIS_WS_ORDERBOOK_ENABLED False
KIWOOM_WS_ORDERBOOK_ENABLED True
KIWOOM_WS_PROGRAM_ENABLED True
WS_TRIGGER_EVAL_SAVE_ENABLED True
WS_ORDERBOOK_COLLECT_ENABLED True
WS_ORDERBOOK_SAVE_ENABLED True
WS_ORDERBOOK_SAVE_MODE tick
WS_ORDERBOOK_TICK_MAX_AGE_SEC 3.0
WS_TRIGGER_SNAPSHOT_DB_INTERVAL_SEC 3.0
LIVE_UNIVERSE_SLOT_ALIGN True
OPS_ALERT_HISTORY_OPEN_GRACE_SEC 180
OPS_ALERT_WS_DOWN_HOLD_SEC 60
WS_PROGRAM_COLLECT_ENABLED True
WS_PROGRAM_SAVE_ENABLED False
PROGRAM_FILTER_ENABLED False
WHIPSAW_FILTER_ENABLED False
WHIPSAW_SUBBAR_SEC 30
WHIPSAW_LOOKBACK_SEC 90
WHIPSAW_DIP_PCT 0.003
WHIPSAW_RECOVERY_TOL_PCT 0.001
Terminal ID: 1865461


The following is a <SYSTEM_MESSAGE> not actually sent by the user. It is provided by the system as important information to pay attention to.

<SYSTEM_MESSAGE>
[Message] timestamp=2026-08-07T10:39:53Z sender=e07d5342-58aa-4443-a5b3-73bde0f593dd/task-2117 priority=MESSAGE_PRIORITY_HIGH content=Task id "e07d5342-58aa-4443-a5b3-73bde0f593dd/task-2117" finished with result:

				The command completed successfully.
				Output:
				WS_PROVIDER kiwoom_main
WS_SUBSCRIBE_KIS_MINIMAL False
KIS_WS_ORDERBOOK_ENABLED False
KIWOOM_WS_ORDERBOOK_ENABLED True
KIWOOM_WS_PROGRAM_ENABLED True
WS_TRIGGER_EVAL_SAVE_ENABLED True
WS_ORDERBOOK_COLLECT_ENABLED True
WS_ORDERBOOK_SAVE_ENABLED True
WS_ORDERBOOK_SAVE_MODE tick
WS_ORDERBOOK_TICK_MAX_AGE_SEC 3.0
WS_TRIGGER_SNAPSHOT_DB_INTERVAL_SEC 3.0
LIVE_UNIVERSE_SLOT_ALIGN True
OPS_ALERT_HISTORY_OPEN_GRACE_SEC 180
OPS_ALERT_WS_DOWN_HOLD_SEC 60
WS_PROGRAM_COLLECT_ENABLED True
WS_PROGRAM_SAVE_ENABLED False
PROGRAM_FILTER_ENABLED False
WHIPSAW_FILTER_ENABLED False
WHIPSAW_SUBBAR_SEC 30
WHIPSAW_LOOKBACK_SEC 90
WHIPSAW_DIP_PCT 0.003
WHIPSAW_RECOVERY_TOL_PCT 0.001
Terminal ID: 1865461

Log: file:///home/hoon/.gemini/antigravity-ide/brain/e07d5342-58aa-4443-a5b3-73bde0f593dd/.system_generated/tasks/task-2117.log
</SYSTEM_MESSAGE>


회원님, 오해가 있으신 것 같습니다! 제가 스위치를 완벽하게 다 만들어 두었습니다.

**"웹백테 파일(`backtest.html` 또는 `backtest_web.py`)이 하나도 안 고쳐졌다"**고 느끼신 이유는, 해당 '운영설정' 탭의 UI가 HTML에 하드코딩되어 있는 것이 아니라 **백엔드 스키마 파일(`kis_trader/web/live_config_schema.py`)에서 동적으로 불러와 그려지도록 설계**되어 있기 때문입니다.

즉, 저는 `backtest.html` 파일 자체를 무식하게 뜯어고친 것이 아니라, 정석대로 설계된 **`live_config_schema.py` 파일의 `ws_trigger_global` 그룹 최상단에 필드를 추가**하고 웹 서버를 재시작했습니다.

지금 바로 웹 브라우저(`http://192.168.0.149:5050`)를 열고 **[운영설정] 탭**으로 가셔서 **[🔄 새로고침]** 버튼(또는 F5 키)을 한 번만 눌러보시겠습니까?

가장 상단(TRIGGER 필터 섹션)에 아래 3개의 스위치가 짠 하고 나타나 있는 것을 확인하실 수 있습니다!
1. **메인 시세/매매 제공자 (WS_PROVIDER)**
2. **KIS 최소구독 (WS_SUBSCRIBE_KIS_MINIMAL)**
3. **KIS 호가 WS 구독 (KIS_WS_ORDERBOOK_ENABLED)**

또한, 방금 전 제가 `main.py` 핵심 코드를 한 번 더 수정하여, 회원님 말씀대로 **"kis_main(구 kis_only) 모드를 선택하더라도, 키움 메인일 때와 똑같이 백그라운드에서 키움 시세를 강제로 기동시켜 두 증권사 데이터를 모두 DB에 100% 동시 적재"** 하도록 완벽하게 조치해 두었습니다. 즉, 정말로 오직 "매매에 쓰이는 시세와 호가"만 달라지게 됩니다.

지금 바로 웹 페이지를 새로고침 해보시고 스위치가 잘 보이는지 확인해 주시겠습니까?

**Prioritizing Specific Tools**

I'm making sure to prioritize the most appropriate tools. I'm actively avoiding `cat`, `grep`, `ls`, and `sed` within Bash scripts unless absolutely essential. Specifically, I'm refraining from using `cat` for file creation or appending, and I'm always reaching for `grep_search` instead of standard `grep`. Avoid `ls` and `cat` for listing.

**Analyzing User's Perspective**

I'm now zeroing in on the user's perspective regarding the web backtest. I've realized they're likely observing the static `backtest.html` file, probably directly in their editor, and haven't refreshed the web page to see the API's returned data. The API is returning the relevant fields, and that solves the initial issue.


<USER_REQUEST>
📈 KIS Quant Dashboard
돌파 완료 200/200
100% · best#139 WR 66.7% · PnL 28,621원 · PF 49.10 · MDD — · 6건
돌파 백테 완료 2026-07-31~2026-07-31
100%
업데이트: 2026. 8. 7. 오후 7:42:50
매매
모의 · active
📊 실거래 분석
📈 오늘 운영
📋 조건 이벤트
⚙ 운영 설정
💼 보유·매도
📉 스캘핑 백테스트
🎣 꼬리잡기 백테스트
🚀 돌파매매 백테스트
🌊 모멘텀 백테스트
🇺🇸 해외 모멘텀
🔬 Optuna
📈 홀딩 전략
📦 박스엔진
📡 영구구독 관리
📢 DART 수주
기준일 (손익·익절 상태)
2026-08-07
30초 자동 갱신
기준일 2026-08-07 · 갱신 2026-08-07 19:44:25
DB insert_env_snapshot 즉시 저장 → 봇 재시작 없이 다음 루프부터 반영. 마스터 키는 env_config, 전략 키는 config_{전략} 테이블로 자동 분리됩니다.
총합 봇 실현
-14,770원
목표 300,000원 / 100.00% · 한도 1,200,000원 · 매수허용
꼬리잡기
SHORT
0원
0.00% · 허용
모멘텀
MOMENTUM
0원
0.00% · 허용
돌파
BREAKOUT
0원
0.00% · 허용
일일 익절 — 총합 (규칙·수동중단)
손익 감시 ON/OFF 는 전략별(*_DAILY_PROFIT_TARGET_ENABLED)만 사용. 여기 마스터는 총합 목표금액/%·수동 매수잠금·알림·트레일 규칙. ① 신규매수 수동 중단 = 목표·손익과 무관 매수만 잠금(긴급용, 기본 OFF). 매도·손절은 항상 유지
목표 금액(원) DAILY_PROFIT_TARGET_KRW
env_config
300000
목표 수익률(%) DAILY_PROFIT_TARGET_PCT
env_config
100
퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용
분모 운용한도(원) DAILY_PROFIT_TARGET_BUDGET_KRW
env_config
1200000
0 = ON 전략 TOTAL_BUDGET 합 자동
 신규매수 수동 중단 DAILY_PROFIT_HALT_NEW_BUYS
env_config
목표·손익과 무관한 수동 매수 잠금. ON=즉시 신규매수 전면 차단 / OFF=정상 (기본)
 달성 시 MM 알림 DAILY_PROFIT_NOTIFY_MM
env_config
익절 방식 DAILY_PROFIT_MODE
env_config
trailing
fixed=고정목표 / trailing=고점대비 되돌림 / both=둘 중 먼저
다단 트레일(수익원:컷%,…) DAILY_PROFIT_TRAIL_TIERS
env_config
5000:40,10000:30,20000:20
벌수록 타이트하게 사수 · 예: 30000:50,100000:35,300000:25 · 비우면 단일 되돌림 사용
단일 트레일 되돌림(%, 고점대비) DAILY_PROFIT_TRAIL_DROP_PCT
env_config
30
다단 비었을 때만 · 예: 35 = 고점 대비 -35% 꺾이면 중단 · 0=미사용
트레일 발동 최소수익(원) DAILY_PROFIT_TRAIL_ARM_KRW
env_config
18000
이 이상 벌어야 트레일 감시 시작 · 0=트레일 비활성(과민발동 방지)
트레일 발동 최소수익(%) DAILY_PROFIT_TRAIL_ARM_PCT
env_config
0
운용한도 대비 % · KRW와 둘 중 큰 값
리스크 — 계정 공통
env_config
리스크
일일 손실 한도(분율, -0.05=-5%) DAILY_STOP_LOSS_PCT
env_config
-0.05
연속 손실 제한(회) CONSECUTIVE_LOSS_LIMIT
env_config
7
 리스크 체크 사용 USE_RISK_CHECK
env_config
기타
 비본주(우선주·ETF·ETN) 매수 제외 EXCLUDE_NON_STOCK
env_config
후보 name==code 여도 코드 끝 5/7/9·K/L… 로 우선주 차단
우선주 코드 끝자리(숫자) NON_STOCK_PREF_CODE_SUFFIXES
env_config
KRX 구형 우선주. 콤마 구분
 코드 끝 알파벳=우선주 제외 NON_STOCK_EXCLUDE_ALPHA_SUFFIX
env_config
00088K·00781K 등
TRIGGER 필터 — WS 공통
호가(0D)·프로그램(0w) · env_config(컬럼 없으면 env_config_ext) · COLLECT=판정순간1장(filter_eval) / SAVE=후보~3초시계열(kiwoom_0d) — 둘은 다름
TRIGGER 마스터
 TRIGGER 판정 DB 저장(마스터) WS_TRIGGER_EVAL_SAVE_ENABLED
env_config
OFF면 아래 COLLECT(판정 스냅) 전부 안 씀 · SAVE(시계열)와 무관
호가/프로그램 interval 간격(초) WS_TRIGGER_SNAPSHOT_DB_INTERVAL_SEC
env_config
3
MODE=interval 일 때만 · 종목당 최소 저장 간격 · 봇 재시작 필요
호가
 KIS 호가 WS 구독(주의) KIS_WS_ORDERBOOK_ENABLED
env_config_ext
ON=KIS 호가 수신(kis_ws_orderbook 적재). 단, KIS는 구독한도가 40개이므로 시세+호가 동시 수신 시 최대 20종목만 가능
 호가 WS(0D) 구독 KIWOOM_WS_ORDERBOOK_ENABLED
env_config
키움 실시간 호가 수신(RAM) · 꺼면 필터·수집·시계열 모두 불가
 호가 판정스냅(FILTER_EVAL) — 매수체크 순간 1장 WS_ORDERBOOK_COLLECT_ENABLED
env_config
≠ 연속시계열. TRIGGER 판정 때만 ws_orderbook source=filter_eval · 필터 OFF여도 저장 가능
 호가 시계열(KIWOOM_0D) DB 저장 WS_ORDERBOOK_SAVE_ENABLED
env_config
ON이면 아래 MODE로 저장 · 파람서치 호가축용 · 봇 재시작 필요
호가 저장모드 tick|interval WS_ORDERBOOK_SAVE_MODE
env_config_ext
tick
tick=체결(0B)마다 RAM호가 1장(LS와 동일) · interval=0D+아래 간격 스로틀 · 봇 재시작
틱동기 호가 RAM 최대나이(초) WS_ORDERBOOK_TICK_MAX_AGE_SEC
env_config_ext
3
tick 모드: 이보다 오래된 호가면 해당 틱 호가행 생략(가짜 채움 금지)
프로그램
 프로그램 WS(0w) 구독 KIWOOM_WS_PROGRAM_ENABLED
env_config
키움 프로그램매매 수신(RAM)
 프로그램 판정스냅 — 매수체크 순간 1장 WS_PROGRAM_COLLECT_ENABLED
env_config
≠ 연속시계열. 판정 때만 ws_program · 필터 OFF여도 가능
 프로그램 시계열 — 구독후보 ~3초 덤프 WS_PROGRAM_SAVE_ENABLED
env_config
SAVE와 동일 Recorder · 봇 재시작 필요 · 필터와 무관
 프로그램 필터(TRIGGER) — 실매 탈락 PROGRAM_FILTER_ENABLED
env_config
휩쏘
 휩쏘 필터(글로벌) WHIPSAW_FILTER_ENABLED
env_config
휩쏘 미니봉(초) WHIPSAW_SUBBAR_SEC
env_config
30
틱을 N초 봉으로 묶음 · 실매 기본 30 · Optuna 꼬리 TPE 탐색
휩쏘 룩백(초) WHIPSAW_LOOKBACK_SEC
env_config
90
신호 직전 몇 초를 볼지 · 실매 기본 90
휩쏘 하락폭(분율, 0.003=0.3%) WHIPSAW_DIP_PCT
env_config
0.003
휩쏘 회복 허용(분율, 0.001=0.1%) WHIPSAW_RECOVERY_TOL_PCT
env_config
0.001
기타
메인 시세/매매 제공자(재시작 필요) WS_PROVIDER
env_config
kiwoom_main
kiwoom_main=키움 메인(적재 둘다) / kis_main(또는 kis_only)=KIS 메인(적재 둘다) / kis_with_validation=KIS 메인+검증
 KIS 최소구독(보유종목만) WS_SUBSCRIBE_KIS_MINIMAL
env_config
ON=KIS는 매수된 종목만 시세 수신(한도절약) / OFF=KIS도 키움과 똑같이 전체 후보종목 수신 및 적재
 실매 유니버스 슬롯필터(history∩후보) LIVE_UNIVERSE_SLOT_ALIGN
env_config_ext
ON이면 실시간 후보를 history 스냅과 교집합 — history 지연 시 탈락 위험 · 기본 OFF
history_stale 개장유예(초) OPS_ALERT_HISTORY_OPEN_GRACE_SEC
env_config_ext
180
개장 직후 N초는 history 0건 CRITICAL 스킵
WS 미OPEN CRITICAL 지속(초) OPS_ALERT_WS_DOWN_HOLD_SEC
env_config_ext
60
LS/키움 소켓이 N초 이상 내려가 있을 때만 CRITICAL (순간 재연결 스팸 방지)
호가필터 — 전략별 (수치)
글로벌 ORDERBOOK_MAX_SPREAD_PCT 등 폐기 · 파람서치 apply-best ↔ *_ORDERBOOK_* 정합
꼬리잡기
SHORT
 꼬리잡기 호가필터 ON TAIL_ORDERBOOK_FILTER_ENABLED
config_short
ON=스프레드·잔량비·얇은호가·매도벽으로 매수 차단 · OFF=저장만
꼬리잡기 스프레드상한(%) TAIL_ORDERBOOK_MAX_SPREAD_PCT
config_short
2.06
0.45=0.45% · 그리드 max_spread_pct 앵커
꼬리잡기 매수/매도잔량비 하한 TAIL_ORDERBOOK_MIN_BID_ASK_RATIO
config_short
0.82
그리드 min_bid_ask_ratio
꼬리잡기 매도벽 허용배수 TAIL_ORDERBOOK_ENTRY_ASK_MAX_MULT
config_short
3
필요수량×N · 그리드 ask_max_mult
꼬리잡기 매수호가깊이 배수 TAIL_ORDERBOOK_ENTRY_BID_DEPTH_MULT
config_short
1.2
얇은호가 탈락 · 필요수량×N
꼬리잡기 호가단계(N호가) TAIL_ORDERBOOK_ENTRY_BID_LEVELS
config_short
3
모멘텀
MOMENTUM
 모멘텀 호가필터 ON MOMENTUM_ORDERBOOK_FILTER_ENABLED
config_momentum
ON=스프레드·잔량비·얇은호가·매도벽으로 매수 차단 · OFF=저장만
모멘텀 스프레드상한(%) MOMENTUM_ORDERBOOK_MAX_SPREAD_PCT
config_momentum
0.46
0.45=0.45% · 그리드 max_spread_pct 앵커
모멘텀 매수/매도잔량비 하한 MOMENTUM_ORDERBOOK_MIN_BID_ASK_RATIO
config_momentum
0.59
그리드 min_bid_ask_ratio
모멘텀 매도벽 허용배수 MOMENTUM_ORDERBOOK_ENTRY_ASK_MAX_MULT
config_momentum
3
필요수량×N · 그리드 ask_max_mult
모멘텀 매수호가깊이 배수 MOMENTUM_ORDERBOOK_ENTRY_BID_DEPTH_MULT
config_momentum
1.2
얇은호가 탈락 · 필요수량×N
모멘텀 호가단계(N호가) MOMENTUM_ORDERBOOK_ENTRY_BID_LEVELS
config_momentum
3
돌파
BREAKOUT
 돌파 호가필터 ON BREAKOUT_ORDERBOOK_FILTER_ENABLED
config_breakout
ON=스프레드·잔량비·얇은호가·매도벽으로 매수 차단 · OFF=저장만
돌파 스프레드상한(%) BREAKOUT_ORDERBOOK_MAX_SPREAD_PCT
config_breakout
2.78
0.45=0.45% · 그리드 max_spread_pct 앵커
돌파 매수/매도잔량비 하한 BREAKOUT_ORDERBOOK_MIN_BID_ASK_RATIO
config_breakout
1
그리드 min_bid_ask_ratio
돌파 매도벽 허용배수 BREAKOUT_ORDERBOOK_ENTRY_ASK_MAX_MULT
config_breakout
3
필요수량×N · 그리드 ask_max_mult
돌파 매수호가깊이 배수 BREAKOUT_ORDERBOOK_ENTRY_BID_DEPTH_MULT
config_breakout
1.2
얇은호가 탈락 · 필요수량×N
돌파 호가단계(N호가) BREAKOUT_ORDERBOOK_ENTRY_BID_LEVELS
config_breakout
3
돌파 매도벽 상한(주) BREAKOUT_ORDERBOOK_ASK_WALL_MAX_QTY
config_breakout
5000
그리드 ask_wall_max_qty
스캘핑
SCALP
 스캘핑 호가필터 ON SCALP_ORDERBOOK_FILTER_ENABLED
config_scalp
ON=스프레드·잔량비·얇은호가·매도벽으로 매수 차단 · OFF=저장만
스캘핑 스프레드상한(%) SCALP_ORDERBOOK_MAX_SPREAD_PCT
config_scalp
0.4
0.45=0.45% · 그리드 max_spread_pct 앵커
스캘핑 매수/매도잔량비 하한 SCALP_ORDERBOOK_MIN_BID_ASK_RATIO
config_scalp
0.88
그리드 min_bid_ask_ratio
스캘핑 매도벽 허용배수 SCALP_ORDERBOOK_ENTRY_ASK_MAX_MULT
config_scalp
8
필요수량×N · 그리드 ask_max_mult
스캘핑 매수호가깊이 배수 SCALP_ORDERBOOK_ENTRY_BID_DEPTH_MULT
config_scalp
1.2
얇은호가 탈락 · 필요수량×N
스캘핑 호가단계(N호가) SCALP_ORDERBOOK_ENTRY_BID_LEVELS
config_scalp
3
전략 ON/OFF
config_{strategy} · STRATEGY_*_ENABLED 는 다음 루프부터 신규매수 중단/재개 (보유 청산은 유지 · WS 구독 해제는 안 함). 기동 시 OFF 였던 전략을 켜려면 봇 재시작. 해외 WS 소켓은 OVERSEAS_WS_ENABLED(기동 시) · permanent US 구독과 별개.
해외 모멘텀
US_MOMENTUM
 해외 모멘텀 STRATEGY_US_MOMENTUM_ENABLED
config_us_momentum
config_us_momentum · permanent US 유니버스 · 소켓 해제 없음
공통
 해외 WS(HDFSCNT0) OVERSEAS_WS_ENABLED
env_config_ext
기동 시만 · false=해외 틱 소켓 미기동 · 전략 ON/OFF 와 별개 · 변경 후 재시작
꼬리잡기
SHORT
 꼬리잡기 STRATEGY_SHORT_ENABLED
config_short
config_short
모멘텀
MOMENTUM
 모멘텀 STRATEGY_MOMENTUM_ENABLED
config_momentum
config_momentum
돌파
BREAKOUT
 돌파 STRATEGY_BREAKOUT_ENABLED
config_breakout
config_breakout
UPDOWN 박스
UPDOW
 UPDOWN 박스 STRATEGY_UPDOW_ENABLED
config_updow
config_updow
유니버스 소스
{SID}_UNIVERSE_SOURCE · 기본 키움 · LS는 opt-in
꼬리잡기
SHORT
꼬리잡기 유니버스 SHORT_UNIVERSE_SOURCE
config_short
키움 조건(WS)
ls_condition=LS 동명 AFR · 시세는 키움/한투 유지 · 매니저 최초 기동은 봇 재시작 필요할 수 있음 · 키움으로 자동 폴백 안 함
모멘텀
MOMENTUM
모멘텀 유니버스 MOMENTUM_UNIVERSE_SOURCE
config_momentum
키움 조건(WS)
ls_condition=LS 동명 AFR · 시세는 키움/한투 유지 · 매니저 최초 기동은 봇 재시작 필요할 수 있음 · 키움으로 자동 폴백 안 함
돌파
BREAKOUT
돌파 유니버스 BREAKOUT_UNIVERSE_SOURCE
config_breakout
키움 조건(WS)
ls_condition=LS 동명 AFR · 시세는 키움/한투 유지 · 매니저 최초 기동은 봇 재시작 필요할 수 있음 · 키움으로 자동 폴백 안 함
UPDOWN 박스
UPDOW
UPDOWN 박스 유니버스 UPDOW_UNIVERSE_SOURCE
config_updow
키움 조건(WS)
ls_condition=LS 동명 AFR · 시세는 키움/한투 유지 · 매니저 최초 기동은 봇 재시작 필요할 수 있음 · 키움으로 자동 폴백 안 함
키움 조건검색 (안정화·회복)
KIWOOM_CNSR* · 유니버스 0종목 공백(Blind Spot) 차단 및 3초 고정 회복
 재등록 전 선행 해제(CNSRCLR) KIWOOM_CNSRCLR_BEFORE_REQ
env_config
Bye 후 유령 등록(900003) 방지용 선행 클리어
CNSRCLR 해제 응답 ACK 대기(초) KIWOOM_CNSRCLR_SETTLE_SEC
env_config
2
해제 응답(rc=0) 완료 대기 최대 타임아웃 (조기 ACK 수신 시 즉시 통과)
미응답/900003 고정 재시도 주기(초) KIWOOM_CNSRREQ_RETRY_SEC
env_config
3
지수 백오프 대신 3초 고정 주기로 빠른 회복 시도
최대 재시도 상한 KIWOOM_CNSRREQ_MAX_RETRIES
env_config
30
30회(약 90초) 동안 RAM 후보를 보존하며 지속 회복 시도
CNSRCLR 연속 발송 최소 간격(초) KIWOOM_CNSRCLR_GAP_MIN_SEC
env_config
0.3
CNSRCLR 연속 발송 최대 간격(초) KIWOOM_CNSRCLR_GAP_MAX_SEC
env_config
0.6
CNSRREQ 연속 발송 최소 간격(초) KIWOOM_CNSRREQ_GAP_MIN_SEC
env_config
0.8
LS 조건검색 (안정화·Diff 보정)
LS_T1859* · 매매 전용이 아닌 조건·시세 전용 이점을 극대화한 1분 주기 0.15초 소생술
AFR 침묵 시 소켓 재동기화 주기(초) LS_T1859_STALE_RESYNC_SEC
env_config_ext
60
기본 60초(1분). 매매 주문을 처리하지 않으므로 429 차단 위험 0%! 하루 총 눈감는 시간 약 58초 동안 Delta Diff 1:1 보정
RAM 0종목 시 t1859 재시드 주기(초) LS_T1859_EMPTY_RETRY_SEC
env_config_ext
1
기동 초기 0종목 시 1초마다 재시드 (영구 0종목 공백 록인 방지)
 t1859 축소 전체교체 허용 LS_T1859_ALLOW_SHRINK
env_config_ext
기본 false (장중 1종목 오류 응답이 20종목 덮어 쓰는 자살골 사고 차단)
t1859 REST 호출 최소 간격(초) LS_CONDITION_TR_GAP_SEC
env_config_ext
1.1
LS 증권 공식 1초 1건 상한 보호 쿨다운
전략별 운용한도
config_{strategy}
꼬리잡기
SHORT
꼬리잡기 총 한도(원) TAIL_TOTAL_BUDGET_KRW
config_short
1200000
꼬리잡기 슬롯(원) TAIL_SLOT_MONEY
config_short
300000
꼬리잡기 동시 종목 TAIL_MAX_STOCKS
config_short
8
모멘텀
MOMENTUM
모멘텀 총 한도(원) MOMENTUM_TOTAL_BUDGET_KRW
config_momentum
1200000
모멘텀 슬롯(원) MOMENTUM_SLOT_MONEY
config_momentum
300000
모멘텀 동시 종목 MOMENTUM_MAX_STOCKS
config_momentum
8
돌파
BREAKOUT
돌파 총 한도(원) BREAKOUT_TOTAL_BUDGET_KRW
config_breakout
1200000
돌파 슬롯(원) BREAKOUT_SLOT_MONEY
config_breakout
300000
돌파 동시 종목 BREAKOUT_MAX_STOCKS
config_breakout
8
UPDOWN 박스
UPDOW
UPDOWN 박스 총 한도(원) UPDOW_TOTAL_BUDGET_KRW
config_updow
UPDOWN 박스 슬롯(원) UPDOW_SLOT_MONEY
config_updow
3000000
UPDOWN 박스 동시 종목 UPDOW_MAX_STOCKS
config_updow
일일 익절 — 전략별 (서브)
전략별 손익만 따로 감시. 비어 있으면 마스터 값 상속. 손익 감시 ON이면 목표 달성 시 해당 전략 신규매수 자동 차단. 리스크버짓(B)은 전략별만(기본 OFF).
꼬리잡기
SHORT
 꼬리잡기 손익 감시 켜기 SHORT_DAILY_PROFIT_TARGET_ENABLED
config_short
OFF = 해당 전략 일일익절 비활성 (매수 차단 없음)
꼬리잡기 목표(원) SHORT_DAILY_PROFIT_TARGET_KRW
config_short
300000
꼬리잡기 목표(%) SHORT_DAILY_PROFIT_TARGET_PCT
config_short
10
퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용
꼬리잡기 익절방식 SHORT_DAILY_PROFIT_MODE
config_short
trailing
비우면 마스터 상속 · fixed/trailing/both
꼬리잡기 다단 트레일 SHORT_DAILY_PROFIT_TRAIL_TIERS
config_short
20000:40,40000:30,80000:20
수익원:컷%,… · 비우면 마스터 상속 · 예: 30000:50,100000:35,300000:25
꼬리잡기 단일 트레일 되돌림(%) SHORT_DAILY_PROFIT_TRAIL_DROP_PCT
config_short
30
다단 비었을 때만 · 고점 대비 % · 비우면 마스터 상속 · 0=미사용
꼬리잡기 트레일 발동수익(원) SHORT_DAILY_PROFIT_TRAIL_ARM_KRW
config_short
20000
이 이상 벌어야 트레일 감시 · 비우면 마스터 상속
 꼬리잡기 신규매수 수동 중단 SHORT_DAILY_PROFIT_HALT_NEW_BUYS
config_short
목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상
 꼬리잡기 리스크버짓(B) SHORT_DAILY_PROFIT_RISK_BUDGET_ENABLED
config_short
ON=일일익절 hit 후 보유최악손절합>cushion 이면 전량정리 · 기본 OFF · 마스터 없음
꼬리잡기 리스크버짓 쿨다운(초) SHORT_DAILY_PROFIT_RISK_BUDGET_COOLDOWN_SEC
config_short
300
같은 날 재평가 최소 간격 · 0=당일 1회만
모멘텀
MOMENTUM
 모멘텀 손익 감시 켜기 MOMENTUM_DAILY_PROFIT_TARGET_ENABLED
config_momentum
OFF = 해당 전략 일일익절 비활성 (매수 차단 없음)
모멘텀 목표(원) MOMENTUM_DAILY_PROFIT_TARGET_KRW
config_momentum
300000
모멘텀 목표(%) MOMENTUM_DAILY_PROFIT_TARGET_PCT
config_momentum
10
퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용
모멘텀 익절방식 MOMENTUM_DAILY_PROFIT_MODE
config_momentum
trailing
비우면 마스터 상속 · fixed/trailing/both
모멘텀 다단 트레일 MOMENTUM_DAILY_PROFIT_TRAIL_TIERS
config_momentum
95000:40,190000:30,380000:20
수익원:컷%,… · 비우면 마스터 상속 · 예: 30000:50,100000:35,300000:25
모멘텀 단일 트레일 되돌림(%) MOMENTUM_DAILY_PROFIT_TRAIL_DROP_PCT
config_momentum
다단 비었을 때만 · 고점 대비 % · 비우면 마스터 상속 · 0=미사용
모멘텀 트레일 발동수익(원) MOMENTUM_DAILY_PROFIT_TRAIL_ARM_KRW
config_momentum
95000
이 이상 벌어야 트레일 감시 · 비우면 마스터 상속
 모멘텀 신규매수 수동 중단 MOMENTUM_DAILY_PROFIT_HALT_NEW_BUYS
config_momentum
목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상
 모멘텀 리스크버짓(B) MOMENTUM_DAILY_PROFIT_RISK_BUDGET_ENABLED
config_momentum
ON=일일익절 hit 후 보유최악손절합>cushion 이면 전량정리 · 기본 OFF · 마스터 없음
모멘텀 리스크버짓 쿨다운(초) MOMENTUM_DAILY_PROFIT_RISK_BUDGET_COOLDOWN_SEC
config_momentum
300
같은 날 재평가 최소 간격 · 0=당일 1회만
돌파
BREAKOUT
 돌파 손익 감시 켜기 BREAKOUT_DAILY_PROFIT_TARGET_ENABLED
config_breakout
OFF = 해당 전략 일일익절 비활성 (매수 차단 없음)
돌파 목표(원) BREAKOUT_DAILY_PROFIT_TARGET_KRW
config_breakout
300000
돌파 목표(%) BREAKOUT_DAILY_PROFIT_TARGET_PCT
config_breakout
10
퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용
돌파 익절방식 BREAKOUT_DAILY_PROFIT_MODE
config_breakout
trailing
비우면 마스터 상속 · fixed/trailing/both
돌파 다단 트레일 BREAKOUT_DAILY_PROFIT_TRAIL_TIERS
config_breakout
15000:40,30000:30,60000:20
수익원:컷%,… · 비우면 마스터 상속 · 예: 30000:50,100000:35,300000:25
돌파 단일 트레일 되돌림(%) BREAKOUT_DAILY_PROFIT_TRAIL_DROP_PCT
config_breakout
다단 비었을 때만 · 고점 대비 % · 비우면 마스터 상속 · 0=미사용
돌파 트레일 발동수익(원) BREAKOUT_DAILY_PROFIT_TRAIL_ARM_KRW
config_breakout
15000
이 이상 벌어야 트레일 감시 · 비우면 마스터 상속
 돌파 신규매수 수동 중단 BREAKOUT_DAILY_PROFIT_HALT_NEW_BUYS
config_breakout
목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상
 돌파 리스크버짓(B) BREAKOUT_DAILY_PROFIT_RISK_BUDGET_ENABLED
config_breakout
ON=일일익절 hit 후 보유최악손절합>cushion 이면 전량정리 · 기본 OFF · 마스터 없음
돌파 리스크버짓 쿨다운(초) BREAKOUT_DAILY_PROFIT_RISK_BUDGET_COOLDOWN_SEC
config_breakout
300
같은 날 재평가 최소 간격 · 0=당일 1회만
UPDOWN 박스
UPDOW
 UPDOWN 박스 손익 감시 켜기 UPDOW_DAILY_PROFIT_TARGET_ENABLED
config_updow
OFF = 해당 전략 일일익절 비활성 (매수 차단 없음)
UPDOWN 박스 목표(원) UPDOW_DAILY_PROFIT_TARGET_KRW
config_updow
UPDOWN 박스 목표(%) UPDOW_DAILY_PROFIT_TARGET_PCT
config_updow
퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용
UPDOWN 박스 익절방식 UPDOW_DAILY_PROFIT_MODE
config_updow
예: 005930,000660
비우면 마스터 상속 · fixed/trailing/both
UPDOWN 박스 다단 트레일 UPDOW_DAILY_PROFIT_TRAIL_TIERS
config_updow
예: 005930,000660
수익원:컷%,… · 비우면 마스터 상속 · 예: 30000:50,100000:35,300000:25
UPDOWN 박스 단일 트레일 되돌림(%) UPDOW_DAILY_PROFIT_TRAIL_DROP_PCT
config_updow
다단 비었을 때만 · 고점 대비 % · 비우면 마스터 상속 · 0=미사용
UPDOWN 박스 트레일 발동수익(원) UPDOW_DAILY_PROFIT_TRAIL_ARM_KRW
config_updow
이 이상 벌어야 트레일 감시 · 비우면 마스터 상속
 UPDOWN 박스 신규매수 수동 중단 UPDOW_DAILY_PROFIT_HALT_NEW_BUYS
config_updow
목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상
 UPDOWN 박스 리스크버짓(B) UPDOW_DAILY_PROFIT_RISK_BUDGET_ENABLED
config_updow
ON=일일익절 hit 후 보유최악손절합>cushion 이면 전량정리 · 기본 OFF · 마스터 없음
UPDOWN 박스 리스크버짓 쿨다운(초) UPDOW_DAILY_PROFIT_RISK_BUDGET_COOLDOWN_SEC
config_updow
300
같은 날 재평가 최소 간격 · 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 사용 금지)
꼬리잡기
SHORT
 ⚠ 꼬리 OHLC 폴백 (정합위험·금지) TAIL_BACKTEST_TICK_FALLBACK_OHLC
config_short
절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF
 꼬리 틱 청산 TAIL_BACKTEST_USE_TICK_EXIT
config_short
ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar
꼬리 틱청산 폴링(ms) TAIL_BACKTEST_POLL_MS
config_short
100
실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms
꼬리 파라서치 최소 시작일 TAIL_PARAM_SEARCH_MIN_START
config_short
조건식 변경일 이후만 탐색 (YYYY-MM-DD) · CLI --start 와 max 적용
모멘텀
MOMENTUM
 ⚠ 모멘텀 OHLC 폴백 (정합위험·금지) MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC
config_momentum
절대금지 — 틱 청산 ON 시 엔진 무시 · Optuna 강제 OFF
모멘텀 틱청산 폴링(ms) MOMENTUM_BACKTEST_POLL_MS
config_momentum
100
실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 틱 사이 청산 검사 간격 · 하한 50ms
돌파
BREAKOUT
 돌파 틱 청산 BREAKOUT_BACKTEST_USE_TICK_EXIT
config_breakout
ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar
 ⚠ 돌파 OHLC 폴백 (정합위험·금지) BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC
config_breakout
절대금지 — 틱 진입 ON 시 봉 high 폴백 안 함
돌파 틱청산 폴링(ms) BREAKOUT_BACKTEST_POLL_MS
config_breakout
100
실매 폴링 정합 · 하한 50ms
스캘핑
SCALP
 스캘핑 틱 청산 SCALP_BACKTEST_USE_TICK_EXIT
config_scalp
ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar
 스캘핑 틱 진입 SCALP_BACKTEST_USE_TICK_ENTRY
config_scalp
ON=예약 체결 시 해당 분 첫 틱가 · OFF=분봉 시가
 ⚠ 스캘핑 OHLC 폴백 (정합위험·금지) SCALP_BACKTEST_TICK_FALLBACK_OHLC
config_scalp
절대금지 — 틱 청산 ON 시 엔진 무시
스캘핑 틱청산 폴링(ms) SCALP_BACKTEST_POLL_MS
config_scalp
100
실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms
박스권돌파
RANGE_BREAK
 박스돌파 틱 청산 RANGE_BREAK_BACKTEST_USE_TICK_EXIT
config_range_break
ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar
 ⚠ 박스돌파 OHLC 폴백 (정합위험·금지) RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC
config_range_break
절대금지 — 틱 청산 ON 시 엔진 무시
박스돌파 틱청산 폴링(ms) RANGE_BREAK_BACKTEST_POLL_MS
config_range_break
100
실매 폴링 정합 · 하한 50ms
더블BB
DBBAND
 더블BB 틱 청산 DBBAND_BACKTEST_USE_TICK_EXIT
config_dbband
ON=ws_ticks 시간순 청산 · OFF=봉 OHLC 1회
 ⚠ 더블BB OHLC 폴백 (정합위험·금지) DBBAND_BACKTEST_TICK_FALLBACK_OHLC
config_dbband
절대금지 — 틱 청산 ON 시 엔진 무시
더블BB 틱청산 폴링(ms) DBBAND_BACKTEST_POLL_MS
config_dbband
100
실매 폴링 정합 · 하한 50ms
REST 유량 제한 (한투 API)
한투 유량(계좌·앱키 단위): 실전 18건/초 · 모의 1건/초 · 신규 앱키는 첫 3일 3건/초 후 자동 상향 · 토큰발급 1건/초 · 동시호출 100~150ms 텀 권장. ※ 모의: 거래는 모의앱키(1건/초), 시세·랭킹·조건검색은 실전앱키(18건/초)로 분리. 운영(실전) 전환 시 거래+시세가 한 앱키로 합쳐져 18건/초를 공유.
모의 REST 최소간격(초) KIS_MIN_INTERVAL_SEC_MOCK
env_config
0.22
모의 도메인(거래: 주문·체결·잔고) · 조회·랭킹·조건은 실키라 무관 · 429 로그 없으면 0.22 유지 · 한투 공지 1건/초 엄수 필요 시 1.0 · 재시작 없이 반영(1초 TTL)
실전 REST 최소간격(초) KIS_MIN_INTERVAL_SEC_REAL
env_config
0.12
실전 도메인(시세 · 운영 시 거래+조회+취소+재주문 통합 한 앱키) · 18건/초 한도 → 0.12=약8건/초 · 신규앱키 첫 3일은 0.34(3건/초) · 재시작 없이 반영
공통 폴백 최소간격(초) KIS_MIN_INTERVAL_SEC
env_config
0.22
위 도메인별 키 미설정 시 폴백
잔고 연속조회 최대 페이지 BALANCE_MAX_PAGES
env_config
20
잔고조회는 1페이지에 실전 50종목/모의 20종목만 내려옴. 보유가 많으면 다음 페이지를 이어 조회(누적 병합). 20p=최대 약 1000종목. 보유 종목이 50개를 넘으면 필수 — 부족하면 51번째부터 매도 검증에서 누락됨
스캔 루프 회전율 (WS 따라가기)
REST 유량과 별개 — 전략 매수체크 루프의 sleep. 짧을수록 WS 실시간 신호를 빨리 잡지만 CPU↑. 탈락 경로는 REST 0건(WS·DB·연산만)이라 줄여도 한투 유량 무관. 재시작 없이 반영. 비우면 전략별 기본값(loop 0.1초) 사용.
백테·틱청산
 틱매도(공통) TICK_SELL_ENABLED
env_config_ext
ON=WS 현재가 갱신마다 매도검사(백테 틱청산에 근접) · OFF=루프(~0.1초)만 · 전략별 *_TICK_SELL_ENABLED 가 비어있지 않으면 그쪽 우선 · 기본 OFF
틱매도 최소간격(ms) TICK_SELL_MIN_INTERVAL_MS
env_config_ext
50
같은 종목 연속 틱 폭주 시 매도검사 하한 · 백테 poll≈50~100ms 정합
스캔 루프
탈락 후 sleep 최소(초) SCAN_REJECT_SLEEP_MIN
env_config
0.02
check_buy 탈락 종목마다 · REST 0건 · 0.05~0.1 로 낮추면 한 바퀴 대폭 단축
탈락 후 sleep 최대(초) SCAN_REJECT_SLEEP_MAX
env_config
0.05
매수성공 후 sleep 최소(초) SCAN_BUY_OK_SLEEP_MIN
env_config
0.5
1루프 1매수 후 대기 · 포지션 과집중 방지
매수성공 후 sleep 최대(초) SCAN_BUY_OK_SLEEP_MAX
env_config
1
주문실패 후 sleep 최소(초) SCAN_BUY_FAIL_SLEEP_MIN
env_config
0.1
주문실패 후 sleep 최대(초) SCAN_BUY_FAIL_SLEEP_MAX
env_config
0.3
루프 끝 sleep 최소(초) STRATEGY_LOOP_SLEEP_MIN
env_config
0.1
한 바퀴 끝 대기 · WS 구독 캐시 폴링 · 0.1=실매 반응 빠르게
루프 끝 sleep 최대(초) STRATEGY_LOOP_SLEEP_MAX
env_config
0.1
전략별 틱매도 (선택)
매도 규칙은 기존 check_sell_signals 그대로 · 호출 시점만 WS 틱. 실매↔백테 청산 타이밍 정합용 · 기본 OFF 권장(검증 후 ON).
꼬리잡기
SHORT
 꼬리잡기 틱매도 SHORT_TICK_SELL_ENABLED
config_short
비우면 공통 TICK_SELL_ENABLED · true/false 명시 시 전략만 덮어씀 · 기본 false
모멘텀
MOMENTUM
 모멘텀 틱매도 MOMENTUM_TICK_SELL_ENABLED
config_momentum
비우면 공통 TICK_SELL_ENABLED · true/false 명시 시 전략만 덮어씀 · 기본 false
돌파
BREAKOUT
 돌파 틱매도 BREAKOUT_TICK_SELL_ENABLED
config_breakout
비우면 공통 TICK_SELL_ENABLED · true/false 명시 시 전략만 덮어씀 · 기본 false
UPDOWN 박스
UPDOW
 UPDOWN 박스 틱매도 UPDOW_TICK_SELL_ENABLED
config_updow
비우면 공통 TICK_SELL_ENABLED · true/false 명시 시 전략만 덮어씀 · 기본 false
전략별 후보 상한 (WS 100 구독 분배)
env_config · 키움 WS 실시간 구독은 계좌당 100종목이 한도. 전략별 후보 상한 합 + 영구구독 + 보유 여유 ≤ 100 이 되도록 분배. UPDOW 는 추가로 watchlist(UPDOWN_WATCH_MAX) 안에서만 유지됨.
꼬리잡기
SHORT
꼬리잡기 후보 상한 SHORT_CAND_LIMIT
config_short
20
0=무제한 · 조건검색/랭킹이 N개 줘도 상위 N개만 매수체크·WS구독 · 전 전략 합산이 키움 WS 100종 한도를 넘지 않게 조절
모멘텀
MOMENTUM
모멘텀 후보 상한 MOMENTUM_CAND_LIMIT
config_momentum
20
0=무제한 · 조건검색/랭킹이 N개 줘도 상위 N개만 매수체크·WS구독 · 전 전략 합산이 키움 WS 100종 한도를 넘지 않게 조절
돌파
BREAKOUT
돌파 후보 상한 BREAKOUT_CAND_LIMIT
config_breakout
20
0=무제한 · 조건검색/랭킹이 N개 줘도 상위 N개만 매수체크·WS구독 · 전 전략 합산이 키움 WS 100종 한도를 넘지 않게 조절
UPDOWN 박스
UPDOW
UPDOWN 박스 후보 상한 UPDOW_CAND_LIMIT
config_updow
20
0=무제한 · 조건검색/랭킹이 N개 줘도 상위 N개만 매수체크·WS구독 · 전 전략 합산이 키움 WS 100종 한도를 넘지 않게 조절
UPDOWN 박스권 — 판별·진입·손절 스택
env_config · 횡보(박스권) 종목을 하단에서 줍고 상단/익절·박스이탈·패닉·래칫으로 청산. 파라서치(param_search_updown_box) 1위와 동일 키 · 재시작 없이 다음 루프 반영.
REST 유량
SCAN 주기(초) UPDOWN_SCAN_INTERVAL_SEC
env_config_ext
300
조건검색→박스필터→watchlist 충전 주기 · 박스는 느리게 변하므로 300(5분) 권장
기타
분봉(분) UPDOWN_SCAN_TF_MIN
env_config_ext
15
박스 판별·진입에 쓰는 분봉 · 수집/백테/파라서치와 동일해야 함
관심종목 최대 수 UPDOWN_WATCH_MAX
env_config_ext
30
sticky watchlist 최대 보유 · REST 1콜 30종(intstock-multprice)과 정합
박스 lookback(봉) UPDOWN_BOX_LOOKBACK_BARS
env_config_ext
20
박스 상·하단 산출에 쓸 최근 봉 수
박스 최대 높이(%) UPDOWN_BOX_RANGE_MAX_PCT
env_config_ext
6
(상단-하단)/하단 · 이보다 넓으면 박스 아님(변동성 과대)
밴드폭 상한(%) UPDOWN_BOX_BB_BW_MAX
env_config_ext
12
볼린저 밴드폭(스퀴즈) · 작을수록 횡보 · 초과 시 박스 아님
MA 기울기 허용(%) UPDOWN_BOX_MA_SLOPE_TOL_PCT
env_config_ext
0.5
|MA 기울기| 이내여야 추세없음(횡보) 인정
하단 근접 진입(%) UPDOWN_BOX_NEAR_LOW_PCT
env_config_ext
1.5
현재가가 박스 하단에서 이 % 이내로 내려오면 매수 후보(싸게 줍기)
직전봉 음봉 최소(%) UPDOWN_BOX_BODY_DROP_MIN_PCT
env_config_ext
0.2
되돌림 확인 · 직전봉 음봉 몸통 하락률 하한 · 0=무시
익절(%) UPDOWN_BOX_TP_PCT
env_config_ext
2.5
진입가 대비 · 박스 상단 도달 기대치 근방
하드 손절(%) UPDOWN_BOX_STOP_LOSS_PCT
env_config_ext
2
진입가 대비 · 박스이탈·패닉이 안 걸릴 때 최종 방어
박스이탈 여유(%) UPDOWN_BOX_BREACH_BUFFER_PCT
env_config_ext
0.3
현재가 < 하단×(1-여유%) 면 구조 붕괴 즉시 손절 · 노이즈 이탈 방지
패닉 손절(고점대비 %) UPDOWN_PANIC_FROM_HIGH_PCT
env_config_ext
3
보유 중 고점 대비 이 % 급락 시 무조건 긴급컷(진입가 무관)
래칫 무장(+%) UPDOWN_BOX_SHOULDER_MIN_HIGH_PCT
env_config_ext
1
고점이 진입가 대비 +이 % 도달해야 어깨컷(트레일) 무장
래칫 컷(고점대비 -%) UPDOWN_BOX_SHOULDER_CUT_PCT
env_config_ext
1.2
무장 후 고점 대비 이 % 꺾이면 청산(어깨컷)
다단 래칫(수익%:컷%,…) UPDOWN_BOX_RATCHET_TIERS
env_config_ext
예: 005930,000660
TAIL·BREAKOUT 동일 형식. 예 '2:1.5,5:1.0' = +2%부터 고점-1.5%컷, +5%부터 -1.0%컷. 비우면 OFF(위 단일 어깨컷 사용)
보유 한도(봉) UPDOWN_BOX_MAX_HOLD_BARS
env_config_ext
64
이만큼 봉이 지나면 무조건 청산
피드 모드 UPDOWN_FEED_MODE
env_config_ext
rest
ws=키움 실시간(100한도 공유) / rest=한투 30배치 폴링 · watchlist 30종이면 rest 권장
REST 폴링 주기(초) UPDOWN_REST_POLL_SEC
env_config_ext
5
rest 모드에서 현재가 스냅샷 갱신 주기
스캘핑(SCALP) — EOD
config_scalp · 저장 후 다음 매도 루프부터 반영(재시작 권장). 실매 기존 하드코딩 15:25 장마감청산과 동일 기본값.
 EOD 당일청산 사용 SCALP_EOD_ENABLED
config_scalp
ON=설정 시각 이후 보유 전량 장마감청산 · OFF=익절·손절·어깨만
EOD 시각 (HH:MM) SCALP_EOD_HM
config_scalp
15:25
실매 기존 15:25 · 정규장 15:30 마감 직전 순차매도
돌파(BREAKOUT) — EOD · 수익구간 호가매도 · 손절호가
env_config · 저장 후 다음 매도 루프부터 반영(재시작 불필요). 호가매도·손절호가 기본 OFF · 돌파=LS 호가 · 모멘텀=키움과 분리 · 진입필터와 별개
 EOD 당일청산 사용 BREAKOUT_EOD_ENABLED
config_breakout
ON=설정 시각 이후 보유 전량 eod 청산 · OFF=익절·손절·시간컷만
EOD 시각 (HH:MM) BREAKOUT_EOD_HM
config_breakout
15:15
이 시각 이후 보유 전량 청산 · 예: 15:15
최대보유(분) BREAKOUT_MAX_HOLD_BARS
config_breakout
150
0=OFF · 진입 후 N분 경과 시 max_hold 청산
 수익구간 호가매도 ON BREAKOUT_EXIT_OB_ENABLED
config_breakout
기본 OFF · ON=이미 이득+OR_MA 붕괴 시 호가컷 · LS 호가 · 진입필터와 무관
수익구간 OR_MA 임계 BREAKOUT_EXIT_OB_RATIO_MIN
config_breakout
0.4
매수잔량/매도잔량 MA 미만이면 붕괴 · 예: 0.4
수익구간 OR MA 창 BREAKOUT_EXIT_OB_MA_WINDOW
config_breakout
10
OR 이동평균에 쓰는 최근 스냅 수
수익구간 최소이익(분율) BREAKOUT_EXIT_OB_MIN_PROFIT_PCT
config_breakout
0.02
0.005=+0.5% · 미달이면 호가컷 미발동
수익구간 최소보유(분) BREAKOUT_EXIT_OB_MIN_HOLD_BARS
config_breakout
1
보유 분(1분봉≈1) 미달이면 미발동
 손절호가 ON BREAKOUT_STOP_OB_ENABLED
config_breakout
기본 OFF · ON=이미 손해+OR_MA 붕괴 시 하드손절 전 선제 · 사유 손절호가
손절호가 OR_MA 임계 BREAKOUT_STOP_OB_RATIO_MIN
config_breakout
0.4
손실구간 OR_MA 임계
손절호가 OR MA 창 BREAKOUT_STOP_OB_MA_WINDOW
config_breakout
5
손절호가 OR 이동평균 스냅 수
손절호가 최소손실(분율) BREAKOUT_STOP_OB_MIN_LOSS_PCT
config_breakout
0.003
0.003=−0.3% · 이만큼 이상 손해일 때만
손절호가 최소보유(분) BREAKOUT_STOP_OB_MIN_HOLD_BARS
config_breakout
2
보유 분 미달이면 손절호가 미발동
모멘텀(MOMENTUM) — EOD · 수익구간 호가매도 · 손절호가
env_config · 저장 후 다음 매도 루프부터 반영(재시작 불필요). 수익구간=이득+OR붕괴 · 손절호가=손해+OR붕괴·하드손절 직전 · 둘 다 기본 OFF · 진입필터와 별개
 EOD 당일청산 사용 MOMENTUM_EOD_ENABLED
config_momentum
ON=설정 시각 이후 보유 전량 장마감청산 · OFF=익절·손절·시간컷만
EOD 시각 (HH:MM) MOMENTUM_EOD_HM
config_momentum
15:20
정규장 15:30 마감 기준 최소 10분 전 · 순차매도 여유
 수익구간 호가매도 ON MOMENTUM_EXIT_OB_ENABLED
config_momentum
기본 OFF · ON=이미 이득+OR_MA 붕괴 시 호가컷 · 진입 호가필터와 무관
수익구간 OR_MA 임계 MOMENTUM_EXIT_OB_RATIO_MIN
config_momentum
0.75
매수잔량/매도잔량 MA 미만이면 붕괴 · 예: 0.4
수익구간 OR MA 창 MOMENTUM_EXIT_OB_MA_WINDOW
config_momentum
9
OR 이동평균에 쓰는 최근 스냅 수
수익구간 최소이익(분율) MOMENTUM_EXIT_OB_MIN_PROFIT_PCT
config_momentum
0.0066
0.005=+0.5% · 미달이면 호가컷 미발동
수익구간 최소보유(분) MOMENTUM_EXIT_OB_MIN_HOLD_BARS
config_momentum
2
보유 분(1분봉≈1) 미달이면 미발동
 손절호가 ON MOMENTUM_STOP_OB_ENABLED
config_momentum
기본 OFF · ON=이미 손해+OR_MA 붕괴 시 하드손절 전 선제 · 사유 손절호가
손절호가 OR_MA 임계 MOMENTUM_STOP_OB_RATIO_MIN
config_momentum
0.4
총사÷총팔 MA 미만이면 붕괴 · 예: 0.4
손절호가 OR MA 창 MOMENTUM_STOP_OB_MA_WINDOW
config_momentum
5
OR 이동평균 스냅 수
손절호가 최소손실(분율) MOMENTUM_STOP_OB_MIN_LOSS_PCT
config_momentum
0.003
0.003=−0.3% · 이만큼 이상 손해일 때만
손절호가 최소보유(분) MOMENTUM_STOP_OB_MIN_HOLD_BARS
config_momentum
2
보유 분 미달이면 미발동
꼬리(SHORT/TAIL) — EOD
env_config · 저장 후 다음 매도 루프부터 반영(재시작 불필요).
 EOD 당일청산 사용 TAIL_EOD_ENABLED
config_short
ON=설정 시각 이후 보유 전량 장마감 청산 · OFF=익절·손절·시간컷만
EOD 시각 (HH:MM) TAIL_EOD_HM
config_short
15:20
정규장 15:30 마감 기준 최소 10분 전 · 순차매도 여유
오류감시 → Mattermost
별도 프로세스 scripts/kis_error_watch_mm.py 가 journalctl -f 로 kis_trader_main 을 감시 → Traceback/유닛다운 시 MM. 실매 봇과 분리.
 오류감시 ON ERROR_WATCH_ENABLED
env_config
감시 프로세스 시작 시 읽음 · OFF면 감시자 즉시 종료
감시 systemd 유닛 ERROR_WATCH_UNIT
env_config
kis_trader_main.service
journalctl -u 대상
알림 MM alias ERROR_WATCH_MM_CHANNEL
env_config
예: 005930,000660
비우면 KIS_SYSTEM_MM_CHANNEL(default=키스명령봇)
동일오류 쿨다운(초) ERROR_WATCH_COOLDOWN_SEC
env_config
180
같은 Traceback 지문 재알림 간격
유닛생존 점검(초) ERROR_WATCH_HEALTH_CHECK_SEC
env_config
60
systemctl is-active 주기
Traceback 추가줄 ERROR_WATCH_TRACEBACK_EXTRA_LINES
env_config
12
Traceback 이후 스택 수집 줄 수
 감시자 기동 MM ERROR_WATCH_STARTUP_NOTIFY
env_config
감시 프로세스 시작 시 1회 알림
 MM jitter ERROR_WATCH_MM_JITTER
env_config
오류 알림은 즉시 권장(OFF)
운영치명 알림 (봇 내부)
실매 프로세스 안에서 토큰/WS/유니버스0/주문거부/유량/VI/MarketGuard PANIC 을 시스템 MM(+TG)로 보냄. journal 오류감시와 별개·보완.
체결·주문
주문거부 연속 N회 OPS_ALERT_ORDER_REJECT_STREAK
env_config_ext
3
기타
 운영알림 ON OPS_ALERT_ENABLED
env_config_ext
MM alias OPS_ALERT_MM_CHANNEL
env_config_ext
예: 005930,000660
비우면 KIS_SYSTEM_MM_CHANNEL
 critical 시 TG OPS_ALERT_TG_ON_CRITICAL
env_config_ext
코드별 쿨다운(초) OPS_ALERT_COOLDOWN_SEC
env_config_ext
300
전역 최소간격(초) OPS_ALERT_GLOBAL_MIN_GAP_SEC
env_config_ext
20
장중게이트 시작 HHMM OPS_ALERT_SESSION_START_HM
env_config_ext
900
장중게이트 종료 HHMM OPS_ALERT_SESSION_END_HM
env_config_ext
1535
유니버스0 지속(초) OPS_ALERT_UNIVERSE_ZERO_SEC
env_config_ext
180
장중 유니버스 0 이 이 시간 이상이면 알림
히스토리 공백(초) OPS_ALERT_HISTORY_STALE_SEC
env_config_ext
600
키움 history 당일 최신 스냅샷이 이보다 오래면 알림
유량 연속 N회 OPS_ALERT_RATE_LIMIT_STREAK
env_config_ext
5
 VI 발동 알림 OPS_ALERT_VI_ENABLED
env_config_ext
 MarketGuard PANIC 알림 OPS_ALERT_MARKET_GUARD_ENABLED
env_config_ext
보유·매도 / 고아복구
보유·매도 탭 일괄매도·수동 보호·장마감 후 DB 동기화. MANUAL_HOLD_CODES 에 넣은 종목은 일괄매도·고아복구 모두 제외.
REST 유량
일괄매도 종목 간격(초) BULK_SELL_INTERVAL_SEC
env_config
0.3
미등록 봇고아 일괄 시장가매도 시 REST 429 방지 · 종목마다 sleep
드리프트 조회주기(초) INTRADAY_HOLDINGS_DRIFT_INTERVAL_SEC
env_config
300
INTRADAY_HOLDINGS_DRIFT_ENABLED=ON 일 때만
보유·고아
수동 보유 보호 종목 MANUAL_HOLD_CODES
env_config
예: 005930,000660
쉼표(,) 구분 종목코드 예: 005930,000660 · HTS 직접 매수·장기 보유분 보호 · 일괄매도·고아복구 제외
 장마감 고아복구 ORPHAN_RECONCILE_ENABLED
env_config
매일 15:36~16:00 1회 · 실계좌 잔고↔active_trades 대조 · orders BUY 있는 미기록분만 복구 · 수동·MANUAL_HOLD 제외
 Pre-EOD 고아복구 ORPHAN_RECONCILE_PRE_EOD_ENABLED
env_config
활성 전략 중 가장 이른 EOD − N분 1회 · EOD 청산 전 active_trades 반영
Pre-EOD 선행(분) ORPHAN_RECONCILE_PRE_EOD_LEAD_MIN
env_config
7
예: BREAKOUT EOD 15:15 → 15:08 실행 · REST 잔고 1회/일
 청산히스토리 있으면 재등록금지 ORPHAN_SKIP_AFTER_SELL_HISTORY
env_config_ext
ON=매수 이후 장마감청산 등 히스토리 있으면 고아복구로 active 다시 안 넣음
재등록금지 청산사유 ORPHAN_SKIP_SELL_REASONS
env_config_ext
쉼표 구분 키워드. 비우면 매수 이후 모든 청산 히스토리 금지
 청산후 유령 active 정리 ORPHAN_PURGE_ACTIVE_AFTER_SELL_HISTORY
env_config_ext
ON=active에 남았는데 매수 이후 청산 히스토리면 DB 행 삭제
 고아복구 시 유령잔고 삭제 GHOST_PURGE_ON_RECONCILE
env_config
ON=브로커 0주인데 active_trades 남은 종목 삭제(수동보호 제외) · Pre/Post EOD 동일 잔고조회에서 처리
 유령정리 시 거래내역 기록 GHOST_PURGE_RECORD_HISTORY
env_config_ext
ON=유령 삭제 시 trade_history 에 sell_reason=ghost_purge (realized_pnl=0) · OFF=삭제만 · 전전략 공통
 장중 qty 드리프트 감시 INTRADAY_HOLDINGS_DRIFT_ENABLED
env_config
기본 OFF · ON=N분마다 잔고 REST · 알림/자동복구는 별도 키
 드리프트 자동복구 INTRADAY_HOLDINGS_DRIFT_AUTO_RECOVER
env_config
OFF=알림만 · ON=active_trades qty 보정(기본 OFF)

지금 내 코드 설정이랑 안맞는 부분이 너무 많아졌는데 실제 운영 방식대로 필요없는거 빼줘 아주 헷갈리고 산만해
예를 들면 TRIGGER 필터 — WS 공통 휩쏘 이런 지금은 실시간 램 디비 적재인데 초 딜레이가 웬말인가 다른것도 코드 파악해서 없앨거 없애주고 라벨이랑 설명 자세히 써줘  초등생 수준으로
</USER_REQUEST>
<ADDITIONAL_METADATA>
The current local time is: 2026-08-07T19:47:50+09:00.

The user's current state is as follows:
Active Document: /home/hoon/kis_bot/kis_trader/main.py (LANGUAGE_PYTHON)
Cursor is on line: 1062
Other open documents:
- /home/hoon/kis_bot/kis_trader/main.py (LANGUAGE_PYTHON)
- /home/hoon/kis_bot/scratch/check_orderbook_schema.py (LANGUAGE_PYTHON)
- /home/hoon/kis_bot/scratch/check_orderbook_counts_correct.py (LANGUAGE_PYTHON)
- /home/hoon/kis_bot/kis_trader/network/ws_manager.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 1h1m44s)
</ADDITIONAL_METADATA>
<USER_SETTINGS_CHANGE>
The user changed setting `Model Selection` from Gemini 3.1 Pro (High) to Claude Sonnet 4.6 (Thinking). No need to comment on this change if the user doesn't ask about it. If reporting what model you are, please use a human readable name instead of the exact string.
</USER_SETTINGS_CHANGE>


먼저 스키마 파일 전체를 파악한 다음 정리하겠습니다.

The user wants to clean up the "운영설정" (Operations Settings) tab in the web backtest page. They want to:
1. Remove items that are not relevant to their current setup
2. Fix misleading labels (like "휩쏘 초 딜레이" which doesn't make sense for real-time RAM/DB storage)
3. Make labels more beginner-friendly (초등학생 수준 = elementary school level)
4. Remove the newly added WS_PROVIDER related fields that showed up in odd places

Let me first look at the live_config_schema.py file more carefully to understand what's currently there and what needs to be cleaned up. I need to understand the full structure.
The main issues are that the "TRIGGER 필터 — WS 공통 휩쏘" section has a delay setting that doesn't apply to real-time RAM/DB storage, and there are other settings that don't match their actual operation mode. I should examine the schema file to see what needs to be removed or relabeled.

운영설정 그룹 전체 구조 파악


Created At: 2026-08-07T10:48:04Z
Completed At: 2026-08-07T10:48:04Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1111
Total Bytes: 60859
Showing lines 120 to 290
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.
120: def build_live_config_groups() -> List[GroupDef]:
121:     """정적 그룹 + 전략 반복 그룹 메타."""
122:     groups: List[GroupDef] = [
123:         {
124:             "id": "daily_profit_global",
125:             "title": "일일 익절 — 총합 (규칙·수동중단)",
126:             "hint": (
127:                 "손익 감시 ON/OFF 는 전략별(*_DAILY_PROFIT_TARGET_ENABLED)만 사용. "
128:                 "여기 마스터는 총합 목표금액/%·수동 매수잠금·알림·트레일 규칙. "
129:                 "① 신규매수 수동 중단 = 목표·손익과 무관 매수만 잠금(긴급용, 기본 OFF). "
130:                 "매도·손절은 항상 유지"
131:             ),
132:             "fields": [
133:                 _f("DAILY_PROFIT_TARGET_KRW", "목표 금액(원)", "int", default=0),
134:                 _f("DAILY_PROFIT_TARGET_PCT", "목표 수익률(%)", "float", default=0,
135:                    hint="퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용"),
136:                 _f(
137:                     "DAILY_PROFIT_TARGET_BUDGET_KRW",
138:                     "분모 운용한도(원)",
139:                     "int",
140:                     default=0,
141:                     hint="0 = ON 전략 TOTAL_BUDGET 합 자동",
142:                 ),
143:                 _f(
144:                     "DAILY_PROFIT_HALT_NEW_BUYS",
145:                     "신규매수 수동 중단",
146:                     "bool",
147:                     default=False,
148:                     hint=(
149:                         "목표·손익과 무관한 수동 매수 잠금. "
150:                         "ON=즉시 신규매수 전면 차단 / OFF=정상 (기본)"
151:                     ),
152:                 ),
153:                 _f("DAILY_PROFIT_NOTIFY_MM", "달성 시 MM 알림", "bool", default=True),
154:                 _f("DAILY_PROFIT_MODE", "익절 방식", "text", default="fixed",
155:                    hint="fixed=고정목표 / trailing=고점대비 되돌림 / both=둘 중 먼저"),
156:                 _f("DAILY_PROFIT_TRAIL_TIERS", "다단 트레일(수익원:컷%,…)", "text", default="",
157:                    hint="벌수록 타이트하게 사수 · 예: 30000:50,100000:35,300000:25 · 비우면 단일 되돌림 사용"),
158:                 _f("DAILY_PROFIT_TRAIL_DROP_PCT", "단일 트레일 되돌림(%, 고점대비)", "float", default=0,
159:                    hint="다단 비었을 때만 · 예: 35 = 고점 대비 -35% 꺾이면 중단 · 0=미사용"),
160:                 _f("DAILY_PROFIT_TRAIL_ARM_KRW", "트레일 발동 최소수익(원)", "int", default=0,
161:                    hint="이 이상 벌어야 트레일 감시 시작 · 0=트레일 비활성(과민발동 방지)"),
162:                 _f("DAILY_PROFIT_TRAIL_ARM_PCT", "트레일 발동 최소수익(%)", "float", default=0,
163:                    hint="운용한도 대비 % · KRW와 둘 중 큰 값"),
164:             ],
165:         },
166:         {
167:             "id": "risk_global",
168:             "title": "리스크 — 계정 공통",
169:             "hint": "env_config",
170:             "fields": [
171:                 _f("DAILY_STOP_LOSS_PCT", "일일 손실 한도(분율, -0.05=-5%)", "float", default=0),
172:                 _f("CONSECUTIVE_LOSS_LIMIT", "연속 손실 제한(회)", "int", default=0),
173:                 _f("USE_RISK_CHECK", "리스크 체크 사용", "bool"),
174:                 _f("EXCLUDE_NON_STOCK", "비본주(우선주·ETF·ETN) 매수 제외", "bool", default=True,
175:                    hint="후보 name==code 여도 코드 끝 5/7/9·K/L… 로 우선주 차단"),
176:                 _f("NON_STOCK_PREF_CODE_SUFFIXES", "우선주 코드 끝자리(숫자)", "str", default="5,7,9",
177:                    hint="KRX 구형 우선주. 콤마 구분"),
178:                 _f("NON_STOCK_EXCLUDE_ALPHA_SUFFIX", "코드 끝 알파벳=우선주 제외", "bool", default=True,
179:                    hint="00088K·00781K 등"),
180:             ],
181:         },
182:         {
183:             "id": "ws_trigger_global",
184:             "title": "TRIGGER 필터 — WS 공통",
185:             "hint": (
186:                 "호가(0D)·프로그램(0w) · env_config(컬럼 없으면 env_config_ext) · "
187:                 "COLLECT=판정순간1장(filter_eval) / SAVE=후보~3초시계열(kiwoom_0d) — 둘은 다름"
188:             ),
189:             "fields": [
190:                 _f("WS_PROVIDER", "메인 시세/매매 제공자(재시작 필요)", "text", default="kiwoom_main",
191:                    hint="kiwoom_main=키움 메인(적재 둘다) / kis_main(또는 kis_only)=KIS 메인(적재 둘다) / kis_with_validation=KIS 메인+검증"),
192:                 _f("WS_SUBSCRIBE_KIS_MINIMAL", "KIS 최소구독(보유종목만)", "bool", default=False,
193:                    hint="ON=KIS는 매수된 종목만 시세 수신(한도절약) / OFF=KIS도 키움과 똑같이 전체 후보종목 수신 및 적재"),
194:                 _f("KIS_WS_ORDERBOOK_ENABLED", "KIS 호가 WS 구독(주의)", "bool", default=False,
195:                    hint="ON=KIS 호가 수신(kis_ws_orderbook 적재). 단, KIS는 구독한도가 40개이므로 시세+호가 동시 수신 시 최대 20종목만 가능"),
196:                 _f("KIWOOM_WS_ORDERBOOK_ENABLED", "호가 WS(0D) 구독", "bool", default=True,
197:                    hint="키움 실시간 호가 수신(RAM) · 꺼면 필터·수집·시계열 모두 불가"),
198:                 _f("KIWOOM_WS_PROGRAM_ENABLED", "프로그램 WS(0w) 구독", "bool", default=True,
199:                    hint="키움 프로그램매매 수신(RAM)"),
200:                 _f(
201:                     "WS_TRIGGER_EVAL_SAVE_ENABLED",
202:                     "TRIGGER 판정 DB 저장(마스터)",
203:                     "bool",
204:                     default=True,
205:                     hint="OFF면 아래 COLLECT(판정 스냅) 전부 안 씀 · SAVE(시계열)와 무관",
206:                 ),
207:                 _f(
208:                     "WS_ORDERBOOK_COLLECT_ENABLED",
209:                     "호가 판정스냅(FILTER_EVAL) — 매수체크 순간 1장",
210:                     "bool",
211:                     default=True,
212:                     hint="≠ 연속시계열. TRIGGER 판정 때만 ws_orderbook source=filter_eval · 필터 OFF여도 저장 가능",
213:                 ),
214:                 _f(
215:                     "WS_ORDERBOOK_SAVE_ENABLED",
216:                     "호가 시계열(KIWOOM_0D) DB 저장",
217:                     "bool",
218:                     default=False,
219:                     hint="ON이면 아래 MODE로 저장 · 파람서치 호가축용 · 봇 재시작 필요",
220:                 ),
221:                 _f(
222:                     "WS_ORDERBOOK_SAVE_MODE",
223:                     "호가 저장모드 tick|interval",
224:                     "text",
225:                     default="tick",
226:                     hint="tick=체결(0B)마다 RAM호가 1장(LS와 동일) · interval=0D+아래 간격 스로틀 · 봇 재시작",
227:                 ),
228:                 _f(
229:                     "WS_ORDERBOOK_TICK_MAX_AGE_SEC",
230:                     "틱동기 호가 RAM 최대나이(초)",
231:                     "float",
232:                     default=3.0,
233:                     hint="tick 모드: 이보다 오래된 호가면 해당 틱 호가행 생략(가짜 채움 금지)",
234:                 ),
235:                 _f(
236:                     "WS_TRIGGER_SNAPSHOT_DB_INTERVAL_SEC",
237:                     "호가/프로그램 interval 간격(초)",
238:                     "float",
239:                     default=3.0,
240:                     hint="MODE=interval 일 때만 · 종목당 최소 저장 간격 · 봇 재시작 필요",
241:                 ),
242:                 _f(
243:                     "LIVE_UNIVERSE_SLOT_ALIGN",
244:                     "실매 유니버스 슬롯필터(history∩후보)",
245:                     "bool",
246:                     default=False,
247:                     hint="ON이면 실시간 후보를 history 스냅과 교집합 — history 지연 시 탈락 위험 · 기본 OFF",
248:                 ),
249:                 _f(
250:                     "OPS_ALERT_HISTORY_OPEN_GRACE_SEC",
251:                     "history_stale 개장유예(초)",
252:                     "int",
253:                     default=180,
254:                     hint="개장 직후 N초는 history 0건 CRITICAL 스킵",
255:                 ),
256:                 _f(
257:                     "OPS_ALERT_WS_DOWN_HOLD_SEC",
258:                     "WS 미OPEN CRITICAL 지속(초)",
259:                     "int",
260:                     default=60,
261:                     hint="LS/키움 소켓이 N초 이상 내려가 있을 때만 CRITICAL (순간 재연결 스팸 방지)",
262:                 ),
263:                 # 글로벌 ORDERBOOK_FILTER / MAX_SPREAD 폐기 → 아래「호가필터 — 전략별」
264:                 _f(
265:                     "WS_PROGRAM_COLLECT_ENABLED",
266:                     "프로그램 판정스냅 — 매수체크 순간 1장",
267:                     "bool",
268:                     default=True,
269:                     hint="≠ 연속시계열. 판정 때만 ws_program · 필터 OFF여도 가능",
270:                 ),
271:                 _f(
272:                     "WS_PROGRAM_SAVE_ENABLED",
273:                     "프로그램 시계열 — 구독후보 ~3초 덤프",
274:                     "bool",
275:                     default=False,
276:                     hint="SAVE와 동일 Recorder · 봇 재시작 필요 · 필터와 무관",
277:                 ),
278:                 _f("PROGRAM_FILTER_ENABLED", "프로그램 필터(TRIGGER) — 실매 탈락", "bool", default=True),
279:                 _f("WHIPSAW_FILTER_ENABLED", "휩쏘 필터(글로벌)", "bool", default=True),
280:                 _f("WHIPSAW_SUBBAR_SEC", "휩쏘 미니봉(초)", "int", default=30,
281:                    hint="틱을 N초 봉으로 묶음 · 실매 기본 30 · Optuna 꼬리 TPE 탐색"),
282:                 _f("WHIPSAW_LOOKBACK_SEC", "휩쏘 룩백(초)", "int", default=90,
283:                    hint="신호 직전 몇 초를 볼지 · 실매 기본 90"),
284:                 _f("WHIPSAW_DIP_PCT", "휩쏘 하락폭(분율, 0.003=0.3%)", "float", default=0.003),
285:                 _f("WHIPSAW_RECOVERY_TOL_PCT", "휩쏘 회복 허용(분율, 0.001=0.1%)", "float", default=0.001),
286:             ],
287:         },
288:     ]
289:
290:     # 호가필터 — 전략별 (글로벌 ORDERBOOK_* 수치 폐기)
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-07T10:48:10Z
Completed At: 2026-08-07T10:48:10Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1111
Total Bytes: 60859
Showing lines 290 to 500
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.
290:     # 호가필터 — 전략별 (글로벌 ORDERBOOK_* 수치 폐기)
291:     # SCALP 는 LIVE_STRATEGY_IDS 에서 숨김이어도 config_scalp 키는 노출
292:     from kis_trader.engine.orderbook_env import (
293:         OB_DEFAULT_ASK_WALL_MAX_QTY,
294:         OB_DEFAULT_ENTRY_ASK_MAX_MULT,
295:         OB_DEFAULT_ENTRY_BID_DEPTH_MULT,
296:         OB_DEFAULT_ENTRY_BID_LEVELS,
297:         OB_DEFAULT_FILTER_ENABLED,
298:         OB_DEFAULT_MAX_SPREAD_PCT,
299:         OB_DEFAULT_MIN_BID_ASK_RATIO,
300:         OB_STRATEGY_PREFIXES,
301:     )
302:     ob_fields: List[FieldDef] = []
303:     _ob_lbl = {
304:         "SCALP": "스캘핑",
305:         "TAIL": "꼬리잡기",
306:         "MOMENTUM": "모멘텀",
307:         "BREAKOUT": "돌파",
308:     }
309:     for pfx in OB_STRATEGY_PREFIXES:
310:         lbl = _ob_lbl.get(pfx, pfx)
311:         ob_fields.extend([
312:             _f(
313:                 f"{pfx}_ORDERBOOK_FILTER_ENABLED",
314:                 f"{lbl} 호가필터 ON",
315:                 "bool",
316:                 default=OB_DEFAULT_FILTER_ENABLED,
317:                 hint="ON=스프레드·잔량비·얇은호가·매도벽으로 매수 차단 · OFF=저장만",
318:             ),
319:             _f(
320:                 f"{pfx}_ORDERBOOK_MAX_SPREAD_PCT",
321:                 f"{lbl} 스프레드상한(%)",
322:                 "float",
323:                 default=OB_DEFAULT_MAX_SPREAD_PCT,
324:                 hint="0.45=0.45% · 그리드 max_spread_pct 앵커",
325:             ),
326:             _f(
327:                 f"{pfx}_ORDERBOOK_MIN_BID_ASK_RATIO",
328:                 f"{lbl} 매수/매도잔량비 하한",
329:                 "float",
330:                 default=OB_DEFAULT_MIN_BID_ASK_RATIO,
331:                 hint="그리드 min_bid_ask_ratio",
332:             ),
333:             _f(
334:                 f"{pfx}_ORDERBOOK_ENTRY_ASK_MAX_MULT",
335:                 f"{lbl} 매도벽 허용배수",
336:                 "float",
337:                 default=OB_DEFAULT_ENTRY_ASK_MAX_MULT,
338:                 hint="필요수량×N · 그리드 ask_max_mult",
339:             ),
340:             _f(
341:                 f"{pfx}_ORDERBOOK_ENTRY_BID_DEPTH_MULT",
342:                 f"{lbl} 매수호가깊이 배수",
343:                 "float",
344:                 default=OB_DEFAULT_ENTRY_BID_DEPTH_MULT,
345:                 hint="얇은호가 탈락 · 필요수량×N",
346:             ),
347:             _f(
348:                 f"{pfx}_ORDERBOOK_ENTRY_BID_LEVELS",
349:                 f"{lbl} 호가단계(N호가)",
350:                 "int",
351:                 default=OB_DEFAULT_ENTRY_BID_LEVELS,
352:             ),
353:         ])
354:         if pfx == "BREAKOUT":
355:             ob_fields.append(
356:                 _f(
357:                     "BREAKOUT_ORDERBOOK_ASK_WALL_MAX_QTY",
358:                     "돌파 매도벽 상한(주)",
359:                     "int",
360:                     default=OB_DEFAULT_ASK_WALL_MAX_QTY,
361:                     hint="그리드 ask_wall_max_qty",
362:                 ),
363:             )
364:     groups.append({
365:         "id": "orderbook_strategy",
366:         "title": "호가필터 — 전략별 (수치)",
367:         "hint": (
368:             "글로벌 ORDERBOOK_MAX_SPREAD_PCT 등 폐기 · "
369:             "파람서치 apply-best ↔ *_ORDERBOOK_* 정합"
370:         ),
371:         "fields": ob_fields,
372:     })
373:
374:     groups.append({
375:         "id": "strategy_switch",
376:         "title": "전략 ON/OFF",
377:         "hint": (
378:             "config_{strategy} · STRATEGY_*_ENABLED 는 다음 루프부터 신규매수 중단/재개 "
379:             "(보유 청산은 유지 · WS 구독 해제는 안 함). "
380:             "기동 시 OFF 였던 전략을 켜려면 봇 재시작. "
381:             "해외 WS 소켓은 OVERSEAS_WS_ENABLED(기동 시) · permanent US 구독과 별개."
382:         ),
383:         "fields": [
384:             _f(
385:                 "STRATEGY_US_MOMENTUM_ENABLED",
386:                 "해외 모멘텀",
387:                 "bool",
388:                 default=True,
389:                 hint="config_us_momentum · permanent US 유니버스 · 소켓 해제 없음",
390:             ),
391:             _f(
392:                 "OVERSEAS_WS_ENABLED",
393:                 "해외 WS(HDFSCNT0)",
394:                 "bool",
395:                 default=True,
396:                 hint="기동 시만 · false=해외 틱 소켓 미기동 · 전략 ON/OFF 와 별개 · 변경 후 재시작",
397:             ),
398:             *[
399:                 _f(
400:                     f"STRATEGY_{sid}_ENABLED",
401:                     LIVE_STRATEGY_LABELS.get(sid, sid),
402:                     "bool",
403:                     default=bool(STRATEGY_ENABLED_DEFAULTS.get(sid, False)),
404:                     hint=f"config_{sid.lower()}",
405:                 )
406:                 for sid in LIVE_STRATEGY_SWITCH_IDS
407:                 if sid != "US_MOMENTUM"
408:             ],
409:         ],
410:     })
411:
412:     # 유니버스 소스 — ranking | condition | kiwoom_condition | ls_condition
413:     _univ_choices = [
414:         {"value": "kiwoom_condition", "label": "키움 조건(WS)"},
415:         {"value": "ls_condition", "label": "LS 조건(AFR)"},
416:         {"value": "condition", "label": "한투 조건(REST)"},
417:         {"value": "ranking", "label": "거래량순위"},
418:     ]
419:     univ_fields: List[FieldDef] = []
420:     for sid in LIVE_STRATEGY_IDS:
421:         lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
422:         univ_fields.append(
423:             _f(
424:                 f"{sid}_UNIVERSE_SOURCE",
425:                 f"{lbl} 유니버스",
426:                 "select",
427:                 default="kiwoom_condition",
428:                 choices=_univ_choices,
429:                 hint=(
430:                     "ls_condition=LS 동명 AFR · 시세는 키움/한투 유지 · "
431:                     "매니저 최초 기동은 봇 재시작 필요할 수 있음 · "
432:                     "키움으로 자동 폴백 안 함"
433:                 ),
434:             ),
435:         )
436:     groups.append({
437:         "id": "universe_source",
438:         "title": "유니버스 소스",
439:         "hint": "{SID}_UNIVERSE_SOURCE · 기본 키움 · LS는 opt-in",
440:         "fields": univ_fields,
441:     })
442:     groups.append({
443:         "id": "kiwoom_condition_config",
444:         "title": "키움 조건검색 (안정화·회복)",
445:         "hint": "KIWOOM_CNSR* · 유니버스 0종목 공백(Blind Spot) 차단 및 3초 고정 회복",
446:         "fields": [
447:             _f("KIWOOM_CNSRCLR_BEFORE_REQ", "재등록 전 선행 해제(CNSRCLR)", "bool", default=True,
448:                hint="Bye 후 유령 등록(900003) 방지용 선행 클리어"),
449:             _f("KIWOOM_CNSRCLR_SETTLE_SEC", "CNSRCLR 해제 응답 ACK 대기(초)", "float", default=2.0,
450:                hint="해제 응답(rc=0) 완료 대기 최대 타임아웃 (조기 ACK 수신 시 즉시 통과)"),
451:             _f("KIWOOM_CNSRREQ_RETRY_SEC", "미응답/900003 고정 재시도 주기(초)", "float", default=3.0,
452:                hint="지수 백오프 대신 3초 고정 주기로 빠른 회복 시도"),
453:             _f("KIWOOM_CNSRREQ_MAX_RETRIES", "최대 재시도 상한", "int", default=30,
454:                hint="30회(약 90초) 동안 RAM 후보를 보존하며 지속 회복 시도"),
455:             _f("KIWOOM_CNSRCLR_GAP_MIN_SEC", "CNSRCLR 연속 발송 최소 간격(초)", "float", default=0.3),
456:             _f("KIWOOM_CNSRCLR_GAP_MAX_SEC", "CNSRCLR 연속 발송 최대 간격(초)", "float", default=0.6),
457:             _f("KIWOOM_CNSRREQ_GAP_MIN_SEC", "CNSRREQ 연속 발송 최소 간격(초)", "float", default=0.8),
458:         ],
459:     })
460:     groups.append({
461:         "id": "ls_condition_config",
462:         "title": "LS 조건검색 (안정화·Diff 보정)",
463:         "hint": "LS_T1859* · 매매 전용이 아닌 조건·시세 전용 이점을 극대화한 1분 주기 0.15초 소생술",
464:         "fields": [
465:             _f("LS_T1859_STALE_RESYNC_SEC", "AFR 침묵 시 소켓 재동기화 주기(초)", "int", default=60,
466:                hint="기본 60초(1분). 매매 주문을 처리하지 않으므로 429 차단 위험 0%! 하루 총 눈감는 시간 약 58초 동안 Delta Diff 1:1 보정"),
467:             _f("LS_T1859_EMPTY_RETRY_SEC", "RAM 0종목 시 t1859 재시드 주기(초)", "int", default=1,
468:                hint="기동 초기 0종목 시 1초마다 재시드 (영구 0종목 공백 록인 방지)"),
469:             _f("LS_T1859_ALLOW_SHRINK", "t1859 축소 전체교체 허용", "bool", default=False,
470:                hint="기본 false (장중 1종목 오류 응답이 20종목 덮어 쓰는 자살골 사고 차단)"),
471:             _f("LS_CONDITION_TR_GAP_SEC", "t1859 REST 호출 최소 간격(초)", "float", default=1.1,
472:                hint="LS 증권 공식 1초 1건 상한 보호 쿨다운"),
473:         ],
474:     })
475:
476:     # 전략별 운용한도
477:     budget_fields: List[FieldDef] = []
478:     for sid in LIVE_STRATEGY_IDS:
479:         lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
480:         budget_fields.extend([
481:             _f(_sid_key(sid, "TOTAL_BUDGET_KRW"), f"{lbl} 총 한도(원)", "int"),
482:             _f(_sid_key(sid, "SLOT_MONEY"), f"{lbl} 슬롯(원)", "int"),
483:             _f(_sid_key(sid, "MAX_STOCKS"), f"{lbl} 동시 종목", "int"),
484:         ])
485:     groups.append({
486:         "id": "strategy_budget",
487:         "title": "전략별 운용한도",
488:         "hint": "config_{strategy}",
489:         "fields": budget_fields,
490:     })
491:
492:     # 전략별 일일 익절 서브
493:     dp_fields: List[FieldDef] = []
494:     for sid in LIVE_STRATEGY_IDS:
495:         lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
496:         dp_fields.extend([
497:             _f(
498:                 _sid_key(sid, "DAILY_PROFIT_TARGET_ENABLED"),
499:                 f"{lbl} 손익 감시 켜기",
500:                 "bool",
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-07T10:48:16Z
Completed At: 2026-08-07T10:48:16Z
File Path: `file:///home/hoon/kis_bot/kis_trader/web/live_config_schema.py`
Total Lines: 1111
Total Bytes: 60859
Showing lines 500 to 700
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.
500:                 "bool",
501:                 hint="OFF = 해당 전략 일일익절 비활성 (매수 차단 없음)",
502:             ),
503:             _f(
504:                 _sid_key(sid, "DAILY_PROFIT_TARGET_KRW"),
505:                 f"{lbl} 목표(원)",
506:                 "int",
507:             ),
508:             _f(
509:                 _sid_key(sid, "DAILY_PROFIT_TARGET_PCT"),
510:                 f"{lbl} 목표(%)",
511:                 "float",
512:                 hint="퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용",
513:             ),
514:             _f(
515:                 _sid_key(sid, "DAILY_PROFIT_MODE"),
516:                 f"{lbl} 익절방식",
517:                 "text",
518:                 hint="비우면 마스터 상속 · fixed/trailing/both",
519:             ),
520:             _f(
521:                 _sid_key(sid, "DAILY_PROFIT_TRAIL_TIERS"),
522:                 f"{lbl} 다단 트레일",
523:                 "text",
524:                 hint="수익원:컷%,… · 비우면 마스터 상속 · 예: 30000:50,100000:35,300000:25",
525:             ),
526:             _f(
527:                 _sid_key(sid, "DAILY_PROFIT_TRAIL_DROP_PCT"),
528:                 f"{lbl} 단일 트레일 되돌림(%)",
529:                 "float",
530:                 hint="다단 비었을 때만 · 고점 대비 % · 비우면 마스터 상속 · 0=미사용",
531:             ),
532:             _f(
533:                 _sid_key(sid, "DAILY_PROFIT_TRAIL_ARM_KRW"),
534:                 f"{lbl} 트레일 발동수익(원)",
535:                 "int",
536:                 hint="이 이상 벌어야 트레일 감시 · 비우면 마스터 상속",
537:             ),
538:             _f(
539:                 _sid_key(sid, "DAILY_PROFIT_HALT_NEW_BUYS"),
540:                 f"{lbl} 신규매수 수동 중단",
541:                 "bool",
542:                 default=False,
543:                 hint="목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상",
544:             ),
545:             _f(
546:                 _sid_key(sid, "DAILY_PROFIT_RISK_BUDGET_ENABLED"),
547:                 f"{lbl} 리스크버짓(B)",
548:                 "bool",
549:                 default=False,
550:                 hint="ON=일일익절 hit 후 보유최악손절합>cushion 이면 전량정리 · 기본 OFF · 마스터 없음",
551:             ),
552:             _f(
553:                 _sid_key(sid, "DAILY_PROFIT_RISK_BUDGET_COOLDOWN_SEC"),
554:                 f"{lbl} 리스크버짓 쿨다운(초)",
555:                 "int",
556:                 default=300,
557:                 hint="같은 날 재평가 최소 간격 · 0=당일 1회만",
558:             ),
559:         ])
560:     groups.append({
561:         "id": "daily_profit_strategy",
562:         "title": "일일 익절 — 전략별 (서브)",
563:         "hint": (
564:             "전략별 손익만 따로 감시. 비어 있으면 마스터 값 상속. "
565:             "손익 감시 ON이면 목표 달성 시 해당 전략 신규매수 자동 차단. "
566:             "리스크버짓(B)은 전략별만(기본 OFF)."
567:         ),
568:         "fields": dp_fields,
569:     })
570:
571:     # 전략별 휩쏘 ON/OFF + 꼬리 초·% (Optuna TPE 축과 동일 키)
572:     ws_fields: List[FieldDef] = []
573:     for sid in LIVE_STRATEGY_IDS:
574:         if sid == "SCALP":
575:             continue
576:         lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
577:         pfx = "TAIL" if sid == "SHORT" else sid
578:         ws_fields.append(
579:             _f(f"{pfx}_WHIPSAW_FILTER_ENABLED", f"{lbl} 휩쏘 필터", "bool"),
580:         )
581:     ws_fields.extend([
582:         _f("TAIL_WHIPSAW_SUBBAR_SEC", "꼬리 휩쏘 미니봉(초)", "int", default=30,
583:            hint="비우면 글로벌 WHIPSAW_SUBBAR_SEC · Optuna 꼬리 TPE 축"),
584:         _f("TAIL_WHIPSAW_LOOKBACK_SEC", "꼬리 휩쏘 룩백(초)", "int", default=90,
585:            hint="비우면 글로벌 WHIPSAW_LOOKBACK_SEC"),
586:         _f("TAIL_WHIPSAW_DIP_PCT", "꼬리 휩쏘 하락폭(분율)", "float", default=0.003,
587:            hint="0.003=0.3% · 비우면 글로벌"),
588:         _f("TAIL_WHIPSAW_RECOVERY_TOL_PCT", "꼬리 휩쏘 회복허용(분율)", "float", default=0.001,
589:            hint="0.001=0.1% · 비우면 글로벌"),
590:     ])
591:     groups.append({
592:         "id": "whipsaw_strategy",
593:         "title": "휩쏘 — 전략별 ON/OFF · 꼬리 초/%",
594:         "hint": (
595:             "ON/OFF와 초·%는 별개. 꼬리 Optuna --mode tpe 가 이 축을 탐색. "
596:             "실매 현재값(enabled=false, 30초, 90초, 0.003, 0.001)이 그리드에 포함됨."
597:         ),
598:         "fields": ws_fields,
599:     })
600:
601:     groups.append({
602:         "id": "execution_fill",
603:         "title": "체결 검증 (실전·모의 훈련)",
604:         "hint": "실전은 항상 fill 확인. 모의는 STRICT_FILL_VERIFY=true 시 동일",
605:         "fields": [
606:             _f("STRICT_FILL_VERIFY", "모의 엄격 체결 검증", "bool", default=False,
607:                hint="모의 실매매만 영향 · ON=체결 API 필수(모의 API 한계로 매수 0건 가능) · 실전은 항상 엄격"),
608:             _f("BUY_DEDUP_PENDING", "매수 미체결 중복주문 방지", "bool", default=True,
609:                hint="동일 전략·종목 PENDING_FILL 있으면 재주문 스킵"),
610:             _f("BACKTEST_SLIP_PCT", "백테 체결 슬리피지(편도 %)", "float", default=0.0,
611:                hint="STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%"),
612:             _f("BACKTEST_VOL_FILL_CAP_PCT", "백테 체결량 상한(진입봉 거래량×%)", "float", default=0.0,
613:                hint="STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사"),
614:             _f("TAIL_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 꼬리 OHLC 폴백 (정합위험·금지)", "bool", default=False,
615:                danger=True,
616:                hint="절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF"),
617:             _f("TAIL_BACKTEST_USE_TICK_EXIT", "꼬리 틱 청산", "bool", default=True,
618:                hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
619:             _f("TAIL_BACKTEST_POLL_MS", "꼬리 틱청산 폴링(ms)", "int", default=100,
620:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
621:             _f("MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 모멘텀 OHLC 폴백 (정합위험·금지)", "bool", default=False,
622:                danger=True,
623:                hint="절대금지 — 틱 청산 ON 시 엔진 무시 · Optuna 강제 OFF"),
624:             _f("MOMENTUM_BACKTEST_POLL_MS", "모멘텀 틱청산 폴링(ms)", "int", default=100,
625:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 틱 사이 청산 검사 간격 · 하한 50ms"),
626:             _f("BREAKOUT_BACKTEST_USE_TICK_EXIT", "돌파 틱 청산", "bool", default=True,
627:                hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
628:             _f("BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
629:                danger=True,
630:                hint="절대금지 — 틱 진입 ON 시 봉 high 폴백 안 함"),
631:             _f("BREAKOUT_BACKTEST_POLL_MS", "돌파 틱청산 폴링(ms)", "int", default=100,
632:                hint="실매 폴링 정합 · 하한 50ms"),
633:             _f("SCALP_BACKTEST_USE_TICK_EXIT", "스캘핑 틱 청산", "bool", default=True,
634:                hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
635:             _f("SCALP_BACKTEST_USE_TICK_ENTRY", "스캘핑 틱 진입", "bool", default=True,
636:                hint="ON=예약 체결 시 해당 분 첫 틱가 · OFF=분봉 시가"),
637:             _f("SCALP_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 스캘핑 OHLC 폴백 (정합위험·금지)", "bool", default=False,
638:                danger=True,
639:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
640:             _f("SCALP_BACKTEST_POLL_MS", "스캘핑 틱청산 폴링(ms)", "int", default=100,
641:                hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
642:             _f("RANGE_BREAK_BACKTEST_USE_TICK_EXIT", "박스돌파 틱 청산", "bool", default=True,
643:                hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
644:             _f("RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 박스돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
645:                danger=True,
646:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
647:             _f("RANGE_BREAK_BACKTEST_POLL_MS", "박스돌파 틱청산 폴링(ms)", "int", default=100,
648:                hint="실매 폴링 정합 · 하한 50ms"),
649:             _f("DBBAND_BACKTEST_USE_TICK_EXIT", "더블BB 틱 청산", "bool", default=True,
650:                hint="ON=ws_ticks 시간순 청산 · OFF=봉 OHLC 1회"),
651:             _f("DBBAND_BACKTEST_TICK_FALLBACK_OHLC", "⚠ 더블BB OHLC 폴백 (정합위험·금지)", "bool", default=False,
652:                danger=True,
653:                hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
654:             _f("DBBAND_BACKTEST_POLL_MS", "더블BB 틱청산 폴링(ms)", "int", default=100,
655:                hint="실매 폴링 정합 · 하한 50ms"),
656:             _f("TAIL_PARAM_SEARCH_MIN_START", "꼬리 파라서치 최소 시작일", "str", default="2026-07-07",
657:                hint="조건식 변경일 이후만 탐색 (YYYY-MM-DD) · CLI --start 와 max 적용"),
658:             _f("USE_MARKET_IOC", "매수 시장가 IOC", "bool", default=True,
659:                hint="실전 매수 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정"),
660:             _f("USE_MARKET_IOC_SELL", "매도 시장가 IOC", "bool", default=True,
661:                hint="실전 매도 ORD_DVSN=13(IOC) · OFF=01 · 모의는 01 고정 · 거절 많으면 OFF"),
662:             _f("ORDER_FILL_WAIT_SEC", "시장가 체결 대기(초)", "int", default=2),
663:             _f("DUPLICATE_ORDER_FILL_RECOVERY_ENABLED", "주문DB중복 체결복구", "bool", default=True,
664:                hint="insert 실패(주문DB중복) 시 inquire-daily-ccld 1회 → active_trades 복구 · 실패 시에만 REST"),
665:             _f("DUPLICATE_ORDER_RECOVERY_WAIT_SEC", "중복복구 체결대기(초)", "int", default=2,
666:                hint="주문DB중복 복구 전용 · 미설정 시 ORDER_FILL_WAIT_SEC 사용"),
667:             _f("LIMIT_ORDER_FILL_WAIT_SEC", "지정가 체결 대기(초)", "int", default=1),
668:             _f("PENDING_FILL_POLL_INTERVAL_SEC", "미체결 재조회 주기(초)", "int", default=10),
669:             _f("PENDING_FILL_POLL_SEC", "재조회 1회 대기(초)", "int", default=1),
670:             _f("PENDING_POLL_BATCH_FETCH", "미체결 체결 일괄조회", "bool", default=True,
671:                hint="실매 heartbeat 전용 · ON=poll 1회당 inquire-daily-ccld 1건(미체결 N건) · OFF=건별 조회 · 백테 무관"),
672:             _f("PENDING_BUY_MAX_AGE_SEC", "매수 미체결 만료(초)", "int", default=120),
673:             _f("PENDING_SELL_MAX_AGE_SEC", "익절 매도 미체결 만료(초)", "int", default=60),
674:             _f("PENDING_SELL_STOP_MAX_AGE_SEC", "손절 매도 미체결 만료(초)", "int", default=15),
675:             _f("SELL_PENDING_REORDER_ON_EXPIRE", "손절 만료 후 즉시 재매도", "bool", default=True),
676:             _f("AUTO_CANCEL_PARTIAL_BUY_REMAINDER", "부분체결 잔량 자동취소", "bool", default=True),
677:             _f(
678:                 "SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY",
679:                 "익절지정가→시장가 전 취소",
680:                 "bool",
681:                 default=True,
682:                 hint=(
683:                     "ON=지정가 미확인/부분체결 시 잔여 취소 후 ODNO 재조회, "
684:                     "취소실패·미확정이면 시장가 금지(PENDING) · "
685:                     "OFF=레거시 즉시 시장가(이중매도 위험) · 전전략 OrderManager 공통"
686:                 ),
687:             ),
688:             _f(
689:                 "SELL_LIMIT_RECHECK_WAIT_SEC",
690:                 "지정가 취소 후 재조회(초)",
691:                 "int",
692:                 default=1,
693:                 hint="SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY=ON 일 때 ODNO 재조회 대기",
694:             ),
695:             _f(
696:                 "SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM",
697:                 "취소실패+잔고0→매도확정",
698:                 "bool",
699:                 default=True,
700:                 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.


# 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>


이제 전체 구조를 파악했습니다. 회원님의 실제 운영 방식 기준으로 `ws_trigger_global` 그룹을 대폭 정리하겠습니다. 핵심 정리 방향:

1. **WS 공통 그룹** → 섹션 분리 + 현행 실시간 RAM 기반과 맞지 않는 `interval` 관련 설정 삭제/단순화
2. **휩쏘** 관련: 실시간 WS 매매에선 의미없는 "초 딜레이" 용어 수정
3. **라벨 초등생 수준으로** 명확하게

회원님 운영 방식 기준으로 WS 공통 설정 그룹을 정리했습니다. 실시간 RAM 기반이므로 interval 모드 관련 설정 삭제, 용어 명확화, WS_PROVIDER/KIS 관련 스위치를 상단으로 통합했습니다.

Instruction: ws_trigger_global 그룹을 완전히 재구성: 불필요 항목 제거, 라벨 초등생 수준으로 명확화, 섹션 분리

        {
            "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": "⚡ 매수 판단 필터 설정 (실시간 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",
                    "💾 매수 판단 결과 DB 저장 (마스터 스위치)",
                    "bool",
                    default=True,
                    hint=(
                        "ON = 매수 검토할 때 호가·프로그램 스냅샷을 DB에 기록 (분석·디버깅용) | "
                        "OFF = 아래 모든 저장 비활성 (DB 용량 아낄 때)"
                    ),
                ),
                _f(
                    "WS_ORDERBOOK_COLLECT_ENABLED",
                    "📸 매수 검토 순간 호가 1장 저장",
                    "bool",
                    default=True,
                    hint=(
                        "ON = 매수를 검토하는 바로 그 순간 호가 스냅샷 1장을 DB에 저장 | "
                        "→ 나중에 '왜 이 종목을 샀는가/안 샀는가' 확인 가능"
                    ),
                ),
                _f(
                    "WS_ORDERBOOK_SAVE_ENABLED",
                    "📼 호가 연속 시계열 저장 (파람서치용)",
                    "bool",
                    default=False,
                    hint=(
                        "ON = 구독 중인 종목의 호가를 틱마다 계속 DB에 쌓음 | "
                        "→ 파라미터 서치에서 호가 축을 탐색할 때 필요 | "
                        "평소엔 OFF 권장 (DB 용량 많이 차지함), 변경 후 봇 재시작 필요"
                    ),
                ),
                _f(
                    "WS_ORDERBOOK_TICK_MAX_AGE_SEC",
                    "⏱ 호가 유효 시간(초)",
                    "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",
                    "🔗 유니버스 히스토리 교집합 필터",
                    "bool",
                    default=False,
                    hint=(
                        "OFF(기본권장) = 실시간 후보 그대로 사용 | "
                        "ON = 실시간 후보와 과거 히스토리 스냅이 겹치는 종목만 매수. "
                        "히스토리가 늦게 올라오면 매수 기회 놓칠 수 있음"
                    ),
                ),
                _f(
                    "OPS_ALERT_HISTORY_OPEN_GRACE_SEC",
                    "🕐 개장 직후 히스토리 0건 허용 시간(초)",
                    "int",
                    default=180,
                    hint=(
                        "개장 후 N초 안에는 히스토리가 0건이어도 알람 안 보냄 | "
                        "기본 180초(3분) = 개장 3분까지는 정상으로 취급"
                    ),
                ),
                _f(
                    "OPS_ALERT_WS_DOWN_HOLD_SEC",
                    "📡 소켓 끊김 알람 기준 시간(초)",
                    "int",
                    default=60,
                    hint=(
                        "키움/LS 소켓이 이 시간(초) 이상 끊겨 있을 때만 위험 알람 발송 | "
                        "기본 60초 = 1분 이상 끊겨야 알람 (순간 재연결은 무시)"
                    ),
                ),
            ],
        },
    ]

        {
            "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)"),
                _f(
                    "WS_TRIGGER_EVAL_SAVE_ENABLED",
                    "TRIGGER 판정 DB 저장(마스터)",
                    "bool",
                    default=True,
                    hint="OFF면 아래 COLLECT(판정 스냅) 전부 안 씀 · SAVE(시계열)와 무관",
                ),
                _f(
                    "WS_ORDERBOOK_COLLECT_ENABLED",
                    "호가 판정스냅(FILTER_EVAL) — 매수체크 순간 1장",
                    "bool",
                    default=True,
                    hint="≠ 연속시계열. TRIGGER 판정 때만 ws_orderbook source=filter_eval · 필터 OFF여도 저장 가능",
                ),
                _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+아래 간격 스로틀 · 봇 재시작",
                ),
                _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 일 때만 · 종목당 최소 저장 간격 · 봇 재시작 필요",
                ),
                _f(
                    "LIVE_UNIVERSE_SLOT_ALIGN",
                    "실매 유니버스 슬롯필터(history∩후보)",
                    "bool",
                    default=False,
                    hint="ON이면 실시간 후보를 history 스냅과 교집합 — history 지연 시 탈락 위험 · 기본 OFF",
                ),
                _f(
                    "OPS_ALERT_HISTORY_OPEN_GRACE_SEC",
                    "history_stale 개장유예(초)",
                    "int",
                    default=180,
                    hint="개장 직후 N초는 history 0건 CRITICAL 스킵",
                ),
                _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),
            ],
        },
    ]

파일 편집 (운영설정 그룹 정리)