ls증권 히스토리 구독 넣음

This commit is contained in:
Your Name
2026-07-30 18:05:07 +09:00
parent 61bec4bd1d
commit 67eab24603
1593 changed files with 135733 additions and 1232 deletions

View File

@@ -212,6 +212,10 @@ def build_live_config_groups() -> List[GroupDef]:
),
_f("PROGRAM_FILTER_ENABLED", "프로그램 필터(TRIGGER) — 실매 탈락", "bool", default=True),
_f("WHIPSAW_FILTER_ENABLED", "휩쏘 필터(글로벌)", "bool", default=True),
_f("WHIPSAW_SUBBAR_SEC", "휩쏘 미니봉(초)", "int", default=30,
hint="틱을 N초 봉으로 묶음 · 실매 기본 30 · Optuna 꼬리 TPE 탐색"),
_f("WHIPSAW_LOOKBACK_SEC", "휩쏘 룩백(초)", "int", default=90,
hint="신호 직전 몇 초를 볼지 · 실매 기본 90"),
_f("WHIPSAW_DIP_PCT", "휩쏘 하락폭(분율, 0.003=0.3%)", "float", default=0.003),
_f("WHIPSAW_RECOVERY_TOL_PCT", "휩쏘 회복 허용(분율, 0.001=0.1%)", "float", default=0.001),
],
@@ -312,6 +316,37 @@ def build_live_config_groups() -> List[GroupDef]:
],
})
# 유니버스 소스 — ranking | condition | kiwoom_condition | ls_condition
_univ_choices = [
{"value": "kiwoom_condition", "label": "키움 조건(WS)"},
{"value": "ls_condition", "label": "LS 조건(AFR)"},
{"value": "condition", "label": "한투 조건(REST)"},
{"value": "ranking", "label": "거래량순위"},
]
univ_fields: List[FieldDef] = []
for sid in LIVE_STRATEGY_IDS:
lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
univ_fields.append(
_f(
f"{sid}_UNIVERSE_SOURCE",
f"{lbl} 유니버스",
"select",
default="kiwoom_condition",
choices=_univ_choices,
hint=(
"ls_condition=LS 동명 AFR · 시세는 키움/한투 유지 · "
"매니저 최초 기동은 봇 재시작 필요할 수 있음 · "
"키움으로 자동 폴백 안 함"
),
),
)
groups.append({
"id": "universe_source",
"title": "유니버스 소스",
"hint": "{SID}_UNIVERSE_SOURCE · 기본 키움 · LS는 opt-in",
"fields": univ_fields,
})
# 전략별 운용한도
budget_fields: List[FieldDef] = []
@@ -382,18 +417,33 @@ def build_live_config_groups() -> List[GroupDef]:
default=False,
hint="목표 무관 수동 잠금 · 비우면 마스터 상속 · OFF=정상",
),
_f(
_sid_key(sid, "DAILY_PROFIT_RISK_BUDGET_ENABLED"),
f"{lbl} 리스크버짓(B)",
"bool",
default=False,
hint="ON=일일익절 hit 후 보유최악손절합>cushion 이면 전량정리 · 기본 OFF · 마스터 없음",
),
_f(
_sid_key(sid, "DAILY_PROFIT_RISK_BUDGET_COOLDOWN_SEC"),
f"{lbl} 리스크버짓 쿨다운(초)",
"int",
default=300,
hint="같은 날 재평가 최소 간격 · 0=당일 1회만",
),
])
groups.append({
"id": "daily_profit_strategy",
"title": "일일 익절 — 전략별 (서브)",
"hint": (
"전략별 손익만 따로 감시. 비어 있으면 마스터 값 상속. "
"손익 감시 ON이면 목표 달성 시 해당 전략 신규매수 자동 차단"
"손익 감시 ON이면 목표 달성 시 해당 전략 신규매수 자동 차단. "
"리스크버짓(B)은 전략별만(기본 OFF)."
),
"fields": dp_fields,
})
# 전략별 휩쏘 ON/OFF (간단)
# 전략별 휩쏘 ON/OFF + 꼬리 초·% (Optuna TPE 축과 동일 키)
ws_fields: List[FieldDef] = []
for sid in LIVE_STRATEGY_IDS:
if sid == "SCALP":
@@ -403,9 +453,23 @@ def build_live_config_groups() -> List[GroupDef]:
ws_fields.append(
_f(f"{pfx}_WHIPSAW_FILTER_ENABLED", f"{lbl} 휩쏘 필터", "bool"),
)
ws_fields.extend([
_f("TAIL_WHIPSAW_SUBBAR_SEC", "꼬리 휩쏘 미니봉(초)", "int", default=30,
hint="비우면 글로벌 WHIPSAW_SUBBAR_SEC · Optuna 꼬리 TPE 축"),
_f("TAIL_WHIPSAW_LOOKBACK_SEC", "꼬리 휩쏘 룩백(초)", "int", default=90,
hint="비우면 글로벌 WHIPSAW_LOOKBACK_SEC"),
_f("TAIL_WHIPSAW_DIP_PCT", "꼬리 휩쏘 하락폭(분율)", "float", default=0.003,
hint="0.003=0.3% · 비우면 글로벌"),
_f("TAIL_WHIPSAW_RECOVERY_TOL_PCT", "꼬리 휩쏘 회복허용(분율)", "float", default=0.001,
hint="0.001=0.1% · 비우면 글로벌"),
])
groups.append({
"id": "whipsaw_strategy",
"title": "휩쏘 — 전략별 ON/OFF",
"title": "휩쏘 — 전략별 ON/OFF · 꼬리 초/%",
"hint": (
"ON/OFF와 초·%는 별개. 꼬리 Optuna --mode tpe 가 이 축을 탐색. "
"실매 현재값(enabled=false, 30초, 90초, 0.003, 0.001)이 그리드에 포함됨."
),
"fields": ws_fields,
})
@@ -422,40 +486,46 @@ def build_live_config_groups() -> List[GroupDef]:
hint="STRICT_FILL_VERIFY ON 일 때만 백테/파람서치에 적용 · 전 전략 공통 · 0=순수 백테 · 0.2=0.2%"),
_f("BACKTEST_VOL_FILL_CAP_PCT", "백테 체결량 상한(진입봉 거래량×%)", "float", default=0.0,
hint="STRICT_FILL_VERIFY ON 일 때만 · 전 전략 공통 · 0=무제한 · 소형주 IOC 미체결 근사"),
_f("TAIL_BACKTEST_TICK_FALLBACK_OHLC", "꼬리 OHLC 폴백", "bool", default=False,
hint="OFF=틱 없는 구간 체결 스킵(실매 정합) · ON=3분봉 OHLC 추측(유령거래)"),
_f("TAIL_BACKTEST_TICK_FALLBACK_OHLC", "꼬리 OHLC 폴백 (정합위험·금지)", "bool", default=False,
danger=True,
hint="절대금지: 틱 모드에서 OHLC로 체결·고점 변조. 엔진은 틱 청산 ON 시 무시. Optuna/파람 강제 OFF"),
_f("TAIL_BACKTEST_USE_TICK_EXIT", "꼬리 틱 청산", "bool", default=True,
hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
_f("TAIL_BACKTEST_POLL_MS", "꼬리 틱청산 폴링(ms)", "int", default=100,
hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
_f("MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC", "모멘텀 OHLC 폴백", "bool", default=False,
hint="OFF 권장 — 틱 없으면 청산/진입 스킵"),
_f("MOMENTUM_BACKTEST_TICK_FALLBACK_OHLC", "모멘텀 OHLC 폴백 (정합위험·금지)", "bool", default=False,
danger=True,
hint="절대금지 — 틱 청산 ON 시 엔진 무시 · Optuna 강제 OFF"),
_f("MOMENTUM_BACKTEST_POLL_MS", "모멘텀 틱청산 폴링(ms)", "int", default=100,
hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 틱 사이 청산 검사 간격 · 하한 50ms"),
_f("BREAKOUT_BACKTEST_USE_TICK_EXIT", "돌파 틱 청산", "bool", default=True,
hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
_f("BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC", "돌파 OHLC 폴백", "bool", default=False,
hint="OFF 권장 — B안 틱 없으면 high 폴백 안 함"),
_f("BREAKOUT_BACKTEST_TICK_FALLBACK_OHLC", "돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
danger=True,
hint="절대금지 — 틱 진입 ON 시 봉 high 폴백 안 함"),
_f("BREAKOUT_BACKTEST_POLL_MS", "돌파 틱청산 폴링(ms)", "int", default=100,
hint="실매 폴링 정합 · 하한 50ms"),
_f("SCALP_BACKTEST_USE_TICK_EXIT", "스캘핑 틱 청산", "bool", default=True,
hint="ON=ws_ticks 시간순 청산(실매 폴링 정합) · OFF=OHLC intrabar"),
_f("SCALP_BACKTEST_USE_TICK_ENTRY", "스캘핑 틱 진입", "bool", default=True,
hint="ON=예약 체결 시 해당 분 첫 틱가 · OFF=분봉 시가"),
_f("SCALP_BACKTEST_TICK_FALLBACK_OHLC", "스캘핑 OHLC 폴백", "bool", default=False,
hint="OFF 권장 — 틱 없으면 청산 스킵"),
_f("SCALP_BACKTEST_TICK_FALLBACK_OHLC", "스캘핑 OHLC 폴백 (정합위험·금지)", "bool", default=False,
danger=True,
hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
_f("SCALP_BACKTEST_POLL_MS", "스캘핑 틱청산 폴링(ms)", "int", default=100,
hint="실매 STRATEGY_LOOP_SLEEP≈0.1초 정합 · 하한 50ms"),
_f("RANGE_BREAK_BACKTEST_USE_TICK_EXIT", "박스돌파 틱 청산", "bool", default=True,
hint="ON=ws_ticks 시간순 청산 · OFF=OHLC intrabar"),
_f("RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC", "박스돌파 OHLC 폴백", "bool", default=False,
hint="OFF 권장 — 틱 없으면 청산 스킵"),
_f("RANGE_BREAK_BACKTEST_TICK_FALLBACK_OHLC", "박스돌파 OHLC 폴백 (정합위험·금지)", "bool", default=False,
danger=True,
hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
_f("RANGE_BREAK_BACKTEST_POLL_MS", "박스돌파 틱청산 폴링(ms)", "int", default=100,
hint="실매 폴링 정합 · 하한 50ms"),
_f("DBBAND_BACKTEST_USE_TICK_EXIT", "더블BB 틱 청산", "bool", default=True,
hint="ON=ws_ticks 시간순 청산 · OFF=봉 OHLC 1회"),
_f("DBBAND_BACKTEST_TICK_FALLBACK_OHLC", "더블BB OHLC 폴백", "bool", default=False,
hint="OFF 권장 — 틱 없으면 청산 스킵"),
_f("DBBAND_BACKTEST_TICK_FALLBACK_OHLC", "더블BB OHLC 폴백 (정합위험·금지)", "bool", default=False,
danger=True,
hint="절대금지 — 틱 청산 ON 시 엔진 무시"),
_f("DBBAND_BACKTEST_POLL_MS", "더블BB 틱청산 폴링(ms)", "int", default=100,
hint="실매 폴링 정합 · 하한 50ms"),
_f("TAIL_PARAM_SEARCH_MIN_START", "꼬리 파라서치 최소 시작일", "str", default="2026-07-07",
@@ -495,6 +565,32 @@ def build_live_config_groups() -> List[GroupDef]:
default=1,
hint="SELL_LIMIT_CANCEL_BEFORE_MARKET_RETRY=ON 일 때 ODNO 재조회 대기",
),
_f(
"SELL_LIMIT_CANCEL_FAIL_BALANCE_CONFIRM",
"취소실패+잔고0→매도확정",
"bool",
default=True,
hint=(
"ON=익절지정가 취소 실패·ODNO 미확인이어도 브로커 0주면 "
"지정가 체결로 finalize(유령금지) · OFF=PENDING만"
),
),
_f(
"GHOST_PURGE_BLOCK_WHILE_PENDING_SELL",
"PENDING매도 시 유령정리 금지",
"bool",
default=True,
hint=(
"ON=미확정 매도 ODNO 있으면 ghost_purge 대신 체결재조회/잔고확정 청산"
),
),
_f(
"DAILY_CCLD_TR_ID",
"일별체결조회 TR_ID",
"str",
default="",
hint="비우면 모의 VTTC0081R / 실전 TTTC0081R (레거시 *8001R 사용 금지)",
),
],
})
@@ -540,9 +636,32 @@ def build_live_config_groups() -> List[GroupDef]:
_f("STRATEGY_LOOP_SLEEP_MIN", "루프 끝 sleep 최소(초)", "float", default=0.1,
hint="한 바퀴 끝 대기 · WS 구독 캐시 폴링 · 0.1=실매 반응 빠르게"),
_f("STRATEGY_LOOP_SLEEP_MAX", "루프 끝 sleep 최대(초)", "float", default=0.1),
_f("TICK_SELL_ENABLED", "틱매도(공통)", "bool", default=False,
hint="ON=WS 현재가 갱신마다 매도검사(백테 틱청산에 근접) · OFF=루프(~0.1초)만 · "
"전략별 *_TICK_SELL_ENABLED 가 비어있지 않으면 그쪽 우선 · 기본 OFF"),
_f("TICK_SELL_MIN_INTERVAL_MS", "틱매도 최소간격(ms)", "int", default=50,
hint="같은 종목 연속 틱 폭주 시 매도검사 하한 · 백테 poll≈50~100ms 정합"),
],
})
# 전략별 틱매도 스위치 (비어 있으면 공통 TICK_SELL_ENABLED)
tick_sell_fields: List[FieldDef] = []
for sid in LIVE_STRATEGY_IDS:
lbl = LIVE_STRATEGY_LABELS.get(sid, sid)
tick_sell_fields.append(
_f(f"{sid}_TICK_SELL_ENABLED", f"{lbl} 틱매도", "bool", default=False,
hint="비우면 공통 TICK_SELL_ENABLED · true/false 명시 시 전략만 덮어씀 · 기본 false"),
)
groups.append({
"id": "tick_sell_by_strategy",
"title": "전략별 틱매도 (선택)",
"hint": (
"매도 규칙은 기존 check_sell_signals 그대로 · 호출 시점만 WS 틱. "
"실매↔백테 청산 타이밍 정합용 · 기본 OFF 권장(검증 후 ON)."
),
"fields": tick_sell_fields,
})
# 전략별 후보 하드캡 (WS 100 구독 한도 안전 + 매수체크 회전율)
cand_fields: List[FieldDef] = []
for sid in LIVE_STRATEGY_IDS:
@@ -717,6 +836,12 @@ def build_live_config_groups() -> List[GroupDef]:
hint="활성 전략 중 가장 이른 EOD N분 1회 · EOD 청산 전 active_trades 반영"),
_f("ORPHAN_RECONCILE_PRE_EOD_LEAD_MIN", "Pre-EOD 선행(분)", "int", default=7,
hint="예: BREAKOUT EOD 15:15 → 15:08 실행 · REST 잔고 1회/일"),
_f("ORPHAN_SKIP_AFTER_SELL_HISTORY", "청산히스토리 있으면 재등록금지", "bool", default=True,
hint="ON=매수 이후 장마감청산 등 히스토리 있으면 고아복구로 active 다시 안 넣음"),
_f("ORPHAN_SKIP_SELL_REASONS", "재등록금지 청산사유", "str", default="장마감청산,eod",
hint="쉼표 구분 키워드. 비우면 매수 이후 모든 청산 히스토리 금지"),
_f("ORPHAN_PURGE_ACTIVE_AFTER_SELL_HISTORY", "청산후 유령 active 정리", "bool", default=True,
hint="ON=active에 남았는데 매수 이후 청산 히스토리면 DB 행 삭제"),
_f("GHOST_PURGE_ON_RECONCILE", "고아복구 시 유령잔고 삭제", "bool", default=True,
hint="ON=브로커 0주인데 active_trades 남은 종목 삭제(수동보호 제외) · Pre/Post EOD 동일 잔고조회에서 처리"),
_f(