# 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)