#!/usr/bin/env python3 """ 환경변수 DB 업데이트 스크립트 (간단 버전) - 딕셔너리로 직접 값을 넣어서 업데이트 """ import sys from pathlib import Path SCRIPT_DIR = Path(__file__).resolve().parent sys.path.insert(0, str(SCRIPT_DIR)) from database import TradeDB def update_env(updates): """ 환경변수 업데이트 Args: updates: 업데이트할 환경변수 딕셔너리 예: { "KIS_APP_KEY": "your_app_key", "KIS_APP_SECRET": "your_app_secret", "MM_BOT_TOKEN_": "your_token", ... } """ db_path = SCRIPT_DIR / "quant_bot.db" db = TradeDB(db_path=str(db_path)) # 기존 최신 설정 불러오기 latest = db.get_latest_env() if latest and latest.get("snapshot"): current = latest["snapshot"] print(f"📋 기존 설정 불러옴 (ID: {latest['id']})") else: current = {} print("⚠️ 기존 설정 없음 - 새로 생성") # 기존 값과 병합 new_snapshot = {**current, **updates} # 새 스냅샷 저장 env_id = db.insert_env_snapshot(new_snapshot) if env_id: print(f"✅ 환경변수 저장 완료! (새 스냅샷 ID: {env_id})") print(f" 업데이트된 키: {', '.join(updates.keys())}") else: print("❌ 저장 실패!") db.close() return env_id if __name__ == "__main__": # 여기에 업데이트할 값들을 딕셔너리로 넣으세요 my_updates = { # 한투 API 설정 #"KIS_MOCK": "true", #"KIS_APP_KEY_REAL": "PSUT2l4CO94DjrwDa2EAnEl639YXnWHdbbkN", # 여기에 앱키 입력 #"KIS_APP_SECRET_REAL": "2SkPBKrztpBomcR+pYNEBuVa5/iSqYLQxsDn/YqJuQ0dULp/GqTAePhe4czJHuf/1XBUd18KDV6ZTrmxfI8eTiCfIEaO6jMKSq0u+CoUkHTrO9TfliYtxsNbl43jL+rokLB54V2VmHrlqM4WCF+54bMWhzzSE7z3OOl67V9yWKCWIoTrcYg=", #"KIS_APP_KEY_MOCK": "PSdfKtsMihgC9tLiUr2XISscuR3fHxl6kvmV", # 여기에 앱키 입력` # 리스크매니저: 종목당 원화 상한(50만) + 종목당 최대 비중(1.5%) # "SLOT_BASE_AMOUNT_CAP": "500000", # "MAX_POSITION_PCT": "0.05", #"KIS_APP_SECRET_MOCK": "Ip+XZrZcoz11thgDD40XS8i6R1AalYkKFZwg2w8+ZMulVKN8rJVXiqGONxc4EYxw1S3TgOcx7fSldDc6EGq63bprfbgHwKfalse29Zm "USE_MARKET_IOC": "false",ovmza9+Ylqd8/EtjFGNmhQHWocyTAm8kdp5IG6tFtc=", # 여기에 앱시크릿 입력 # "FORCE_BUY_TEST": "false", # "USE_MARKET_IOC": "false", # "KIS_ACCOUNT_NO_REAL": "44030801", # "KIS_ACCOUNT_NO_MOCK": "50166974", # "KIS_ACCOUNT_NO_MOCK": "44030801", # "KIS_ACCOUNT_NO_MOCK": "50169256", # "KIS_ACCOUNT_CODE_REAL": "01", # "KIS_ACCOUNT_CODE_MOCK": "01", #"MM_BOT_TOKEN_": "5o4bfsqo97dedyq7599wz6joie", #"TAKE_PROFIT_PCT_LONG": "0.010", #"MIN_DROP_RATE": "0.015", #"MIN_RECOVERY_RATIO": 0.35, #"MIN_DROP_RATE": 0.02 # "TAIL_RATIO_MIN": "0.85", #"TAIL_PCT_MIN": "0.002" # "TAKE_PROFIT_PCT":"0.012", # "SHOULDER_CUT_PCT":"0.009", # "MIN_RECOVERY_RATIO":"0.5", # "MIN_RECOVERY_RATIO_SHORT" : "0.10", # "MIN_DROP_RATE":"0.003", # "SHOULDER_CUT_PCT":"0.012", # "TAKE_PROFIT_PCT":"0.018", # "SHOULDER_MIN_HIGH_PCT":"0.2", # "MIN DROP_RATE":"0.015" # "STOP_LOSS_PCT":"0.007", # "MIN_DROP_RATE":"0.008", # "MIN_RECOVERY_RATIO_SHORT":"0.30", # "SHOULDER_MIN_HIGH_PCT":"0.2", # "MAX_LOSS_PER_TRADE_KRW":"150000", # # STOP_LOSS_PCT를 음수로 사용하면 '손실일 때만' 칼손절이 걸립니다. # # 예: -0.007 → 수익 구간(+0.x%)에서는 칼손절이 아니라 다른 익절/보호 로직이 우선 적용되고, # # 손실이 -0.7% 이하로 커졌을 때만 profit_pct <= STOP_LOSS_PCT 조건이 발동합니다. # "STOP_LOSS_PCT":"-0.007", # "TAIL_RATIO_MIN":"0.8", # "SHOULDER_CUT_PCT":"0.018", # # 작은수익보호 완화: 고점이 매수가 대비 1.2% 이상 올랐을 때만, # # 현재가가 매수가 대비 +0.05% 이하로 되밀리면 보호 매도. # # (이전 기본: 고점 +0.5% / 현재가 +0.15% → 너무 빨리 잘려 나가던 구간을 완화) # "QUICK_PROFIT_PROTECT_HOURS":"0.5", # "QUICK_PROFIT_MAX_RATIO":"1.012", # "QUICK_PROFIT_CURRENT_MIN":"1.0005" # "ANTHROPIC_API_KEY":"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" # "KIS_WS_URL_REAL":"ws://ops.koreainvestment.com:21000", # "KIS_WS_URL_MOCK":"ws://ops.koreainvestment.com:31000", # "KIS_WS_MOCK_ENABLED":"true", # "REENTRY_COOLDOWN_SEC":"300", # "SELL_FAILURE_BACKOFF_SEC":"1800", # "LONG_NEWS_ENABLED":"true", # "SCALP_ATR_UP_MULT": "2.0", # "SCALP_ATR_DOWN_MULT": "0.8", # "SCALP_ATR_DROP_MULT": "1.5", # ── 스캘핑봇 전용 ────────────────────────────────────────────── # "SCALP_RSI_OVERSOLD": "25.0", # 과매도 임계값 (기본 25) # "SCALP_RSI_OVERBOUGHT": "75.0", # 과매수 진입 금지 임계값 # "SCALP_CANDLE_TIMEFRAME": "1", # 봉 단위(분): 1 또는 3 권장 # "SCALP_MARKET_OPEN_WAIT_MIN": "5", # 장 시작 후 대기(분) # "SCALP_GAP_FILL_LIMIT": "100", # WS 재접속 후 갭보정 캔들 수 # "SCALP_MIN_VOLUME": "1000", # 봉당 최소 거래량 # "KIS_SCALP_MM_CHANNEL": "kis-scalping", # 스캘핑봇 MM 채널 # "SCALP_CANDLE_KEEP_DAYS": "3", # ws_candles 보존 일수 # ── 스캘핑 전용 손익절/낙폭 (꼬리잡기와 완전 분리) ────────────── # 1분봉 초단타: 손절-4%/익절+5%는 도달 불가 → 박리다매로 빠르게 끊어냄 # SCALP_STOP_LOSS_PCT : 손절 % (양수 입력, 기본 1.5%) # SCALP_TAKE_PROFIT_PCT: 익절 % (양수 입력, 기본 1.5%) # SCALP_MIN_DROP_RATE : 당일 낙폭 필터 % (기본 1.5%, 꼬리잡기 3%보다 완화) # "SCALP_STOP_LOSS_PCT": "0.015", # 1.5% 손절 # "SCALP_TAKE_PROFIT_PCT": "0.015", # 1.5% 익절 # "SCALP_MIN_DROP_RATE": "0.015", # 1.5% 낙폭 이상만 진입 # ── 단타봇(kis_short_ver2) 전용 ──────────────────────────────── # "USE_KELLY_FORMULA": "true", # 켈리 공식 사용 여부 # "KELLY_MULTIPLIER": "0.25", # 켈리 25% (보수적) # "USE_MARKET_IOC": "true", # 시장가 IOC 주문 # "KIS_PRICE_CACHE_TTL_SEC": "1.0", # 실시간 가격 캐시 유효기간(초) # "SHORT_GAP_FILL_LIMIT": "100", # 갭보정 분봉 캔들 수 # "MIN_HOLD_AFTER_BUY_SEC": "30.0", # 매수 직후 최소 보유(초) # "MIN_HOLD_HOURS": "24.0", # 최소 보유(시간) # "MAX_RECOVERY_RATIO_3M": "0.8", # 3개월 회복 80% 이하만 편입 # "CANDIDATE_LIST_TOP_N_LIGHT": "20", # 1차 경량 체크 상위 N개 # "SCAN_UNIVERSE_MAX_CODES": "150", # 유니버스 최대 종목 수 # "TAIL_CANDLE_LOOKBACK": "5", # 꼬리 패턴 인식 lookback 봉수 # ── 공통 자산/슬롯 ─────────────────────────────────────────────── # "TOTAL_DEPOSIT": "500000000", # 총 입금액 (원) → 누적손익% 계산에 사용 # "SLOT_MONEY_DEFAULT": "300000", # 슬롯당 기본 투자금 (원) # "ROUND_TRIP_COST_PCT": "0.003", # 왕복 수수료 0.3% # "POP_NET_PCT": "0.005", # 익절 보호 0.5% # "LOCK_NET_PCT": "0.010", # 잠금 수익 1.0% # ── mm_butler / AI ────────────────────────────────────────────── # "GEMINI_MODEL_ID": "gemini-2.5-flash", # Gemini 모델 ID # "MM_BUTLER_POLL_SEC": "15", # MM 폴링 주기(초) # "AI_SOURCE_MAX_CHARS": "120000", # AI 입력 최대 문자 수 # ── 유니버스 스캐너 ───────────────────────────────────────────── # "UPDATE_UNIVERSE_TOP_N": "20", # 저장할 상위 N개 # "UPDATE_UNIVERSE_MIN_SCORE": "4.0", # 최소 강도 점수 # "SCAN_INTERVAL_SEC": "300", # 스캔 주기(초) # ── 수수료·거래세 (전략 공통) ──────────────────────────────────── # 위탁수수료: 매수·매도 각각 0.015% (KIS 온라인 기본) # 증권거래세: 2025년 기준 코스피·코스닥 공통 0.18% (매도 시만 부과) # 왕복 총비용 = 0.015%(매수) + 0.015%(매도) + 0.18%(거래세) = 약 0.21% "FEE_RATE_PCT": "0.015", "SELL_TAX_RATE_PCT": "0.18", # ── 스캘핑 본절 방어 ───────────────────────────────────────────── # 트레일링 발동 최소 수익률(%): 고점이 매수가 대비 이만큼 올라야 트레일링 활성화 # 수수료(~0.21%) + 마진(0.2%) + 트레일링폭(0.8%) = 최소 1.2% 이상 권장 "SCALP_TRAIL_TRIGGER_PCT": "1.5", # 본절사수 시 최소 순이익(%): 수수료+세금 위에 추가 확보 (0이면 본절, 0.2면 +0.2%) "SCALP_MIN_PROFIT_PCT": "0.2", # 스캘핑 전용 재진입 쿨다운(초): 매도 후 같은 종목 N초 동안 재매수 차단 (600=10분, 백테스트 cooldown_min과 동일하게) "SCALP_COOLDOWN_SEC": "600", # 키움증권 REST API 키 — 실전/모의 분리 (KIS_MOCK 설정에 따라 자동 선택) "KIWOOM_APP_KEY_REAL": "2HX8cA7AkrZsF7zBrMQXbFASvkKOkHtxh4-eia56hjo", "KIWOOM_APP_SECRET_REAL": "XaNENlYjQrwhT18h-EwKGonq-R4PpW-sT7s_-F9q3Nk", # 모의 키가 있으면 아래 주석 해제 후 입력 # "KIWOOM_APP_KEY_MOCK": "모의앱키입력", # "KIWOOM_APP_SECRET_MOCK": "모의시크릿입력", # 레거시 키 (이전 버전 호환, REAL/MOCK 키 없을 때 폴백) "KIWOOM_APP_KEY": "2HX8cA7AkrZsF7zBrMQXbFASvkKOkHtxh4-eia56hjo", "KIWOOM_APP_SECRET": "XaNENlYjQrwhT18h-EwKGonq-R4PpW-sT7s_-F9q3Nk", # ── 영구 구독 ETF (시장 방향 필터) ──────────────────────────────── # 스캘핑/꼬리잡기 봇이 이 ETF를 항상 구독 → 60분봉 RSI로 상승장/하락장 판단 # KODEX200(069500) = 코스피 대표, KODEX KOSDAQ150(229200) = 코스닥 대표 # 콤마 구분, 추가하려면 섹터 ETF 코드도 넣으면 됨 (예: 반도체 ETF 091160) "PERMANENT_WS_CODES": "069500,229200", } if not my_updates: print("⚠️ 업데이트할 값이 없습니다.") print(" update_env_simple.py 파일을 열어서 my_updates 딕셔너리에 값을 입력하세요.") sys.exit(1) update_env(my_updates)