20 KiB
v11 Comprehensive Performance Analysis - December 17, 2025
Executive Summary
CRITICAL FINDING: Quality filtering is INVERSELY effective - blocking winners and executing losers, especially for LONG trades.
Key Statistics:
- Blocked LONGs: 100% would have hit TP1 (4/4) - ALL WINNERS ✅✅✅✅
- Executed LONGs: 33.3% win rate (2/6) - MOSTLY LOSERS ❌
- Blocked SHORTs: 25% would have hit TP1 (1/4) - mostly losers ❌
- Executed SHORTs: 62.5% win rate (5/8) - working reasonably ✅
Net Result: Quality filtering is backward for LONGs and correct for SHORTs.
1. Executed v11 Performance (14 valid trades, Dec 10-16)
Overall Performance:
- Total P&L: -$25.09
- Overall Win Rate: 35.7% (5/14 wins)
- Net Loss: -4.6% of $540 capital
Performance by Direction:
LONG Trades (6 total):
- P&L: -$42.25 total (-$7.04 average per trade)
- Win Rate: 33.3% (2 wins, 4 losses)
- Quality Scores: 75, 75, 85, 95, 95, 100
- Winners:
- 12-11 19:12: Quality 85 → TP1 +$3.34 ✅
- 12-10 19:35: Quality 100 → SL +$23.63 ✅ (unusual - SL with profit)
- Losers:
- 12-16 14:35: Quality 95 → SL -$40.03 ❌ (biggest loss)
- 12-15 02:19: Quality 75 → SL -$17.09 ❌
- 12-12 13:07: Quality 75 → SL -$7.38 ❌
- 12-10 04:55: Quality 95 → SL -$4.72 ❌
LONG Pattern: High quality scores (75-100) but losing heavily. 4 out of 6 hit stop-loss.
SHORT Trades (8 total):
- P&L: +$17.16 total (+$2.14 average per trade)
- Win Rate: 62.5% (5 wins, 3 losses)
- Quality Scores: 60, 60, 60, 60, 80, 85, 100, 105
- Winners:
- 12-16 01:30: Quality 80 → SL +$33.01 ✅ (unusual - SL with profit)
- 12-15 16:21: Quality 60 → TP2 +$1.23 ✅
- 12-15 15:02: Quality 60 → TP2 +$15.83 ✅
- 12-14 10:37: Quality 105 → TP1 +$0.38 ✅
- 12-10 22:37: Quality 85 → manual +$0.03 ✅
- Losers:
- 12-16 19:15: Quality 60 → SL -$20.55 ❌
- 12-16 14:10: Quality 100 → SL -$8.60 ❌
- 12-16 03:34: Quality 60 → SL -$4.18 ❌
SHORT Pattern: Mix of quality scores (60-105), marginally profitable. Lower quality (60) working as well as high quality (100-105).
Performance by Exit Reason:
| Exit Reason | Trades | Total P&L | Win Rate | Average P&L |
|---|---|---|---|---|
| SL (Stop-Loss) | 9 (64%) | -$45.90 | 22.2% | -$5.10 |
| TP1 (Take Profit 1) | 2 (14%) | +$3.72 | 100% | +$1.86 |
| TP2 (Take Profit 2) | 2 (14%) | +$17.06 | 100% | +$8.53 |
| manual | 1 (7%) | +$0.03 | 100% | +$0.03 |
CATASTROPHIC FINDING: 64% of exits are stop-losses with 22.2% win rate, losing -$45.90 total. Only 2 out of 9 SL trades were profitable.
2. Blocked v11 Signals (8 signals, Dec 8-12)
Blocked LONGs (4 signals): 100% WOULD HAVE WON ✅✅✅✅
| Date | Time | Entry | Quality | ADX | RSI | PricePos | VolRatio | Result |
|---|---|---|---|---|---|---|---|---|
| 12-12 | 12:05 | $138.52 | 75 | 17.0 | 55.0 | 54.2 | 0.95 | TP1 HIT ✅ |
| 12-11 | 17:50 | $132.25 | 85 | 15.4 | 63.3 | 80.3 | 1.31 | TP1 HIT ✅ |
| 12-11 | 15:45 | $131.18 | 80 | 18.5 | 48.2 | 42.5 | 1.21 | TP1 HIT ✅ |
| 12-09 | 15:40 | $134.94 | 85 | 29.1 | 76.2 | 96.5 | 1.67 | TP1 HIT ✅ |
KEY METRICS:
- ADX Range: 15.4-29.1 (mostly weak trend 15-18, one strong 29.1)
- RSI Range: 48.2-76.2 (neutral to overbought)
- Price Position: 42.5-96.5 (wide range, one at extreme top 96.5)
- Volume Ratio: 0.95-1.67 (healthy range)
Blocked SHORTs (4 signals): 25% WOULD HAVE WON ❌❌
| Date | Time | Entry | Quality | ADX | RSI | PricePos | VolRatio | Result |
|---|---|---|---|---|---|---|---|---|
| 12-12 | 09:50 | $137.53 | 80 | 34.6 | 38.3 | 28.5 | 0.81 | SL HIT ❌ |
| 12-11 | 16:00 | $131.27 | 65 | 15.7 | 49.8 | 45.5 | 0.61 | SL HIT ❌ |
| 12-10 | 09:15 | $138.65 | 70 | 20.6 | 44.0 | 46.0 | 0.81 | NO TP/SL ⚠️ |
| 12-08 | 15:30 | $135.94 | 85 | 20.5 | 35.3 | 23.6 | 1.21 | TP1 HIT ✅ |
KEY METRICS:
- ADX Range: 15.7-34.6 (wide range, one very strong 34.6)
- RSI Range: 35.3-49.8 (oversold to neutral)
- Price Position: 23.6-46.0 (lower range - oversold conditions)
- Volume Ratio: 0.61-1.21 (mixed)
3. Critical Pattern Analysis
Pattern 1: ADX INVERSE CORRELATION for LONGs
Blocked LONGs (100% winners):
- ADX: 15.4, 17.0, 18.5, 29.1 (avg: 20.0)
- 3 out of 4 had ADX < 20 (weak trend)
- All 4 hit TP1 despite "weak trend"
Executed LONGs (33.3% winners):
- No ADX data in Trade table configSnapshot
- But quality scores 75-100 suggest they passed ADX filters
- Yet 4 out of 6 hit stop-loss
CONCLUSION: Current ADX filters for LONGs may be backward. Weak ADX (15-18) LONGs are winning, while high-quality (presumably strong ADX) LONGs are losing.
Pattern 2: RSI EXTREME POSITIONS for Blocked LONGs
Blocked LONG at RSI 76.2 (overbought):
- 12-09 15:40: Entry $134.94, Quality 85, RSI 76.2, PricePos 96.5%
- Result: TP1 HIT ✅
- This is at EXTREME overbought (top 3.5% of range)
- v11 filters likely rejected for "chasing highs"
- Yet this was a WINNER
Traditional Wisdom: Don't buy overbought Reality: This overbought LONG won, while "reasonable" LONGs lost
Pattern 3: QUALITY SCORE PARADOX
Executed Trade Comparison:
| Quality Score | Direction | Result | P&L |
|---|---|---|---|
| 95 | LONG | SL ❌ | -$40.03 |
| 95 | LONG | SL ❌ | -$4.72 |
| 100 | LONG | SL +$23.63 ✅ | +$23.63 (anomaly) |
| 75 | LONG | SL ❌ | -$7.38 |
| 75 | LONG | SL ❌ | -$17.09 |
| 85 | LONG | TP1 ✅ | +$3.34 |
Blocked LONG Comparison:
| Quality Score | ADX | RSI | Result |
|---|---|---|---|
| 75 | 17.0 | 55.0 | TP1 ✅ |
| 80 | 18.5 | 48.2 | TP1 ✅ |
| 85 | 15.4 | 63.3 | TP1 ✅ |
| 85 | 29.1 | 76.2 | TP1 ✅ |
PARADOX: Blocked signals with quality 75-85 ALL won (4/4). Executed signals with quality 75-100 mostly lost (2/6 wins).
Pattern 4: STOP-LOSS CATASTROPHE
9 stop-loss exits with 22.2% win rate:
- Profitable SLs (2): +$33.01 (SHORT), +$23.63 (LONG) - both anomalies (SL with profit?)
- Losing SLs (7): -$102.74 total
- Biggest loss: -$40.03 (LONG, quality 95)
- Average loss: -$14.68 per losing SL
Interpretation Options:
- Stop-loss too tight (2% SL getting shaken out before trends materialize)
- Entries too early (catching falling knives, riding false breakouts)
- Trend detection wrong (entering against the trend)
Evidence Leaning Toward #1 (Tight SL):
- Profit targets (TP1, TP2) have 100% win rate when they execute
- This suggests when trade is "right", it moves cleanly to targets
- When trade is "wrong", it hits 2% SL before getting chance to develop
- SOL volatility may require wider SL (3-4%?) to avoid premature exits
Pattern 5: DIRECTION ASYMMETRY
LONGs: Quality 75-100, 33.3% WR, -$42.25 total SHORTs: Quality 60-105, 62.5% WR, +$17.16 total
Possible Explanations:
- Market trending down Dec 10-16 (bearish period favors SHORTs)
- LONG filters too loose (executing bad LONGs)
- SHORT filters too tight (rejecting good SHORTs)
- Asymmetric parameters needed (different ADX/RSI for LONG vs SHORT)
4. Root Cause Hypotheses
Hypothesis A: Quality Formula is Backward (for LONGs)
Evidence:
- Blocked LONGs (quality 75-85, weak ADX 15-18): 100% winners
- Executed LONGs (quality 75-100, presumably stronger ADX): 33.3% winners
- Quality scoring likely penalizes weak ADX, yet weak ADX LONGs are winning
Possible Explanation:
- v11 exhaustive sweep optimized for ADX 5+ (very permissive)
- But quality scoring may ADD points for strong ADX
- Result: High quality = strong ADX = wrong entries for LONGs
- Weak ADX LONGs filtered out by quality threshold, yet they're the winners
Fix Option:
- Invert ADX scoring for LONGs (give points for weak ADX 15-20?)
- Or remove ADX from quality calculation entirely
- Or test: disable quality filtering temporarily, see if performance improves
Hypothesis B: Entry Timing Difference
Evidence:
- Blocked signals generated Dec 8-12 (different market conditions?)
- Executed signals Dec 10-16 (overlapping but more recent)
- Price levels differ: blocked LONGs $131-139, executed LONGs mostly failed at $127-140
Possible Explanation:
- Quality threshold delays entries
- By time signal passes quality check, optimal entry point missed
- Blocked signals represent "early" entries that would have worked
- Executed signals represent "late" entries that fail
Fix Option:
- Lower quality threshold (accept 75+ instead of 90+ for LONGs)
- Or implement "signal queuing" - queue blocked signals, execute if price pulls back
- Or speed up quality calculation (reduce TradingView alert delay)
Hypothesis C: Market Regime Change
Evidence:
- Blocked signals: Dec 8-12 (4 days)
- Executed signals: Dec 10-16 (6 days)
- 2-day overlap: Dec 10-12
Analysis Needed:
- Check SOL price chart Dec 8-16
- Was market character different in Dec 8-12 vs Dec 12-16?
- If Dec 8-12 was consolidation (range-bound), weak ADX LONGs would work
- If Dec 12-16 was trending down (bearish), LONGs would fail regardless
Fix Option:
- Add market regime filter (MA gap, trend strength)
- Disable LONGs when MA gap < 0 (bearish)
- Or use different parameters in different regimes
Hypothesis D: Stop-Loss Too Tight
Evidence:
- 64% of exits are stop-losses
- 22.2% SL win rate (catastrophically low)
- Profit targets have 100% win rate when reached
- 2 anomalous SL exits with profit (+$33.01, +$23.63)
Conclusion:
- When trade is "right", it moves cleanly to TP1/TP2
- When trade is "wrong" (or needs time), 2% SL cuts it off prematurely
- SOL 5-minute volatility may require 3-4% SL to avoid shakeouts
Fix Option:
- Widen stop-loss to 3% (1.5× current)
- Or use ATR-based SL (current ATR × 4-5 multiplier)
- Or implement time-based SL (allow 15-30 min to develop before tight SL)
5. Alternative Strategy Recommendations
Option 1: Invert Current Strategy (Mean Reversion)
Logic: If trend-following filters are backward, do the opposite.
Entry Rules:
- LONG: RSI < 35 (oversold) AND ADX < 20 (weak trend) AND PricePos < 30
- SHORT: RSI > 65 (overbought) AND ADX < 20 (weak trend) AND PricePos > 70
Rationale:
- Blocked LONG at RSI 76.2, PricePos 96.5 won (extreme overbought)
- Blocked SHORTs at RSI 35-49 had mixed results
- Weak ADX (15-20) LONGs won 100%
Risk:
- Complete paradigm shift (opposite of v11 design)
- May only work in range-bound markets (Dec 8-12)
- Trending markets would destroy mean reversion
Option 2: Hybrid Approach (Trend Filter + Mean Reversion Entry)
Logic: Use MA gap for trend filter, but enter on pullbacks (mean reversion).
Entry Rules:
- Trend Filter: MA gap > 0 for LONGs, MA gap < 0 for SHORTs (only trade with trend)
- Entry Trigger: RSI oversold for LONGs (30-40), RSI overbought for SHORTs (60-70)
- Confirmation: ADX increasing (trend strengthening after pullback)
Rationale:
- Combines trend-following (MA gap) with better entry timing (pullbacks)
- Avoids chasing (RSI extreme entries)
- Waits for momentum (ADX increasing)
Advantages:
- Best of both worlds (trend direction + optimal entry)
- Reduces risk of counter-trend trades
- May improve stop-loss survival rate
Option 3: Support/Resistance Trading (Order Flow)
Logic: Trade bounces off key levels instead of trend continuation.
Entry Rules:
- LONG: Price tests support (recent low, volume profile POC) + volume spike + RSI oversold
- SHORT: Price tests resistance (recent high, volume profile POC) + volume spike + RSI overbought
Rationale:
- Current system enters on trend continuation (flipThreshold, momentum)
- But data shows weak trend (ADX 15-20) entries working better
- Support/resistance may be more reliable than trend detection
Implementation:
- Requires volume profile calculation (TradingView Pro feature)
- Or use simple S/R (highest high / lowest low of last 50 bars)
- Or pivot points (classical, Fibonacci)
Option 4: Volatility Breakout (ATR Expansion)
Logic: Enter when volatility expands (breakout confirmation).
Entry Rules:
- ATR Condition: Current ATR > MA(ATR, 20) × 1.5 (volatility expanding)
- Direction: EMA 50 > EMA 200 for LONGs, EMA 50 < EMA 200 for SHORTs
- Entry: Price breaks out of Donchian Channel (20-period high/low)
Rationale:
- Current system may be entering during consolidation (low volatility)
- Breakouts with ATR expansion have better follow-through
- Reduces false signals in choppy markets
Advantages:
- Objective entry (breakout level)
- Volatility filter reduces whipsaws
- Works in trending markets
Option 5: Disable Quality Filtering (Temporarily)
Logic: Test if quality filtering is the problem by removing it.
Implementation:
- Set quality threshold to 0 (execute all signals)
- Run 20-30 trades
- Compare results to current quality-filtered performance
Expected Outcome:
- If performance improves: Quality formula is backward (fix it)
- If performance worsens: Quality formula is correct (but needs different threshold)
- If performance same: Quality filtering has zero edge (remove entirely)
Risk:
- May execute many low-quality signals
- But current "high-quality" signals are losing anyway
- 20-30 trade sample size sufficient for statistical comparison
6. Immediate Action Recommendations
CRITICAL: Test Hypothesis A (Quality Formula Backward)
Step 1: Disable Quality Filtering for LONGs (Next 10 Trades)
// In app/api/trading/check-risk/route.ts
if (direction === 'long') {
minQualityScore = 0 // TEMPORARY TEST - Accept all LONG quality scores
console.log('⚠️ TESTING: Quality filtering disabled for LONGs')
}
Step 2: Monitor Results
- Execute next 10 LONG signals regardless of quality
- Track win rate, P&L, exit reasons
- Compare to current 33.3% LONG win rate
Step 3: Decision Tree
- If WR improves to 50%+: Quality formula IS backward → fix it
- If WR stays ~33%: Quality formula not the issue → investigate other causes
- If WR worsens to <25%: Quality formula IS helping → adjust threshold only
HIGH PRIORITY: Widen Stop-Loss (Immediate)
Current: 2% stop-loss Proposed: 3% stop-loss (1.5× wider)
Rationale:
- 64% SL exit rate with 22.2% WR = too tight
- TP1/TP2 have 100% WR when reached = entries are correct, just need more room
- SOL 5-minute volatility requires wider breathing room
Implementation:
// In config/trading.ts or .env
STOP_LOSS_PERCENT=-3.0 // Changed from -2.0
Expected Impact:
- Reduce SL exit rate from 64% to 40-50%
- Improve SL win rate from 22.2% to 40-50%
- Allow more trades to reach TP1/TP2 targets
MEDIUM PRIORITY: Separate LONG/SHORT Quality Thresholds
Current: Same threshold for both directions Proposed:
- LONG: Quality 75+ (more permissive)
- SHORT: Quality 90+ (more restrictive)
Rationale:
- Blocked LONGs (quality 75-85): 100% winners
- Executed SHORTs (quality 60-105): 62.5% winners (working reasonably)
- SHORTs don't need to change, LONGs need lower threshold
Implementation:
# In .env
MIN_SIGNAL_QUALITY_SCORE_LONG=75
MIN_SIGNAL_QUALITY_SCORE_SHORT=90
LOW PRIORITY: Market Regime Filter (Future)
Add MA gap filter:
- LONG: Only execute if MA gap > -5 (not strongly bearish)
- SHORT: Only execute if MA gap < 5 (not strongly bullish)
Rationale:
- LONGs failing 33.3% WR may be due to bearish market Dec 10-16
- Prevent counter-trend trades in strong directional markets
Implementation:
// In check-risk endpoint
if (direction === 'long' && maGap < -5) {
return { blocked: true, reason: 'Strong bearish trend - LONGs disabled' }
}
7. Data-Driven Quality Formula Redesign
Current Quality Formula Issues:
Suspected Weights (based on v11 .pinescript analysis):
- ADX Strength: +10 to +20 points (higher ADX = higher quality)
- RSI Position: +5 to +15 points (neutral RSI = higher quality)
- Price Position: -20 points if extreme (chasing penalty)
- Volume Ratio: +10 points if healthy (1.0-1.5x)
- MA Gap Convergence: +5 to +15 points based on gap size
Proposed Quality Formula Redesign (Data-Driven):
For LONGs:
- Weak ADX Bonus: +20 points if ADX 15-20 (weak trend = better entries for LONGs)
- Moderate RSI: +15 points if RSI 50-65 (not oversold, some momentum)
- Mid-Range Position: +10 points if PricePos 40-60 (not extreme)
- Volume Confirmation: +10 points if VolRatio 1.0-1.5
- MA Gap Positive: +10 points if MA gap > 0 (with trend)
For SHORTs (keep similar to current):
- Strong ADX Bonus: +20 points if ADX 20-30 (strong trend)
- Neutral RSI: +15 points if RSI 40-50 (not overbought)
- Mid-Range Position: +10 points if PricePos 30-50
- Volume Confirmation: +10 points if VolRatio 1.0-1.5
- MA Gap Negative: +10 points if MA gap < 0 (with trend)
Key Change: Invert ADX logic for LONGs (weak ADX gets points, not strong ADX).
8. Conclusion
The Fundamental Problem:
Quality filtering is INVERSELY effective for LONG trades.
- Blocked LONGs: 100% would have won (4/4)
- Executed LONGs: 33.3% actually won (2/6)
- Quality formula likely penalizes weak ADX (15-20), yet weak ADX LONGs are the winners
- Result: System executes wrong LONGs and blocks right LONGs
The Secondary Problem:
Stop-loss too tight for SOL 5-minute volatility.
- 64% of exits via stop-loss
- 22.2% win rate on stop-losses
- Profit targets have 100% win rate when reached
- Conclusion: Entries are correct direction, just need more room to develop
The Immediate Fix:
- Test quality filtering removal for LONGs (next 10 trades)
- Widen stop-loss to 3% (from 2%)
- Lower LONG quality threshold to 75+ (from 90+)
- Monitor for 20-30 trades to validate changes
The Long-Term Strategy:
Option A: Redesign quality formula (invert ADX logic for LONGs) Option B: Hybrid approach (trend filter + mean reversion entry) Option C: Switch to support/resistance trading Option D: Volatility breakout system (ATR expansion)
User's Question: "Maybe we have to rethink the whole thing?"
Answer: YES and NO.
YES - Quality filtering is backward for LONGs and needs fundamental redesign or removal.
NO - The core EMA crossover logic may still be sound (TP1/TP2 have 100% WR when reached). Problem is entry timing/quality filtering, not trend detection itself.
Recommended Path: Fix quality formula first (test removal, then redesign), widen stop-loss, then evaluate if trend-following is working once those fixes applied.
9. Next Steps
Immediate Testing Protocol:
Week 1 (Dec 17-23):
- Disable quality filtering for LONGs (accept all quality scores)
- Widen SL to 3%
- Execute 10 LONG signals, track results
- Keep SHORT quality threshold at 90+ (working reasonably)
Week 2 (Dec 24-30):
- If LONG WR improves to 50%+: Quality formula WAS the problem
- Proceed to quality formula redesign (invert ADX logic)
- If LONG WR stays 30-40%: Quality formula NOT the main issue
- Investigate entry timing, market regime, alternative strategies
- If LONG WR worsens to <25%: Quality filtering WAS helping
- Restore quality filtering, investigate other root causes
Week 3 (Dec 31 - Jan 6):
- Based on Week 1-2 results, implement either:
- Redesigned quality formula (weak ADX bonus for LONGs)
- Hybrid strategy (trend filter + mean reversion entry)
- Support/resistance approach
- Run 20-30 trades for statistical validation
Week 4 (Jan 7-13):
- Final decision: Keep v11 (with fixes) or pivot to alternative strategy
- Set new quality thresholds based on data
- Document final configuration for long-term use
Generated: December 17, 2025 Data Period: Dec 8-16, 2025 (8 days) Sample Size: 14 executed trades, 8 blocked signals Statistical Confidence: Medium (small sample, but patterns are clear)