SWEEP COMPLETED: 33.2 minutes, 4 workers, ALL 1,024 configs tested KEY FINDINGS: NO zero-signal configs (flip_threshold fix successful) Top strategy: 1.97 PF, 74.7% WR, $2,416 PnL (766 trades) 5× better P&L than v9 baseline ($405 → $2,416) 96% less drawdown than v9 (-$1,360 → -$55) CRITICAL ANOMALY DISCOVERED: flip_threshold=0.35/0.40 generating 3-4× FEWER signals than expected - flip=0.30: 1,271 avg signals (Worker1) ✓ - flip=0.35: 304 avg signals (Worker2) ⚠️ - flip=0.40: 276 avg signals (Worker2) ⚠️ - flip=0.45: 920 avg signals (Worker1) ✓ Expected: 0.30 > 0.35 > 0.40 > 0.45 (linear decrease) Actual: 0.30 (1,271) > 0.45 (920) > 0.35 (304) > 0.40 (276) Possible causes: 1. Indicator bug in mid-range flip detection 2. Worker2 deployment issue (stale code?) 3. Dataset artifact (2024 SOL specific pattern) OPTIMAL PRODUCTION CONFIG: - flip_threshold=0.45 (all top 10 use this) - adx_min=15 (strictest filter, all top 10) - long_pos_max=95, short_pos_min=5 (permissive) - vol_min=0.0 (no volume filter) - RSI parameters DON'T MATTER (identical results) ADX FILTER VALIDATION: adx=0: 1,162 signals (most, as expected) adx=5: 582 signals (50% reduction) adx=10: 572 signals (similar to adx=5) adx=15: 455 signals (least, as expected) NEXT STEPS: 1. Investigate flip=0.35/0.40 anomaly (re-run on Worker1) 2. Forward test flip=0.45, adx=15 config on 2025 data 3. Deploy to production if validation passes Files: - cluster/V11_SWEEP_RESULTS.md (comprehensive analysis) - cluster/v11_results/*.csv (local copies of all 4 chunks)
66 lines
1.9 KiB
Awk
66 lines
1.9 KiB
Awk
BEGIN {
|
|
FS=","
|
|
print "============================================================"
|
|
print "V11 PROGRESSIVE SWEEP RESULTS - 1,024 CONFIGURATIONS"
|
|
print "============================================================"
|
|
}
|
|
NR==1 {next} # Skip header
|
|
{
|
|
flip=$1; adx=$2; trades=$13; pf=$11; wr=$10; pnl=$9
|
|
|
|
# Track by flip_threshold
|
|
flip_sum[flip]+=trades
|
|
flip_cnt[flip]++
|
|
if(trades==0) flip_zero[flip]++
|
|
if(flip_min[flip]=="" || trades<flip_min[flip]) flip_min[flip]=trades
|
|
if(trades>flip_max[flip]) flip_max[flip]=trades
|
|
|
|
# Track by adx
|
|
adx_sum[adx]+=trades
|
|
adx_cnt[adx]++
|
|
if(adx_min[adx]=="" || trades<adx_min[adx]) adx_min[adx]=trades
|
|
if(trades>adx_max[adx]) adx_max[adx]=trades
|
|
|
|
# Track best configs
|
|
if(pf>best_pf) {
|
|
best_pf=pf; best_pf_line=$0
|
|
}
|
|
if(wr>best_wr && trades>50) {
|
|
best_wr=wr; best_wr_line=$0
|
|
}
|
|
if(pnl>best_pnl) {
|
|
best_pnl=pnl; best_pnl_line=$0
|
|
}
|
|
|
|
total++
|
|
}
|
|
END {
|
|
print "\nTOTAL CONFIGS TESTED:", total
|
|
|
|
print "\n" "=" x 60
|
|
print "SIGNAL DISTRIBUTION BY FLIP_THRESHOLD"
|
|
print "=" x 60
|
|
for(f in flip_sum | "sort -n") {
|
|
printf "\nflip=%.2f: %d configs, avg=%.0f, min=%d, max=%d", f, flip_cnt[f], flip_sum[f]/flip_cnt[f], flip_min[f], flip_max[f]
|
|
if(flip_zero[f]>0) printf ", ZEROS=%d ⚠️", flip_zero[f]
|
|
print ""
|
|
}
|
|
|
|
print "\n" "=" x 60
|
|
print "SIGNAL DISTRIBUTION BY ADX_MIN"
|
|
print "=" x 60
|
|
for(a in adx_sum | "sort -n") {
|
|
printf "\nadx=%d: %d configs, avg=%.0f, min=%d, max=%d\n", a, adx_cnt[a], adx_sum[a]/adx_cnt[a], adx_min[a], adx_max[a]
|
|
}
|
|
|
|
print "\n" "=" x 60
|
|
print "TOP CONFIGURATIONS"
|
|
print "=" x 60
|
|
print "\nBEST PROFIT FACTOR:", best_pf
|
|
print best_pf_line
|
|
print "\nBEST WIN RATE (trades>50):", best_wr "%"
|
|
print best_wr_line
|
|
print "\nBEST P&L:", best_pnl
|
|
print best_pnl_line
|
|
}
|