refactor: clean up

This commit is contained in:
moen0
2026-04-13 20:37:21 +02:00
parent 7d53f8589a
commit cd80a947a9
6 changed files with 27 additions and 92 deletions
+6 -72
View File
@@ -30,54 +30,6 @@ def _apply_break_even_if_triggered(position, candle, strategy):
position["break_even_armed"] = True
def _apply_partial_tp_if_triggered(position, candle, strategy):
if not position:
return
if not getattr(strategy, "use_partial_tp", False):
return
if position.get("partial_taken"):
return
trigger_rr = float(getattr(strategy, "partial_tp_rr", 1.0) or 0.0)
if trigger_rr <= 0:
return
partial_pct = float(getattr(strategy, "partial_tp_percent", 0.0) or 0.0)
if partial_pct <= 0:
return
close_fraction = min(max(partial_pct / 100.0, 0.0), 1.0)
remaining_fraction = max(position.get("remaining_fraction", 1.0), 0.0)
if remaining_fraction <= 0:
position["partial_taken"] = True
return
close_fraction = min(close_fraction, remaining_fraction)
if close_fraction <= 0:
return
is_long = position["direction"] == "long"
entry = position["entry_price"]
risk_distance = max(position.get("risk_distance", 0.0), 0.0)
if risk_distance <= 0:
return
trigger_price = entry + (risk_distance * trigger_rr) if is_long else entry - (risk_distance * trigger_rr)
reached_trigger = candle.high >= trigger_price if is_long else candle.low <= trigger_price
if not reached_trigger:
return
lot_size = max(position.get("lot_size", 0.0), 0.0)
price_move = (trigger_price - entry) if is_long else (entry - trigger_price)
realized_piece = price_move * lot_size * close_fraction
position["realized_pnl"] = position.get("realized_pnl", 0.0) + realized_piece
position["remaining_fraction"] = max(0.0, remaining_fraction - close_fraction)
position["partial_taken"] = True
def run_backtest(candles, strategy, starting_balance, risk_reward=1.0,
max_daily_loss=0.0, max_consecutive_losses=0, risk_pct=1.0):
trades = []
@@ -89,7 +41,6 @@ def run_backtest(candles, strategy, starting_balance, risk_reward=1.0,
for i, candle in enumerate(candles):
if position:
_apply_partial_tp_if_triggered(position, candle, strategy)
_apply_break_even_if_triggered(position, candle, strategy)
is_long = position["direction"] == "long"
@@ -102,11 +53,9 @@ def run_backtest(candles, strategy, starting_balance, risk_reward=1.0,
exit_price = sl if hit_sl else tp
price_move = (exit_price - position["entry_price"]) if is_long else (position["entry_price"] - exit_price)
lot_size = max(position.get("lot_size", 0.0), 0.0)
remaining_fraction = max(position.get("remaining_fraction", 1.0), 0.0)
remaining_pnl = price_move * lot_size * remaining_fraction
pnl = position.get("realized_pnl", 0.0) + remaining_pnl
initial_risk = max(position.get("initial_risk_amount", 0.0), 1e-12)
r_multiple = pnl / initial_risk
pnl = price_move * lot_size
risk_distance = max(position.get("risk_distance", 0.0), 1e-12)
r_multiple = price_move / risk_distance
trades.append(Trade(
enter_time=position["enter_time"],
@@ -116,8 +65,6 @@ def run_backtest(candles, strategy, starting_balance, risk_reward=1.0,
exit_price=exit_price,
pnl=pnl,
r_multiple=r_multiple,
partial_tp_taken=bool(position.get("partial_taken", False)),
partial_tp_realized_pnl=float(position.get("realized_pnl", 0.0) or 0.0),
))
position = None
@@ -171,10 +118,6 @@ def run_backtest(candles, strategy, starting_balance, risk_reward=1.0,
"risk_distance": sl_distance,
"lot_size": lot_size,
"break_even_armed": False,
"partial_taken": False,
"remaining_fraction": 1.0,
"realized_pnl": 0.0,
"initial_risk_amount": risk_amount,
}
return trades
@@ -199,7 +142,6 @@ def run_backtest_stream(candles, strategy, starting_balance, risk_reward=1.0,
yield {"type": "progress", "processed_candles": i, "total_candles": total}
if position:
_apply_partial_tp_if_triggered(position, candle, strategy)
_apply_break_even_if_triggered(position, candle, strategy)
is_long = position["direction"] == "long"
@@ -212,11 +154,9 @@ def run_backtest_stream(candles, strategy, starting_balance, risk_reward=1.0,
exit_price = sl if hit_sl else tp
price_move = (exit_price - position["entry_price"]) if is_long else (position["entry_price"] - exit_price)
lot_size = max(position.get("lot_size", 0.0), 0.0)
remaining_fraction = max(position.get("remaining_fraction", 1.0), 0.0)
remaining_pnl = price_move * lot_size * remaining_fraction
pnl = position.get("realized_pnl", 0.0) + remaining_pnl
initial_risk = max(position.get("initial_risk_amount", 0.0), 1e-12)
r_multiple = pnl / initial_risk
pnl = price_move * lot_size
risk_distance = max(position.get("risk_distance", 0.0), 1e-12)
r_multiple = price_move / risk_distance
trade = Trade(
enter_time=position["enter_time"],
@@ -226,8 +166,6 @@ def run_backtest_stream(candles, strategy, starting_balance, risk_reward=1.0,
exit_price=exit_price,
pnl=pnl,
r_multiple=r_multiple,
partial_tp_taken=bool(position.get("partial_taken", False)),
partial_tp_realized_pnl=float(position.get("realized_pnl", 0.0) or 0.0),
)
position = None
@@ -283,10 +221,6 @@ def run_backtest_stream(candles, strategy, starting_balance, risk_reward=1.0,
"risk_distance": sl_distance,
"lot_size": lot_size,
"break_even_armed": False,
"partial_taken": False,
"remaining_fraction": 1.0,
"realized_pnl": 0.0,
"initial_risk_amount": risk_amount,
}
yield {"type": "done", "total_candles": total}