refactor: enhance Optuna backtesting framework, optimize orderbook filtering, and update database management utilities.
This commit is contained in:
@@ -542,6 +542,7 @@ def resolve_momentum_sell_for_bar(
|
||||
is_eod: bool = False,
|
||||
ticks_by_code: Optional[Dict[str, Dict[str, List[Dict[str, Any]]]]] = None,
|
||||
code: str = "",
|
||||
orderbook_by_code: Optional[Dict[str, Any]] = None,
|
||||
) -> Optional[Tuple[str, float, str, float, str]]:
|
||||
"""
|
||||
한 분봉 청산 — 틱 우선 → (옵션) OHLC intrabar → last-price 벽시계.
|
||||
@@ -551,15 +552,37 @@ def resolve_momentum_sell_for_bar(
|
||||
exit_source: ws_ticks | ohlc_bar | wallclock_last
|
||||
"""
|
||||
from kis_trader.engine.momentum_engine import check_sell_signal_momentum_backtest_bar
|
||||
from kis_trader.engine.momentum_hts_logic import (
|
||||
collect_exit_ob_or_history,
|
||||
need_ob_or_history,
|
||||
_ob_or_ma_window_for_history,
|
||||
)
|
||||
|
||||
ct = str(bar.get("candle_time") or "")
|
||||
entry_time = str(position.get("entry_time") or "")
|
||||
|
||||
if momentum_backtest_use_tick_exit(params) and ticks_by_code and code:
|
||||
# 수익구간·손절호가 OR 히스토리 (둘 중 ON일 때만 DB 스냅 수집 · 기본 OFF → no-op)
|
||||
p = params
|
||||
if need_ob_or_history(p) and code and orderbook_by_code:
|
||||
ors = collect_exit_ob_or_history(
|
||||
orderbook_by_code,
|
||||
code,
|
||||
entry_time=entry_time,
|
||||
asof_time=ct,
|
||||
ma_window=_ob_or_ma_window_for_history(p),
|
||||
)
|
||||
position["_ob_or_history"] = ors
|
||||
p = dict(params)
|
||||
p["_ob_or_history"] = list(ors)
|
||||
else:
|
||||
p = dict(params)
|
||||
p["_ob_or_history"] = list(position.get("_ob_or_history") or [])
|
||||
|
||||
if momentum_backtest_use_tick_exit(p) and ticks_by_code and code:
|
||||
minute_ticks = collect_minute_ticks(ticks_by_code, code, ct)
|
||||
if minute_ticks:
|
||||
tick_res = try_momentum_sell_on_ticks(
|
||||
position, minute_ticks, params,
|
||||
position, minute_ticks, p,
|
||||
is_eod=is_eod, entry_time=entry_time,
|
||||
)
|
||||
if tick_res:
|
||||
@@ -588,10 +611,10 @@ def resolve_momentum_sell_for_bar(
|
||||
# 절대규칙: 틱 청산 ON 이면 OHLC 봉 폴백으로 숫자 변조 금지
|
||||
# (FALLBACK_OHLC 체크 ON 이어도 무시. 벽시계 last-price 는 OHLC intrabar 가 아님)
|
||||
if (
|
||||
not momentum_backtest_use_tick_exit(params)
|
||||
and momentum_backtest_tick_fallback_ohlc(params)
|
||||
not momentum_backtest_use_tick_exit(p)
|
||||
and momentum_backtest_tick_fallback_ohlc(p)
|
||||
):
|
||||
res = check_sell_signal_momentum_backtest_bar(position, bar, params, is_eod=is_eod)
|
||||
res = check_sell_signal_momentum_backtest_bar(position, bar, p, is_eod=is_eod)
|
||||
if res:
|
||||
reason, exit_price = res
|
||||
try:
|
||||
@@ -602,7 +625,7 @@ def resolve_momentum_sell_for_bar(
|
||||
hold_min = 0.0
|
||||
return reason, float(exit_price), ct, hold_min, "ohlc_bar"
|
||||
|
||||
if not momentum_backtest_wallclock_last_price(params):
|
||||
if not momentum_backtest_wallclock_last_price(p):
|
||||
return None
|
||||
|
||||
last_px = resolve_momentum_wallclock_last_px(
|
||||
@@ -612,7 +635,7 @@ def resolve_momentum_sell_for_bar(
|
||||
return None
|
||||
update_momentum_bt_last_px(position, last_px, ct)
|
||||
wall_res = try_momentum_sell_wallclock_last(
|
||||
position, last_px, ct, params, is_eod=is_eod,
|
||||
position, last_px, ct, p, is_eod=is_eod,
|
||||
)
|
||||
if not wall_res:
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user