fix: critical bugs — double fee, SL/TP atomicity, PnL race, graceful shutdown

C5: Remove duplicate entry_fee deduction in backtester (balance and net_pnl)
C1: Add SL/TP retry (3x) with emergency market close on final failure
C3: Add _close_lock to prevent PnL double recording between callback and monitor
C8: Add SIGTERM/SIGINT handler with per-symbol order cancellation before exit

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
21in7
2026-03-19 23:55:14 +09:00
parent e648ae7ca0
commit f14c521302
5 changed files with 265 additions and 102 deletions

View File

@@ -491,9 +491,8 @@ class Backtester:
buy_side = "BUY" if signal == "LONG" else "SELL"
entry_price = _apply_slippage(price, buy_side, self.cfg.slippage_pct)
# 수수료
# 수수료 (청산 시 net_pnl에서 차감하므로 여기서 balance 차감하지 않음)
entry_fee = _calc_fee(entry_price, quantity, self.cfg.fee_pct)
self.balance -= entry_fee
# SL/TP 계산
atr = float(row.get("atr", 0))