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:
@@ -10,7 +10,6 @@ kis_trader/engine/range_break_engine.py — 박스권 돌파(RANGE_BREAK) 공통
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
from kis_trader.engine.range_break_env_keys import (
|
||||
@@ -22,6 +21,7 @@ from kis_trader.strategies.breakout import (
|
||||
check_sell_signal_breakout_live,
|
||||
normalize_breakout_max_loss_krw,
|
||||
)
|
||||
from kis_trader.utils.trade_time import parse_trade_datetime as _t2dt
|
||||
|
||||
RANGE_BREAK_STRATEGY_ID = "RANGE_BREAK"
|
||||
|
||||
@@ -44,10 +44,6 @@ def _confirmed_candles_only(candles: List[Dict]) -> List[Dict]:
|
||||
return confirmed if confirmed else list(candles)
|
||||
|
||||
|
||||
def _t2dt(t: str) -> datetime:
|
||||
return datetime.strptime(str(t)[:12], "%Y%m%d%H%M")
|
||||
|
||||
|
||||
def _slot_key(candle_time: str, scan_interval_min: int = 1) -> str:
|
||||
date = candle_time[:8]
|
||||
hm = int(candle_time[8:12])
|
||||
@@ -281,25 +277,28 @@ def check_sell_signal_range_break_live(
|
||||
return check_sell_signal_breakout_live(position, current_candle, params, is_eod=is_eod)
|
||||
|
||||
|
||||
def get_range_break_defaults_from_db(db=None) -> Dict[str, Any]:
|
||||
def get_range_break_defaults_from_db(db=None, *, env_row: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
||||
"""env_config + config_range_break 병합."""
|
||||
own_db = None
|
||||
r: Dict[str, Any] = {}
|
||||
try:
|
||||
if db is None:
|
||||
from database import TradeDB
|
||||
own_db = TradeDB()
|
||||
db = own_db
|
||||
if hasattr(db, "get_merged_env_snapshot"):
|
||||
r = db.get_merged_env_snapshot()
|
||||
elif hasattr(db, "get_latest_env"):
|
||||
latest = db.get_latest_env()
|
||||
r = dict((latest or {}).get("snapshot") or {})
|
||||
if env_row is not None:
|
||||
r = dict(env_row)
|
||||
else:
|
||||
row = db.conn.execute(
|
||||
"SELECT * FROM env_config ORDER BY id DESC LIMIT 1"
|
||||
).fetchone()
|
||||
r = dict(row) if row else {}
|
||||
if db is None:
|
||||
from database import TradeDB
|
||||
own_db = TradeDB()
|
||||
db = own_db
|
||||
if hasattr(db, "get_merged_env_snapshot"):
|
||||
r = db.get_merged_env_snapshot()
|
||||
elif hasattr(db, "get_latest_env"):
|
||||
latest = db.get_latest_env()
|
||||
r = dict((latest or {}).get("snapshot") or {})
|
||||
else:
|
||||
row = db.conn.execute(
|
||||
"SELECT * FROM env_config ORDER BY id DESC LIMIT 1"
|
||||
).fetchone()
|
||||
r = dict(row) if row else {}
|
||||
except Exception:
|
||||
r = {}
|
||||
finally:
|
||||
@@ -450,10 +449,12 @@ def run_range_break_backtest(
|
||||
codes_candles: Dict[str, List[Dict]],
|
||||
params: Dict[str, Any],
|
||||
universe_by_slot: Optional[Dict[str, List[str]]] = None,
|
||||
ticks_by_code: Optional[Dict[str, Dict[str, List[Dict]]]] = None,
|
||||
) -> List[Dict]:
|
||||
from kis_trader.backtest.range_break_portfolio_backtest import (
|
||||
run_range_break_backtest_portfolio,
|
||||
)
|
||||
return run_range_break_backtest_portfolio(
|
||||
codes_candles, params, universe_by_slot=universe_by_slot,
|
||||
ticks_by_code=ticks_by_code,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user