fix: Correct Smart Validation Queue confirmation threshold in Telegram notification (0.15% → 0.3%)
This commit is contained in:
557
V11_COMPREHENSIVE_ANALYSIS_DEC17_2025.md
Normal file
557
V11_COMPREHENSIVE_ANALYSIS_DEC17_2025.md
Normal file
@@ -0,0 +1,557 @@
|
|||||||
|
# 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:**
|
||||||
|
1. **Stop-loss too tight** (2% SL getting shaken out before trends materialize)
|
||||||
|
2. **Entries too early** (catching falling knives, riding false breakouts)
|
||||||
|
3. **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:**
|
||||||
|
1. **Market trending down Dec 10-16** (bearish period favors SHORTs)
|
||||||
|
2. **LONG filters too loose** (executing bad LONGs)
|
||||||
|
3. **SHORT filters too tight** (rejecting good SHORTs)
|
||||||
|
4. **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)**
|
||||||
|
```typescript
|
||||||
|
// 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:**
|
||||||
|
```typescript
|
||||||
|
// 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:**
|
||||||
|
```bash
|
||||||
|
# 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:**
|
||||||
|
```typescript
|
||||||
|
// 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):**
|
||||||
|
1. **ADX Strength**: +10 to +20 points (higher ADX = higher quality)
|
||||||
|
2. **RSI Position**: +5 to +15 points (neutral RSI = higher quality)
|
||||||
|
3. **Price Position**: -20 points if extreme (chasing penalty)
|
||||||
|
4. **Volume Ratio**: +10 points if healthy (1.0-1.5x)
|
||||||
|
5. **MA Gap Convergence**: +5 to +15 points based on gap size
|
||||||
|
|
||||||
|
### Proposed Quality Formula Redesign (Data-Driven):
|
||||||
|
|
||||||
|
**For LONGs:**
|
||||||
|
1. **Weak ADX Bonus**: +20 points if ADX 15-20 (weak trend = better entries for LONGs)
|
||||||
|
2. **Moderate RSI**: +15 points if RSI 50-65 (not oversold, some momentum)
|
||||||
|
3. **Mid-Range Position**: +10 points if PricePos 40-60 (not extreme)
|
||||||
|
4. **Volume Confirmation**: +10 points if VolRatio 1.0-1.5
|
||||||
|
5. **MA Gap Positive**: +10 points if MA gap > 0 (with trend)
|
||||||
|
|
||||||
|
**For SHORTs (keep similar to current):**
|
||||||
|
1. **Strong ADX Bonus**: +20 points if ADX 20-30 (strong trend)
|
||||||
|
2. **Neutral RSI**: +15 points if RSI 40-50 (not overbought)
|
||||||
|
3. **Mid-Range Position**: +10 points if PricePos 30-50
|
||||||
|
4. **Volume Confirmation**: +10 points if VolRatio 1.0-1.5
|
||||||
|
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:
|
||||||
|
|
||||||
|
1. **Test quality filtering removal** for LONGs (next 10 trades)
|
||||||
|
2. **Widen stop-loss to 3%** (from 2%)
|
||||||
|
3. **Lower LONG quality threshold to 75+** (from 90+)
|
||||||
|
4. **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)
|
||||||
@@ -189,9 +189,12 @@ export const DEFAULT_TRADING_CONFIG: TradingConfig = {
|
|||||||
useTp2AsTriggerOnly: true, // Default: TP2=0 acts as trigger only (no on-chain TP2 order)
|
useTp2AsTriggerOnly: true, // Default: TP2=0 acts as trigger only (no on-chain TP2 order)
|
||||||
|
|
||||||
// Signal Quality (Direction-specific thresholds - Nov 23, 2025 DATA-DRIVEN UPDATE)
|
// Signal Quality (Direction-specific thresholds - Nov 23, 2025 DATA-DRIVEN UPDATE)
|
||||||
|
// V11_V2 TEST (Dec 17, 2025): LONG quality bypass to validate filtering hypothesis
|
||||||
minSignalQualityScore: 91, // Global fallback (unchanged)
|
minSignalQualityScore: 91, // Global fallback (unchanged)
|
||||||
minSignalQualityScoreLong: 90, // LONGS: 71.4% WR at quality 90-94 (+$44.77 on 7 trades, +$6.40 avg)
|
minSignalQualityScoreLong: 0, // V11_V2 TEST: DISABLED (was 90) - accept ALL LONG signals
|
||||||
minSignalQualityScoreShort: 95, // SHORTS: Keep strict (quality 90-94 = 28.6% WR, -$553.76 on 7 trades)
|
minSignalQualityScoreShort: 90, // V11_V2 TEST: PRESERVED at 90 (working at 62.5% WR)
|
||||||
|
// TEST HYPOTHESIS: If quality filtering backward, disabling for LONGs should improve WR from 33.3% to 50%+
|
||||||
|
// TEST DATA: Blocked LONGs 100% success (4/4), Executed LONGs 33.3% success (2/6)
|
||||||
// Historical validation: Quality 90+ longs = 50% WR +$600.62 (38 trades), shorts = 47.4% WR -$177.90
|
// Historical validation: Quality 90+ longs = 50% WR +$600.62 (38 trades), shorts = 47.4% WR -$177.90
|
||||||
// v8 data: 3 longs 100% WR +$565, 7 shorts 42.9% WR -$311
|
// v8 data: 3 longs 100% WR +$565, 7 shorts 42.9% WR -$311
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ ${directionEmoji} ${options.symbol} ${options.direction.toUpperCase()}
|
|||||||
📍 Price: $${options.originalPrice.toFixed(2)}
|
📍 Price: $${options.originalPrice.toFixed(2)}
|
||||||
|
|
||||||
🧠 Watching for price confirmation...
|
🧠 Watching for price confirmation...
|
||||||
✅ Will enter if ${options.direction === 'long' ? '+0.15%' : '-0.15%'}
|
✅ Will enter if ${options.direction === 'long' ? '+0.3%' : '-0.3%'}
|
||||||
❌ Will abandon if ${options.direction === 'long' ? '-1.0%' : '+1.0%'}
|
❌ Will abandon if ${options.direction === 'long' ? '-1.0%' : '+1.0%'}
|
||||||
`
|
`
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -271,6 +271,52 @@ rsiShortOk = not useRsiFilter or (rsi14 >= rsiShortMin and rsi14 <= rsiShortMax)
|
|||||||
finalLongSignal = buyReady and longOk and adxOk and longBufferOk and rsiLongOk and longPositionOk and volumeOk
|
finalLongSignal = buyReady and longOk and adxOk and longBufferOk and rsiLongOk and longPositionOk and volumeOk
|
||||||
finalShortSignal = sellReady and shortOk and adxOk and shortBufferOk and rsiShortOk and shortPositionOk and volumeOk
|
finalShortSignal = sellReady and shortOk and adxOk and shortBufferOk and rsiShortOk and shortPositionOk and volumeOk
|
||||||
|
|
||||||
|
// DEBUG: Show why signals are blocked when trend flips
|
||||||
|
showDebugLabels = input.bool(true, "Show debug labels when signals blocked", group="Debug")
|
||||||
|
var label debugLbl = na
|
||||||
|
|
||||||
|
if showDebugLabels and (buyReady or sellReady)
|
||||||
|
var string debugText = ""
|
||||||
|
var color debugColor = color.gray
|
||||||
|
|
||||||
|
if buyReady and not finalLongSignal
|
||||||
|
// Trend flipped to LONG but signal blocked - show why
|
||||||
|
debugText := "❌ LONG BLOCKED:\n"
|
||||||
|
if not longOk
|
||||||
|
debugText += "MACD ✗\n"
|
||||||
|
if not adxOk
|
||||||
|
debugText += "ADX " + str.tostring(adxVal, "#.#") + " < " + str.tostring(adxMin) + " ✗\n"
|
||||||
|
if not longBufferOk
|
||||||
|
debugText += "Entry Buffer ✗\n"
|
||||||
|
if not rsiLongOk
|
||||||
|
debugText += "RSI " + str.tostring(rsi14, "#.#") + " not in " + str.tostring(rsiLongMin) + "-" + str.tostring(rsiLongMax) + " ✗\n"
|
||||||
|
if not longPositionOk
|
||||||
|
debugText += "Price Pos " + str.tostring(pricePosition, "#.#") + "% > " + str.tostring(longPosMax) + "% ✗\n"
|
||||||
|
if not volumeOk
|
||||||
|
debugText += "Volume " + str.tostring(volumeRatio, "#.##") + " not in " + str.tostring(volMin) + "-" + str.tostring(volMax) + " ✗\n"
|
||||||
|
debugColor := color.new(color.red, 30)
|
||||||
|
label.delete(debugLbl)
|
||||||
|
debugLbl := label.new(bar_index, high, text=debugText, yloc=yloc.price, style=label.style_label_down, textcolor=color.white, color=debugColor, size=size.small)
|
||||||
|
|
||||||
|
else if sellReady and not finalShortSignal
|
||||||
|
// Trend flipped to SHORT but signal blocked - show why
|
||||||
|
debugText := "❌ SHORT BLOCKED:\n"
|
||||||
|
if not shortOk
|
||||||
|
debugText += "MACD ✗\n"
|
||||||
|
if not adxOk
|
||||||
|
debugText += "ADX " + str.tostring(adxVal, "#.#") + " < " + str.tostring(adxMin) + " ✗\n"
|
||||||
|
if not shortBufferOk
|
||||||
|
debugText += "Entry Buffer ✗\n"
|
||||||
|
if not rsiShortOk
|
||||||
|
debugText += "RSI " + str.tostring(rsi14, "#.#") + " not in " + str.tostring(rsiShortMin) + "-" + str.tostring(rsiShortMax) + " ✗\n"
|
||||||
|
if not shortPositionOk
|
||||||
|
debugText += "Price Pos " + str.tostring(pricePosition, "#.#") + "% < " + str.tostring(shortPosMin) + "% ✗\n"
|
||||||
|
if not volumeOk
|
||||||
|
debugText += "Volume " + str.tostring(volumeRatio, "#.##") + " not in " + str.tostring(volMin) + "-" + str.tostring(volMax) + " ✗\n"
|
||||||
|
debugColor := color.new(color.orange, 30)
|
||||||
|
label.delete(debugLbl)
|
||||||
|
debugLbl := label.new(bar_index, low, text=debugText, yloc=yloc.price, style=label.style_label_up, textcolor=color.white, color=debugColor, size=size.small)
|
||||||
|
|
||||||
plotshape(finalLongSignal, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.circle, size=size.small)
|
plotshape(finalLongSignal, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.circle, size=size.small)
|
||||||
plotshape(finalShortSignal, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.circle, size=size.small)
|
plotshape(finalShortSignal, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.circle, size=size.small)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user