feat: 새로운 안전 규칙 및 최적화 적용을 통한 트레이딩 시스템 개선
변경 사항 (Changes): 구문 오류(Syntax error) 및 토큰 낭비를 방지하기 위해 에이전트 쉘(Agent shell)과 파이썬 코드 스니펫에 다수의 신규 안전 규칙(Safety rules)을 추가함. 스키마 검증 및 적절한 SQL 포맷팅을 보장하기 위해 임시(Ad-hoc) 데이터베이스 쿼리 작성 가이드라인을 도입함. 코드 수정 후 UI 기능이 정상 작동하는지 확인하기 위해, 백테스트 웹 서비스 재시작 및 브라우저 검증에 대한 새로운 규칙을 구현함. 시스템 전반의 무결성(Integrity)을 유지하기 위해 실전 매매(Live trading), 웹 백테스팅, 파라미터 탐색(Parameter searches) 간의 일관성 검사(Consistency checks) 체계를 확립함. 기대 효과 (Impact): 이러한 개선 사항들은 트레이딩 시스템의 견고성(Robustness)과 신뢰성을 향상시키며, 에러 발생을 최소화하고 다양한 시스템 컴포넌트 간의 원활한 상호작용을 보장함.
This commit is contained in:
@@ -2,10 +2,11 @@
|
||||
kis_trader/strategies/scalping.py — 스캘핑 전략 (1분봉 RSI 과매도 되돌림 / Reversal 고정)
|
||||
==================================================================================
|
||||
[전략 컨셉 — SCAN vs TRIGGER]
|
||||
- **SCAN (HTS/랭킹, 널넬하게)**: K/L/제외 또는 거래량 랭킹 → 감시 대상만 선정.
|
||||
- **TRIGGER (코드, 엄격하게)** — ``SCALP_USE_MACD_CROSS`` 로 선택:
|
||||
- **false (기본)**: RSI(3) 과매도(<25) → 양봉 전환 V자 반등 ("바닥잡기").
|
||||
- **true**: HTS C — MACD+Stochastic [12,26,5,3,3] 골든크로스 (0봉전 상향돌파).
|
||||
- **SCAN (HTS ``CONDITION_SCALP_KIWOOM_NAME``=scalp_re)**: 낙폭+회복+거래대금 → ``kiwoom_condition`` WS.
|
||||
- **TRIGGER (코드)** — ``SCALP_SKIP_HTS_SCAN_DUPES=true`` (kiwoom_condition 기본):
|
||||
- HTS scalp_re SCAN 통과 후 **진입 타이밍만** (낙폭·RSI·되돌림 중복 생략).
|
||||
- ``SCALP_SKIP_HTS_SCAN_DUPES=false`` + reversal: RSI(3) 과매도 V자 + 되돌림.
|
||||
- ``SCALP_USE_MACD_CROSS=true``: MACD+Stochastic 골든크로스 (방어필터는 skip_hts 시 생략).
|
||||
- 청산: TP/SL/EOD/이동평균 이탈 등 (scalping_engine.check_sell_signal_live).
|
||||
- ⚠️ 모멘텀 추종은 MomentumStrategy 분리 (MACD 골든크로스 HTS 는 SCALP TRIGGER 로 이전).
|
||||
|
||||
@@ -13,11 +14,6 @@ kis_trader/strategies/scalping.py — 스캘핑 전략 (1분봉 RSI 과매도
|
||||
- 진입 시그널: ``scalping_engine.check_buy_signal_live`` (백테스트 동일 로직)
|
||||
- 청산 시그널: ``scalping_engine.check_sell_signal_live`` (백테스트 동일 로직)
|
||||
|
||||
[Deprecated]
|
||||
- 과거 ``SCALP_MODE`` 토글(reversal/momentum) 은 폐기되었습니다.
|
||||
``SCALP_MODE=momentum`` 이 DB 에 남아있으면 시작 시 1회 경고 + reversal 폴백.
|
||||
추세추종(모멘텀) 전략은 ``STRATEGY_MOMENTUM_ENABLED=true`` 로 별도 켜세요.
|
||||
|
||||
[주문 실행]
|
||||
- ``OrderManager.place(OrderRequest(strategy_id="SCALP", ...))``
|
||||
→ ODNO 저장, 종목 Lock, 실 잔고 검증까지 한 번에 처리.
|
||||
@@ -33,7 +29,7 @@ try:
|
||||
except ImportError:
|
||||
se = None
|
||||
|
||||
from ..utils.env import get_env_bool, get_env_float, get_env_from_db, get_env_int
|
||||
from ..utils.env import get_env_bool, get_env_float, get_env_int
|
||||
from .base import BaseStrategy
|
||||
|
||||
|
||||
@@ -46,8 +42,6 @@ class ScalpingStrategy(BaseStrategy):
|
||||
super().__init__(**kwargs)
|
||||
self.candle_tf = 1 # 1분봉
|
||||
self._scan_engine_params: Optional[Dict] = None
|
||||
# SCALP_MODE deprecate 경고는 시작 시 1회만 (루프마다 reload_config 호출돼 스팸 방지)
|
||||
self._deprecation_warned: bool = False
|
||||
self.reload_config()
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
@@ -70,19 +64,6 @@ class ScalpingStrategy(BaseStrategy):
|
||||
self.rsi_overbought = get_env_float("SCALP_RSI_OVERBOUGHT", 75.0)
|
||||
self.slot_money = get_env_int("SLOT_MONEY_DEFAULT", 3000000)
|
||||
|
||||
# ── SCALP_MODE deprecate 가드 ────────────────────────────────
|
||||
# 과거에 reversal/momentum 토글이 있었지만, 모멘텀은 MomentumStrategy 로 분리됨.
|
||||
# SCALP 는 항상 reversal 로 동작. DB 에 'momentum' 이 남아있으면 시작 시 1회 경고.
|
||||
legacy_mode = (get_env_from_db("SCALP_MODE", "reversal") or "reversal").strip().lower()
|
||||
if legacy_mode == "momentum" and not self._deprecation_warned:
|
||||
self.logger.warning(
|
||||
"⚠️ [DEPRECATED] SCALP_MODE=momentum 은 더 이상 지원되지 않습니다. "
|
||||
"SCALP 는 reversal 로 고정 동작합니다. "
|
||||
"추세추종을 원하시면 STRATEGY_MOMENTUM_ENABLED=true 로 MomentumStrategy 를 켜주세요."
|
||||
)
|
||||
self._deprecation_warned = True
|
||||
self.scalp_mode = "reversal" # 고정
|
||||
|
||||
if se is not None:
|
||||
try:
|
||||
_d = se.get_scalping_defaults_from_db()
|
||||
@@ -115,6 +96,15 @@ class ScalpingStrategy(BaseStrategy):
|
||||
"stoch_k_period": get_env_int("SCALP_STOCH_K_PERIOD", 5),
|
||||
"stoch_d_period": get_env_int("SCALP_STOCH_D_PERIOD", 3),
|
||||
"stoch_slow": get_env_int("SCALP_STOCH_SLOW", 3),
|
||||
# get_scalping_defaults_from_db() 가 이미 DB SCALP_SKIP_HTS_SCAN_DUPES 를
|
||||
# skip_hts_scan_dupes bool 로 해석함. resolve(_d) 금지:
|
||||
# _d 에는 SCALP_SKIP_* env 키가 없어 universe fallback → 항상 True 가 됨.
|
||||
"skip_hts_scan_dupes": bool(
|
||||
_d.get(
|
||||
"skip_hts_scan_dupes",
|
||||
se.resolve_scalp_skip_hts_scan_dupes(),
|
||||
),
|
||||
),
|
||||
}
|
||||
except Exception as e:
|
||||
self.logger.debug("scalping_engine defaults 조회 실패: %s", e)
|
||||
|
||||
Reference in New Issue
Block a user