#!/bin/bash
# Walk-forward optimization: optimize Dec 2025, validate Jan 2026
# Uses bot_runner.py directly with settings swaps
# Run: nohup bash walk_forward_v2.sh > results/walk_forward.log 2>&1 &

cd /var/www/html/crpytotradingbot
SETTINGS="settings.py"
LOG="results/walk_forward.log"
RESULTS_CSV="results/walk_forward_results.csv"

# Backup original settings
cp "$SETTINGS" "${SETTINGS}.bak"

echo "WALK-FORWARD OPTIMIZATION"
echo "Started: $(date -u)"
echo "Optimize: Dec 2025 | Validate: Jan 2026"
echo ""

# CSV header
echo "label,rlm,tpt,rpt,lot,period,net_profit,return_pct,max_dd_pct,win_rate,total_trades,gross_profit,gross_loss,commission,max_recovery,final_balance" > "$RESULTS_CSV"

run_config() {
    local LABEL="$1"
    local RLM="$2"
    local TPT="$3"
    local RPT="$4"
    local LOT="$5"
    local PERIOD="$6"
    
    # Swap settings
    sed -i "s/^RECOVERY_LOT_MULTIPLIER = .*/RECOVERY_LOT_MULTIPLIER = ${RLM}/" "$SETTINGS"
    sed -i "s/^THREAD_PROFIT_TARGET = .*/THREAD_PROFIT_TARGET = ${TPT}/" "$SETTINGS"
    sed -i "s/^_REF_RECOVERY_PROFIT_TARGET = .*/_REF_RECOVERY_PROFIT_TARGET = ${RPT}/" "$SETTINGS"
    sed -i "s/^LOT_SIZE = .*/LOT_SIZE = ${LOT}/" "$SETTINGS"
    
    echo -n "  [$LABEL] RLM=$RLM TPT=$TPT RPT=$RPT LOT=$LOT on $PERIOD ... "
    
    # Run backtest
    OUTPUT=$(nice -n 15 python3 bot_runner.py --csv="$PERIOD" --max-rows=2000000 --timeout=480 --throttle=2 2>&1)
    
    # Find latest result JSON
    LATEST_JSON=$(ls -t results/result_*.json 2>/dev/null | head -1)
    
    if [ -n "$LATEST_JSON" ]; then
        NET=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('net_profit',0))")
        RET=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('return_pct',0))")
        DD=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('max_dd_pct',0))")
        WR=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('win_rate',0))")
        TT=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('total_trades',0))")
        GP=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('gross_profit',0))")
        GL=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('gross_loss',0))")
        CM=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('total_commission',0))")
        MR=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('max_recovery_level',0))")
        FB=$(python3 -c "import json; d=json.load(open('$LATEST_JSON')); print(d.get('final_balance',0))")
        
        echo "Net: \$${NET} | DD: ${DD}% | WR: ${WR}%"
        echo "$LABEL,$RLM,$TPT,$RPT,$LOT,$PERIOD,$NET,$RET,$DD,$WR,$TT,$GP,$GL,$CM,$MR,$FB" >> "$RESULTS_CSV"
    else
        echo "FAILED"
        echo "$LABEL,$RLM,$TPT,$RPT,$LOT,$PERIOD,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL,FAIL" >> "$RESULTS_CSV"
    fi
}

echo "=========================================="
echo "PHASE 1: OPTIMIZATION (Dec 2025)"
echo "=========================================="

# Multiplier sweep
run_config "baseline"     1.0  15 30.0 0.03  202512
run_config "mult1.1"      1.1  15 30.0 0.03  202512
run_config "mult1.15"     1.15 15 30.0 0.03  202512
run_config "mult1.2"      1.2  15 30.0 0.03  202512
run_config "mult1.25"     1.25 15 30.0 0.03  202512
run_config "mult1.3"      1.3  15 30.0 0.03  202512
run_config "mult1.5"      1.5  15 30.0 0.03  202512

# Thread profit variants
run_config "tp10"         1.0  10 30.0 0.03  202512
run_config "tp20"         1.0  20 30.0 0.03  202512
run_config "tp25"         1.0  25 30.0 0.03  202512
run_config "m1.25_tp10"   1.25 10 30.0 0.03  202512
run_config "m1.25_tp20"   1.25 20 30.0 0.03  202512

# Recovery profit target variants
run_config "rpt20"        1.0  15 20.0 0.03  202512
run_config "rpt40"        1.0  15 40.0 0.03  202512
run_config "m1.25_rpt20"  1.25 15 20.0 0.03  202512
run_config "m1.25_rpt40"  1.25 15 40.0 0.03  202512

# Lot size variants
run_config "lot0.02"      1.0  15 30.0 0.02  202512
run_config "lot0.04"      1.0  15 30.0 0.04  202512
run_config "m1.25_l0.04"  1.25 15 30.0 0.04  202512

echo ""
echo "=========================================="
echo "PHASE 1 COMPLETE — finding winner..."
echo "=========================================="

