#!/usr/bin/env python3 """ 전략 공통 리스크·슬롯 env_config 스냅샷 INSERT. - 1회 매수금(슬롯): 300만 원 통일 - 1회 최대 손실(금액컷): 20만 원 통일 - SHORT(꼬리): ATR 익절 타이트 + 어깨 0.5%/0.3% - UPDOW 총 운용 한도: 300만 원 실행: cd ~/kis_bot && python3 -m kis_trader.scripts.apply_unified_risk_env 저장 위치 (2026-05 분리): - 공통(API·MM·인프라): env_config - 전략별: config_scalp / config_short / config_momentum / config_breakout / config_updow 최초 1회: python3 -m kis_trader.scripts.migrate_split_env_config """ from __future__ import annotations import sys from pathlib import Path _ROOT = Path(__file__).resolve().parents[2] if str(_ROOT) not in sys.path: sys.path.insert(0, str(_ROOT)) from database import TradeDB # noqa: E402 PATCH = { # ── 슬롯 300만 통일 ── "SLOT_MONEY_DEFAULT": "3000000", "MOMENTUM_SLOT_MONEY": "3000000", "BREAKOUT_SLOT_MONEY": "3000000", "UPDOW_SLOT_MONEY": "3000000", # UPDOW: 이 금액 안에서만 동시 보유 (하락매수 총 한도) "UPDOW_MAX_BUY_AMOUNT": "3000000", "MAX_BUY_AMOUNT_PER_STOCK": "3000000", # ── 금액 손실컷 20만 통일 (청산 엔진용, 포지션 축소 공식과 분리) ── "MAX_LOSS_PER_TRADE_KRW": "200000", "SCALP_MAX_LOSS_PER_TRADE_KRW": "200000", "MOMENTUM_MAX_LOSS_PER_TRADE_KRW": "200000", "BREAKOUT_MAX_LOSS_PER_TRADE_KRW": "200000", "UPDOW_MAX_LOSS_PER_TRADE_KRW": "200000", # ── SHORT: 작은 익절·어깨 우선 / ATR 익·손 상한 타이트 (0.2%/일 프로필) ── "TARGET_ATR_MULTIPLIER_TAIL": "2.0", "STOP_ATR_MULTIPLIER_TAIL": "1.5", "TAIL_ATR_TP_MAX_PCT": "1.0", "TAIL_ATR_TP_MIN_PCT": "0.3", "TAIL_ATR_SL_MAX_PCT": "1.0", "TAIL_ATR_SL_MIN_PCT": "0.5", "SHOULDER_MIN_HIGH_PCT": "0.003", "SHOULDER_CUT_PCT": "0.002", # ── SHORT 진입 회복률 (HTS 조건검색 후보 → TRIGGER 완화) ── "MIN_RECOVERY_RATIO_SHORT": "0.45", "MAX_RECOVERY_RATIO_3M": "0.9", # ── 익절 호가 지정가 (손절은 시장가 유지) ── "SELL_USE_ORDERBOOK_ON_PROFIT": "true", "SELL_ORDERBOOK_BID_LEVELS": "2", "SELL_ORDERBOOK_DEPTH_MULT": "1.5", } def main() -> int: db = TradeDB() latest = db.get_latest_env() base = dict((latest or {}).get("snapshot") or {}) if latest and latest.get("id"): print(f"기존 env_config id={latest['id']} 복사 후 패치") merged = {**base, **PATCH} eid = db.insert_env_snapshot(merged) db.close() if not eid: print("❌ insert_env_snapshot 실패") return 1 print(f"✅ env_config 저장 완료 (id={eid})") for k, v in PATCH.items(): print(f" {k} = {v}") return 0 if __name__ == "__main__": raise SystemExit(main())