"""
Optimize MA20 - Chercher à battre 32.38%
Test variations autour des paramètres MA20 gagnants
"""
import pandas as pd
import numpy as np
from apollo_client import ApolloDegenClient

print('\n' + '='*80)
print('🎯 OPTIMIZE MA20 - Objectif: Battre 32.38%')
print('='*80)

client = ApolloDegenClient()
df = client.get_klines('BTCUSDT', '1m', limit=1500)

print(f'✅ {len(df)} bougies chargées\n')

# Calculer MAs
for ma in [15, 18, 20, 22, 25, 30]:
    df[f'ma_{ma}'] = df['close'].rolling(ma).mean()

def backtest(df, ma_period, sl_pct, tp_ratio, leverage):
    """Backtest rapide"""
    cap = 100
    trades = []
    pos = None

    for i in range(ma_period + 10, len(df)):
        close = df.iloc[i]['close']
        ma = df.iloc[i][f'ma_{ma_period}']

        if pd.isna(ma):
            continue

        # Position ouverte?
        if pos:
            hit_sl = (pos['side'] == 'LONG' and close <= pos['sl']) or \
                     (pos['side'] == 'SHORT' and close >= pos['sl'])
            hit_tp = (pos['side'] == 'LONG' and close >= pos['tp']) or \
                     (pos['side'] == 'SHORT' and close <= pos['tp'])

            if hit_sl or hit_tp:
                if pos['side'] == 'LONG':
                    pnl_pct = (close - pos['entry']) / pos['entry']
                else:
                    pnl_pct = (pos['entry'] - close) / pos['entry']

                pnl = pnl_pct * leverage * pos['margin']
                cap += pnl
                trades.append(pnl)
                pos = None

        # Nouveau signal
        if not pos and cap > 0:
            side = 'LONG' if close > ma else 'SHORT'

            if side == 'LONG':
                sl = close * (1 - sl_pct)
                tp = close * (1 + sl_pct * tp_ratio)
            else:
                sl = close * (1 + sl_pct)
                tp = close * (1 - sl_pct * tp_ratio)

            pos = {
                'side': side,
                'entry': close,
                'sl': sl,
                'tp': tp,
                'margin': cap * 0.05
            }

    # Close final
    if pos:
        close = df.iloc[-1]['close']
        if pos['side'] == 'LONG':
            pnl_pct = (close - pos['entry']) / pos['entry']
        else:
            pnl_pct = (pos['entry'] - close) / pos['entry']
        pnl = pnl_pct * leverage * pos['margin']
        cap += pnl
        trades.append(pnl)

    if not trades:
        return None

    ret = ((cap - 100) / 100) * 100
    wins = [t for t in trades if t > 0]
    wr = (len(wins) / len(trades)) * 100

    return {
        'return': round(ret, 2),
        'trades': len(trades),
        'win_rate': round(wr, 1),
        'wins': len(wins),
        'losses': len(trades) - len(wins)
    }

# Test variations autour de MA20 (baseline: 32.38%)
results = []

print('🧪 Test variations MA20...\n')

# Baseline exact
baseline = (20, 0.00025, 6, 250)
print(f'Testing baseline MA20...')
result = backtest(df, *baseline)
if result:
    results.append({
        'ma': baseline[0],
        'sl': baseline[1],
        'tp': baseline[2],
        'lev': baseline[3],
        **result
    })
    print(f'✅ Baseline: {result["return"]:+.2f}% | WR: {result["win_rate"]:.1f}%')

# Variations SL (autour de 0.00025)
print('\n🔍 Test variations SL...')
for sl in [0.0001, 0.00015, 0.0002, 0.00025, 0.0003, 0.00035, 0.0004]:
    for tp in [5, 6, 7, 8]:
        result = backtest(df, 20, sl, tp, 250)
        if result:
            results.append({
                'ma': 20,
                'sl': sl,
                'tp': tp,
                'lev': 250,
                **result
            })

# Variations MA period (autour de 20)
print('🔍 Test variations MA period...')
for ma in [15, 18, 20, 22, 25]:
    for sl in [0.0002, 0.00025, 0.0003]:
        for tp in [5, 6, 7]:
            result = backtest(df, ma, sl, tp, 250)
            if result:
                results.append({
                    'ma': ma,
                    'sl': sl,
                    'tp': tp,
                    'lev': 250,
                    **result
                })

# Variations leverage
print('🔍 Test variations leverage...')
for lev in [150, 200, 225, 250]:
    for sl in [0.0002, 0.00025, 0.0003]:
        result = backtest(df, 20, sl, 6, lev)
        if result:
            results.append({
                'ma': 20,
                'sl': sl,
                'tp': 6,
                'lev': lev,
                **result
            })

# TP ratios extrêmes
print('🔍 Test TP ratios extrêmes...')
for tp in [4, 5, 6, 7, 8, 9, 10, 12, 15]:
    result = backtest(df, 20, 0.00025, tp, 250)
    if result:
        results.append({
            'ma': 20,
            'sl': 0.00025,
            'tp': tp,
            'lev': 250,
            **result
        })

# SL ultra-serrés
print('🔍 Test SL ultra-serrés...')
for sl in [0.00005, 0.00008, 0.0001, 0.00012, 0.00015]:
    for tp in [8, 10, 12, 15]:
        result = backtest(df, 20, sl, tp, 250)
        if result:
            results.append({
                'ma': 20,
                'sl': sl,
                'tp': tp,
                'lev': 250,
                **result
            })

print(f'\n✅ {len(results)} configurations testées\n')

# Sort par return
results.sort(key=lambda x: x['return'], reverse=True)

# TOP 30
print('='*80)
print('🏆 TOP 30 CONFIGURATIONS')
print('='*80)
print()

for i, r in enumerate(results[:30], 1):
    beat_baseline = "🔥 NOUVEAU CHAMPION!" if r['return'] > 32.38 else ""
    print(f"{i}. MA{r['ma']} | SL {r['sl']*100:.4f}% | TP {r['tp']}:1 | Lev {r['lev']}x")
    print(f"   💵 Return: {r['return']:+.2f}% | WR: {r['win_rate']:.1f}% | Trades: {r['trades']} {beat_baseline}")
    print()

# Champion
if results:
    c = results[0]
    print('='*80)
    print('👑 MEILLEURE CONFIG TROUVÉE')
    print('='*80)
    print(f"MA Period: {c['ma']}")
    print(f"Stop-Loss: {c['sl']*100:.4f}%")
    print(f"Take-Profit: {c['tp']}:1 ratio")
    print(f"Leverage: {c['lev']}x")
    print(f"Return: {c['return']:+.2f}%")
    print(f"Win Rate: {c['win_rate']:.1f}%")
    print(f"Trades: {c['trades']}")

    if c['return'] > 32.38:
        print(f"\n🔥 NOUVEAU RECORD! Amélioration: {c['return'] - 32.38:+.2f}%")
    else:
        print(f"\n⚠️  Pas mieux que baseline (32.38%). Différence: {c['return'] - 32.38:+.2f}%")

    print('='*80)