# Find best Dec config by score (return / DD, with bonuses)
WINNER=$(python3 << 'PYEOF'
import csv
results = []
with open("results/walk_forward_results.csv") as f:
    reader = csv.DictReader(f)
    for row in reader:
        if row['period'] != '202512' or row['net_profit'] == 'FAIL':
            continue
        net = float(row['net_profit'])
        dd = float(row['max_dd_pct'])
        ret = float(row['return_pct'])
        rar = ret / max(dd, 0.1)
        dd_pen = max(0, (dd - 15) * 2)
        pos_bonus = 5 if net > 0 else 0
        score = rar - dd_pen + pos_bonus
        results.append((score, row['label'], row['rlm'], row['tpt'], row['rpt'], row['lot']))
results.sort(reverse=True)
if results:
    s, lbl, rlm, tpt, rpt, lot = results[0]
    print(f"{lbl},{rlm},{tpt},{rpt},{lot},{s:.2f}")
    # Also print top 5 for the log
    import sys
    print("", file=sys.stderr)
    print("TOP 5 DEC CONFIGS:", file=sys.stderr)
    for i, (sc, lb, *params) in enumerate(results[:5]):
        print(f"  {i+1}. {lb} score={sc:.2f} ({','.join(params)})", file=sys.stderr)
else:
    print("baseline,1.0,15,30.0,0.03,-999")
PYEOF
)

echo "Winner: $WINNER"

IFS=',' read -r W_LABEL W_RLM W_TPT W_RPT W_LOT W_SCORE <<< "$WINNER"

echo ""
echo "=========================================="
echo "PHASE 2: WALK-FORWARD VALIDATION (Jan 2026)"
echo "=========================================="
echo "Running baseline + top configs on Jan 2026..."

# Baseline on Jan
run_config "JAN_baseline"     1.0     15     30.0   0.03    202601

# Winner on Jan
run_config "JAN_${W_LABEL}"   "$W_RLM" "$W_TPT" "$W_RPT" "$W_LOT" 202601

# Also run a few other top configs from dec on Jan for comparison
# Re-parse top 3
python3 << 'PYEOF2' > /tmp/top3.txt
import csv
results = []
with open("results/walk_forward_results.csv") as f:
    reader = csv.DictReader(f)
    for row in reader:
        if row['period'] != '202512' or row['net_profit'] == 'FAIL':
            continue
        net = float(row['net_profit'])
        dd = float(row['max_dd_pct'])
        ret = float(row['return_pct'])
        rar = ret / max(dd, 0.1)
        dd_pen = max(0, (dd - 15) * 2)
        pos_bonus = 5 if net > 0 else 0
        score = rar - dd_pen + pos_bonus
        results.append((score, row['label'], row['rlm'], row['tpt'], row['rpt'], row['lot']))
results.sort(reverse=True)
# Print configs 2 and 3 (skip 1, already running as winner)
for i in [1, 2]:
    if i < len(results):
        s, lbl, rlm, tpt, rpt, lot = results[i]
        print(f"{lbl},{rlm},{tpt},{rpt},{lot}")
PYEOF2

while IFS=',' read -r R_LABEL R_RLM R_TPT R_RPT R_LOT; do
    run_config "JAN_${R_LABEL}" "$R_RLM" "$R_TPT" "$R_RPT" "$R_LOT" 202601
done < /tmp/top3.txt

echo ""
echo "=========================================="
echo "WALK-FORWARD COMPLETE"
echo "=========================================="

# Print final summary
python3 << 'PYEOF3'
import csv

print("\nFINAL RESULTS")
print("="*90)
print(f"{'Phase':<6} {'Config':<20} {'Net P&L':>10} {'Return':>8} {'DD%':>7} {'WR%':>6} {'Trades':>7} {'Commission':>11}")
print("-"*90)

with open("results/walk_forward_results.csv") as f:
    reader = csv.DictReader(f)
    dec_rows = []
    jan_rows = []
    for row in reader:
        if row['net_profit'] == 'FAIL':
            continue
        phase = "DEC" if row['period'] == '202512' else "JAN"
        label = row['label']
        net = float(row['net_profit'])
        ret = float(row['return_pct'])
        dd = float(row['max_dd_pct'])
        wr = float(row['win_rate'])
        tt = int(float(row['total_trades']))
        cm = float(row['commission'])
        line = f"{phase:<6} {label:<20} ${net:>+9,.2f} {ret:>+7.2f}% {dd:>6.1f}% {wr:>5.1f}% {tt:>7} ${cm:>10,.2f}"
        if phase == "DEC":
            dec_rows.append(line)
        else:
            jan_rows.append(line)
    
    for line in dec_rows:
        print(line)
    print("-"*90)
    for line in jan_rows:
        print(line)

print("="*90)
PYEOF3

# Restore original settings
cp "${SETTINGS}.bak" "$SETTINGS"
echo ""
echo "Settings restored to original."
echo "WALK_FORWARD_COMPLETE"
echo "Finished: $(date -u)"
