Files
EA2/smart-bot/MTF_SCORE_BALANCE_FIX.md
T
2026-05-24 20:22:43 +07:00

139 lines
5.6 KiB
Markdown

# MTF Score Balance Fix - Menyeimbangkan Buy dan Sell Signals
## Masalah yang Ditemukan
User melaporkan bahwa `sell_score` selalu lebih tinggi dari `buy_score` dan sering sama dengan `mtf.total_score`, yang menyebabkan dominasi sinyal sell dan kurangnya sinyal buy.
## Root Cause Analysis
Setelah investigasi mendalam, ditemukan masalah utama:
### 1. Overlap Kondisi RSI yang Berlebihan
Kondisi buy dan sell untuk RSI memiliki overlap yang sangat besar:
**Sebelum perbaikan:**
- **H1**: Buy < 60, Sell > 40 → **Overlap: 40-60** (20 poin overlap!)
- **M15**: Buy < 55, Sell > 45 → **Overlap: 45-55** (10 poin overlap!)
- **M5**: Buy < 50, Sell > 50 → **Overlap: 50** (1 poin overlap)
- **M1**: Buy < 45, Sell > 55 → **Overlap: 45-55** (10 poin overlap!)
**Setelah perbaikan:**
- **H1**: Buy < 45, Sell > 55 → **Overlap: TIDAK ADA**
- **M15**: Buy < 45, Sell > 55 → **Overlap: TIDAK ADA**
- **M5**: Buy < 45, Sell > 55 → **Overlap: TIDAK ADA**
- **M1**: Buy < 45, Sell > 55 → **Overlap: TIDAK ADA**
### 2. Overlap Kondisi Stochastic yang Berlebihan
Kondisi buy dan sell untuk Stochastic juga memiliki overlap:
**Sebelum perbaikan:**
- **H1**: Buy < 50, Sell > 50 → **Overlap: 50** (1 poin overlap)
- **M15**: Buy < 45, Sell > 55 → **Overlap: 45-55** (10 poin overlap!)
- **M5**: Buy < 40, Sell > 60 → **Overlap: 40-60** (20 poin overlap!)
- **M1**: Buy < 35, Sell > 65 → **Overlap: 35-65** (30 poin overlap!)
**Setelah perbaikan:**
- **H1**: Buy < 30, Sell > 70 → **Overlap: TIDAK ADA**
- **M15**: Buy < 30, Sell > 70 → **Overlap: TIDAK ADA**
- **M5**: Buy < 30, Sell > 70 → **Overlap: TIDAK ADA**
- **M1**: Buy < 30, Sell > 70 → **Overlap: TIDAK ADA**
### 3. Masalah ADX yang Sama untuk Buy dan Sell
**Masalah utama yang ditemukan:** ADX digunakan untuk kedua kondisi buy dan sell, menyebabkan bias.
**Sebelum perbaikan:**
```cpp
bool h1_adx_ok = (h1_adx >= 5); // Sama untuk buy dan sell
// Buy conditions: EMA + RSI + ADX + Stoch
// Sell conditions: !EMA + RSI + ADX + Stoch
```
**Masalah:** Jika ADX tinggi (trend kuat), kedua sinyal buy dan sell mendapat poin tambahan, tapi sell sudah lebih dominan karena trend down.
**Setelah perbaikan:**
```cpp
bool h1_adx_buy = (h1_adx >= 5 && h1_ema_up); // ADX tinggi DAN EMA UP untuk buy
bool h1_adx_sell = (h1_adx >= 5 && !h1_ema_up); // ADX tinggi DAN EMA DOWN untuk sell
```
**Keuntungan:** ADX sekarang spesifik untuk arah trend, tidak lagi bias ke satu sisi.
## Dampak Masalah
1. **Kedua kondisi buy dan sell bisa terpenuhi bersamaan** dalam range overlap
2. **`buy_score` dan `sell_score` keduanya bertambah** ketika ada overlap
3. **Kondisi sell lebih mudah terpenuhi** karena range yang lebih luas
4. **ADX memberikan poin tambahan untuk kedua sisi**, memperkuat bias sell
5. **`sell_score` cenderung lebih tinggi** dari `buy_score`
6. **`mtf.total_score` selalu mengambil nilai tertinggi**, jadi sering sama dengan `sell_score`
## Perbaikan yang Dilakukan
### 1. Menyeimbangkan Kondisi RSI
```cpp
// SEBELUM (dengan overlap besar)
bool h1_rsi_buy = (h1_rsi < 60); // Range: 0-60
bool h1_rsi_sell = (h1_rsi > 40); // Range: 40-100
// SESUDAH (tanpa overlap)
bool h1_rsi_buy = (h1_rsi < 45); // Range: 0-45
bool h1_rsi_sell = (h1_rsi > 55); // Range: 55-100
```
### 2. Menyeimbangkan Kondisi Stochastic
```cpp
// SEBELUM (dengan overlap)
bool h1_stoch_buy = (h1_stoch_k < 50); // Range: 0-50
bool h1_stoch_sell = (h1_stoch_k > 50); // Range: 50-100
// SESUDAH (tanpa overlap)
bool h1_stoch_buy = (h1_stoch_k < 30); // Range: 0-30
bool h1_stoch_sell = (h1_stoch_k > 70); // Range: 70-100
```
### 3. Memperbaiki Kondisi ADX
```cpp
// SEBELUM (bias ke sell)
bool h1_adx_ok = (h1_adx >= 5); // Sama untuk buy dan sell
// Buy: EMA + RSI + ADX + Stoch
// Sell: !EMA + RSI + ADX + Stoch
// SESUDAH (spesifik arah)
bool h1_adx_buy = (h1_adx >= 5 && h1_ema_up); // ADX tinggi DAN EMA UP
bool h1_adx_sell = (h1_adx >= 5 && !h1_ema_up); // ADX tinggi DAN EMA DOWN
```
### 4. Menambahkan Debug Logging
```cpp
// Debug: Log individual strengths
EssentialLog("🔍 MTF Strengths - H1: Buy=" + DoubleToString(mtf.h1_buy_strength, 1) + " Sell=" + DoubleToString(mtf.h1_sell_strength, 1) +
" | M15: Buy=" + DoubleToString(mtf.m15_buy_strength, 1) + " Sell=" + DoubleToString(mtf.m15_sell_strength, 1) +
" | M5: Buy=" + DoubleToString(mtf.m5_buy_strength, 1) + " Sell=" + DoubleToString(mtf.m5_sell_strength, 1) +
" | M1: Buy=" + DoubleToString(mtf.m1_buy_strength, 1) + " Sell=" + DoubleToString(mtf.m1_sell_strength, 1));
EssentialLog("🔍 MTF Total Scores - Buy=" + DoubleToString(buy_score, 1) + " Sell=" + DoubleToString(sell_score, 1));
```
## Hasil yang Diharapkan
1. **Tidak ada lagi overlap** antara kondisi buy dan sell
2. **ADX sekarang spesifik untuk arah trend**, tidak lagi bias ke satu sisi
3. **`buy_score` dan `sell_score` akan lebih seimbang**
4. **Sinyal buy dan sell akan muncul secara proporsional**
5. **`mtf.total_score` akan lebih akurat** merepresentasikan kekuatan sinyal dominan
6. **Debug logging akan membantu** memantau perhitungan score
## Testing
Setelah perbaikan ini, user dapat:
1. **Monitor log** untuk melihat perhitungan individual strengths
2. **Verifikasi** bahwa `buy_score` dan `sell_score` tidak selalu sama
3. **Pastikan** sinyal buy dan sell muncul secara seimbang
4. **Cek dashboard** untuk melihat distribusi sinyal yang lebih baik
## Catatan Penting
- Kondisi yang lebih ketat (tanpa overlap) mungkin akan **mengurangi frekuensi sinyal**
- Jika terlalu sedikit sinyal, user dapat **menurunkan `MTF_MinScore`** dari 20 ke nilai yang lebih rendah
- Kondisi ini masih **lebih agresif** dari kondisi standar RSI (30/70) dan Stochastic (20/80)