5.6 KiB
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:
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:
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
- Kedua kondisi buy dan sell bisa terpenuhi bersamaan dalam range overlap
buy_scoredansell_scorekeduanya bertambah ketika ada overlap- Kondisi sell lebih mudah terpenuhi karena range yang lebih luas
- ADX memberikan poin tambahan untuk kedua sisi, memperkuat bias sell
sell_scorecenderung lebih tinggi daribuy_scoremtf.total_scoreselalu mengambil nilai tertinggi, jadi sering sama dengansell_score
Perbaikan yang Dilakukan
1. Menyeimbangkan Kondisi RSI
// 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
// 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
// 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
// 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
- Tidak ada lagi overlap antara kondisi buy dan sell
- ADX sekarang spesifik untuk arah trend, tidak lagi bias ke satu sisi
buy_scoredansell_scoreakan lebih seimbang- Sinyal buy dan sell akan muncul secara proporsional
mtf.total_scoreakan lebih akurat merepresentasikan kekuatan sinyal dominan- Debug logging akan membantu memantau perhitungan score
Testing
Setelah perbaikan ini, user dapat:
- Monitor log untuk melihat perhitungan individual strengths
- Verifikasi bahwa
buy_scoredansell_scoretidak selalu sama - Pastikan sinyal buy dan sell muncul secara seimbang
- 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_MinScoredari 20 ke nilai yang lebih rendah - Kondisi ini masih lebih agresif dari kondisi standar RSI (30/70) dan Stochastic (20/80)