feat: Add new files and enhance backtesting functionality

Changes:
- Introduced new files for strategy definitions and study names.
- Enhanced `backtest_web.py` with functions to handle integer display prices and trade data formatting.
- Updated backtesting logic to incorporate end-of-day (EOD) parameters for breakout and momentum strategies.
- Added EOD configuration options in the database and parameter search files.

Impact:
- These changes improve the modularity and usability of the backtesting framework, allowing for better integration of EOD strategies and clearer trade data presentation.
This commit is contained in:
2026-07-06 19:11:34 +09:00
parent 336d637b72
commit 78edb75e01
33 changed files with 1479 additions and 303 deletions

View File

@@ -98,9 +98,19 @@ def build_live_config_groups() -> List[GroupDef]:
{
"id": "daily_profit_global",
"title": "일일 익절 — 총합 (마스터)",
"hint": "env_config · 달성 시 전 전략 신규 매수 중단 (매도·손절은 유지)",
"hint": (
"① 손익 감시 켜기 = 당일 실현손익을 목표와 비교 "
"(ON이면 목표 달성 시 신규매수 자동 차단) "
"② 신규매수 수동 중단 = 목표·손익과 무관하게 매수만 잠금 "
"(긴급 일시정지용, 기본 OFF). 매도·손절은 항상 유지"
),
"fields": [
_f("DAILY_PROFIT_TARGET_ENABLED", "활성화", "bool"),
_f(
"DAILY_PROFIT_TARGET_ENABLED",
"손익 감시 켜기 (일일익절)",
"bool",
hint="ON = 목표 달성 시 신규매수 자동 차단 · OFF = 목표와 무관하게 매수 계속",
),
_f("DAILY_PROFIT_TARGET_KRW", "목표 금액(원)", "int", default=0),
_f("DAILY_PROFIT_TARGET_PCT", "목표 수익률(%)", "float", default=0,
hint="퍼센트 그대로 (예: 2.5 = 2.5%) · 0=미사용"),
@@ -111,7 +121,16 @@ def build_live_config_groups() -> List[GroupDef]:
default=0,
hint="0 = ON 전략 TOTAL_BUDGET 합 자동",
),
_f("DAILY_PROFIT_HALT_NEW_BUYS", "신규 매수 중단", "bool", default=True),
_f(
"DAILY_PROFIT_HALT_NEW_BUYS",
"신규매수 수동 중단",
"bool",
default=False,
hint=(
"목표·손익과 무관한 수동 매수 잠금. "
"ON=즉시 신규매수 전면 차단 / OFF=정상 (기본)"
),
),
_f("DAILY_PROFIT_NOTIFY_MM", "달성 시 MM 알림", "bool", default=True),
_f("DAILY_PROFIT_MODE", "익절 방식", "text", default="fixed",
hint="fixed=고정목표 / trailing=고점대비 되돌림 / both=둘 중 먼저"),
@@ -184,8 +203,9 @@ def build_live_config_groups() -> List[GroupDef]:
dp_fields.extend([
_f(
_sid_key(sid, "DAILY_PROFIT_TARGET_ENABLED"),
f"{lbl} 익절 활성",
f"{lbl} 손익 감시 켜기",
"bool",
hint="OFF = 해당 전략 일일익절 비활성 (매수 차단 없음)",
),
_f(
_sid_key(sid, "DAILY_PROFIT_TARGET_KRW"),
@@ -222,11 +242,21 @@ def build_live_config_groups() -> List[GroupDef]:
"int",
hint="이 이상 벌어야 트레일 감시 · 비우면 마스터 상속",
),
_f(
_sid_key(sid, "DAILY_PROFIT_HALT_NEW_BUYS"),
f"{lbl} 신규매수 수동 중단",
"bool",
default=False,
hint="목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상",
),
])
groups.append({
"id": "daily_profit_strategy",
"title": "일일 익절 — 전략별 (서브)",
"hint": "비어 있으면 마스터 값 상속 · 달성 시 해당 전략만 매수 중단",
"hint": (
"전략별 손익만 따로 감시. 비어 있으면 마스터 값 상속. "
"손익 감시 ON이면 목표 달성 시 해당 전략 신규매수 자동 차단"
),
"fields": dp_fields,
})
@@ -391,6 +421,47 @@ def build_live_config_groups() -> List[GroupDef]:
],
})
groups.append({
"id": "breakout_exit",
"title": "돌파(BREAKOUT) — EOD·시간컷",
"hint": (
"env_config · 저장 후 다음 매도 루프부터 반영(재시작 불필요). "
"EOD OFF 시 당일 15:15 강제청산 없음 — 손절·익절·어깨·시간컷만."
),
"fields": [
_f("BREAKOUT_EOD_ENABLED", "EOD 당일청산 사용", "bool", default=True,
hint="ON=설정 시각 이후 보유 전량 eod 청산 · OFF=익절·손절·시간컷만"),
_f("BREAKOUT_EOD_HM", "EOD 시각 (HH:MM)", "text", default="15:15",
hint="이 시각 이후 보유 전량 청산 · 예: 15:15"),
_f("BREAKOUT_MAX_HOLD_BARS", "최대보유(분)", "int", default=0,
hint="0=OFF · 진입 후 N분 경과 시 max_hold 청산"),
],
})
groups.append({
"id": "momentum_exit",
"title": "모멘텀(MOMENTUM) — EOD",
"hint": "env_config · 저장 후 다음 매도 루프부터 반영(재시작 불필요).",
"fields": [
_f("MOMENTUM_EOD_ENABLED", "EOD 당일청산 사용", "bool", default=True,
hint="ON=설정 시각 이후 보유 전량 장마감청산 · OFF=익절·손절·시간컷만"),
_f("MOMENTUM_EOD_HM", "EOD 시각 (HH:MM)", "text", default="15:25",
hint="이 시각 이후 보유 전량 청산 · 예: 15:25"),
],
})
groups.append({
"id": "tail_exit",
"title": "꼬리(SHORT/TAIL) — EOD",
"hint": "env_config · 저장 후 다음 매도 루프부터 반영(재시작 불필요).",
"fields": [
_f("TAIL_EOD_ENABLED", "EOD 당일청산 사용", "bool", default=True,
hint="ON=설정 시각 이후 보유 전량 장마감 청산 · OFF=익절·손절·시간컷만"),
_f("TAIL_EOD_HM", "EOD 시각 (HH:MM)", "text", default="15:25",
hint="이 시각 이후 보유 전량 청산 · 예: 15:25"),
],
})
groups.append({
"id": "portfolio_hold",
"title": "보유·매도 / 고아복구",