#!/usr/bin/env python3
"""
Test rapide de l'adaptation dynamique
"""
import pandas as pd
from v10_range_strategy import V10RangeStrategy
from backtest_adaptive import AdaptiveBacktest
from backtest_v10_range import Signal

# Charger données
df = pd.read_csv('historical_data/BTCUSDT_1m_60000candles.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])

print(f"Données: {len(df)} candles")
print(f"Période: {df['timestamp'].iloc[0]} → {df['timestamp'].iloc[-1]}")

# Config de test
params = {
    'rsi_oversold': 30,
    'rsi_overbought': 70,
    'range_atr_threshold': 0.30,
    'min_confidence': 70,
    'sl_atr_mult': 1.0,
    'trailing_pct': 0.15,
    'leverage': 225,
}

# Créer stratégie
strategy = V10RangeStrategy(leverage=params['leverage'])
strategy.params['rsi_oversold'] = params['rsi_oversold']
strategy.params['rsi_overbought'] = params['rsi_overbought']
strategy.params['range_atr_threshold'] = params['range_atr_threshold']
strategy.params['min_confidence'] = params['min_confidence']
strategy.params['sl_atr_multiplier'] = params['sl_atr_mult']

# Adapter pour backtest
class CustomAdapter:
    def __init__(self, strat):
        self.strategy = strat
        self.leverage = strat.leverage
        self.params = {
            'ranging': {
                'sl_atr_multiplier': strat.params['sl_atr_multiplier'],
                'tp_atr_multiplier': 3.0,
                'min_confidence': strat.params['min_confidence'],
            }
        }

    def analyze(self, symbol, df):
        signal_dict = self.strategy.analyze(symbol, df)
        if not signal_dict:
            return None
        return Signal(
            symbol=signal_dict['symbol'],
            side=signal_dict['side'],
            entry_price=signal_dict['entry_price'],
            stop_loss=signal_dict['stop_loss'],
            take_profit=signal_dict['take_profit'],
            leverage=signal_dict['leverage'],
            risk_pct=signal_dict['risk_pct'],
            score=signal_dict['confidence'],
            confluences=signal_dict['confluences'],
            strategy_used='v10_range_reversal',
            confidence=signal_dict['confidence']
        )

adapter = CustomAdapter(strategy)

print("\n" + "="*80)
print("TEST 1: BACKTEST STATIQUE (paramètres fixes)")
print("="*80)

backtest_static = AdaptiveBacktest(
    adapter,
    initial_capital=500.0,
    use_trailing_stop=True,
    trailing_pct=params['trailing_pct'],
    early_stop_on_losses=False,  # Désactiver pour voir tous les trades
    min_capital_pct=0.50,
    use_dynamic_adaptation=False  # STATIQUE
)

results_static = backtest_static.run(df, 'BTCUSDT')

if results_static:
    print(f"\n📊 RÉSULTATS STATIQUES:")
    print(f"   Trades: {results_static['total_trades']}")
    print(f"   Win Rate: {results_static['win_rate']:.1f}%")
    print(f"   PnL: {results_static['total_pnl_pct']:+.2f}%")
    print(f"   Profit Factor: {results_static['profit_factor']:.2f}")
    print(f"   Capital final: ${results_static['final_capital']:.2f}")

print("\n" + "="*80)
print("TEST 2: BACKTEST DYNAMIQUE (adaptation ATR)")
print("="*80)

# Recréer stratégie avec mêmes params
strategy2 = V10RangeStrategy(leverage=params['leverage'])
strategy2.params['rsi_oversold'] = params['rsi_oversold']
strategy2.params['rsi_overbought'] = params['rsi_overbought']
strategy2.params['range_atr_threshold'] = params['range_atr_threshold']
strategy2.params['min_confidence'] = params['min_confidence']
strategy2.params['sl_atr_multiplier'] = params['sl_atr_mult']

adapter2 = CustomAdapter(strategy2)

backtest_dynamic = AdaptiveBacktest(
    adapter2,
    initial_capital=500.0,
    use_trailing_stop=True,
    trailing_pct=params['trailing_pct'],
    early_stop_on_losses=False,
    min_capital_pct=0.50,
    use_dynamic_adaptation=True  # ⚡ DYNAMIQUE
)

results_dynamic = backtest_dynamic.run(df, 'BTCUSDT')

if results_dynamic:
    print(f"\n📊 RÉSULTATS DYNAMIQUES:")
    print(f"   Trades: {results_dynamic['total_trades']}")
    print(f"   Win Rate: {results_dynamic['win_rate']:.1f}%")
    print(f"   PnL: {results_dynamic['total_pnl_pct']:+.2f}%")
    print(f"   Profit Factor: {results_dynamic['profit_factor']:.2f}")
    print(f"   Capital final: ${results_dynamic['final_capital']:.2f}")

if results_static and results_dynamic:
    print("\n" + "="*80)
    print("📈 COMPARAISON")
    print("="*80)

    pnl_diff = results_dynamic['total_pnl_pct'] - results_static['total_pnl_pct']
    trades_diff = results_dynamic['total_trades'] - results_static['total_trades']

    print(f"PnL: {pnl_diff:+.2f}% {'✅ MIEUX' if pnl_diff > 0 else '❌ MOINS BIEN'}")
    print(f"Trades: {trades_diff:+d} {'(plus de trades)' if trades_diff > 0 else '(moins de trades)'}")
    print(f"Profit Factor: {results_dynamic['profit_factor']:.2f} vs {results_static['profit_factor']:.2f}")
