Files
EA2/smart-bot/MTF_SCORE_CONFLICT_FIX.md
sigitholic 98507e3a47 Initial commit
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-24 20:22:43 +07:00

4.7 KiB

MTF Score Conflict Fix - Dokumentasi Perbaikan

Masalah yang Ditemukan

User melaporkan bahwa buy_score dan sell_score selalu sama, yang menyebabkan konflik dan sinyal tidak dapat dihasilkan dengan benar.

Root Cause Analysis

Masalah Utama: Struktur MTFConfirmation hanya memiliki satu field strength untuk setiap timeframe:

  • h1_strength (digunakan untuk buy dan sell)
  • m15_strength (digunakan untuk buy dan sell)
  • m5_strength (digunakan untuk buy dan sell)
  • m1_strength (digunakan untuk buy dan sell)

Konsekuensi: Ketika ada signal buy dan sell pada timeframe yang sama, strength yang terakhir akan menimpa yang pertama, menyebabkan buy_score dan sell_score selalu sama.

Contoh Masalah

// Sebelum perbaikan - MASALAH
if(h1_buy_conditions >= 2) {
   mtf.h1_buy = true;
   mtf.h1_strength = 40 * (h1_buy_conditions / 4.0); // Set buy strength
}

if(h1_sell_conditions >= 2) {
   mtf.h1_sell = true;
   mtf.h1_strength = 40 * (h1_sell_conditions / 4.0); // OVERWRITE buy strength!
}

Solusi yang Diterapkan

1. Restrukturisasi MTFConfirmation

Sebelum:

struct MTFConfirmation {
   double h1_strength, m15_strength, m5_strength, m1_strength;
   // ... other fields
};

Sesudah:

struct MTFConfirmation {
   double h1_buy_strength, h1_sell_strength;
   double m15_buy_strength, m15_sell_strength;
   double m5_buy_strength, m5_sell_strength;
   double m1_buy_strength, m1_sell_strength;
   // ... other fields
};

2. Update Semua Assignment

H1 Timeframe:

// Buy signal
if(h1_buy_conditions >= 2) {
   mtf.h1_buy = true;
   mtf.h1_buy_strength = 40 * (h1_buy_conditions / 4.0);
}

// Sell signal  
if(h1_sell_conditions >= 2) {
   mtf.h1_sell = true;
   mtf.h1_sell_strength = 40 * (h1_sell_conditions / 4.0);
}

M15, M5, M1 Timeframes: Diterapkan pola yang sama.

3. Update Score Calculation

GetMTFConfirmation():

// Calculate Total Score
double buy_score = 0, sell_score = 0;
if(mtf.h1_buy) buy_score += mtf.h1_buy_strength;
if(mtf.m15_buy) buy_score += mtf.m15_buy_strength;
if(mtf.m5_buy) buy_score += mtf.m5_buy_strength;
if(mtf.m1_buy) buy_score += mtf.m1_buy_strength;

if(mtf.h1_sell) sell_score += mtf.h1_sell_strength;
if(mtf.m15_sell) sell_score += mtf.m15_sell_strength;
if(mtf.m5_sell) sell_score += mtf.m5_sell_strength;
if(mtf.m1_sell) sell_score += mtf.m1_sell_strength;

ValidateSignalWithMTF(): Diterapkan pola yang sama.

4. Update Dashboard Display

Sebelum:

string mtfInfo = StringFormat("MTF: Score=%.1f (Min:%.1f) | H1:%.0f M15:%.0f M5:%.0f M1:%.0f | %s", 
                             mtf.total_score, MTF_MinScore, mtf.h1_strength, mtf.m15_strength, mtf.m5_strength, mtf.m1_strength,
                             mtf.total_score >= MTF_MinScore ? "READY" : "WAITING");

Sesudah:

// Calculate total buy and sell strength for display
double total_buy_strength = mtf.h1_buy_strength + mtf.m15_buy_strength + mtf.m5_buy_strength + mtf.m1_buy_strength;
double total_sell_strength = mtf.h1_sell_strength + mtf.m15_sell_strength + mtf.m5_sell_strength + mtf.m1_sell_strength;

string mtfInfo = StringFormat("MTF: Score=%.1f (Min:%.1f) | Buy:%.0f Sell:%.0f | %s", 
                             mtf.total_score, MTF_MinScore, total_buy_strength, total_sell_strength,
                             mtf.total_score >= MTF_MinScore ? "READY" : "WAITING");

Hasil Perbaikan

1. Buy dan Sell Score Terpisah

  • buy_score dan sell_score sekarang dihitung secara independen
  • Tidak ada lagi overwrite strength yang menyebabkan konflik

2. Signal Generation yang Benar

  • MTF dapat menghasilkan signal buy atau sell berdasarkan strength yang sebenarnya
  • Konflik hanya terjadi jika benar-benar ada mixed signals yang kuat

3. Dashboard yang Lebih Informatif

  • Menampilkan total buy strength dan sell strength secara terpisah
  • Memudahkan monitoring arah signal yang dominan

Testing

Setelah perbaikan ini, user dapat:

  1. Melihat buy_score dan sell_score yang berbeda di log
  2. Mendapatkan signal buy atau sell yang sesuai dengan kondisi market
  3. Melihat dashboard yang menampilkan strength buy dan sell secara terpisah

File yang Dimodifikasi

  • smart-bot.mq5: Struktur MTFConfirmation dan semua fungsi terkait MTF
  • Semua assignment strength di setiap timeframe (H1, M15, M5, M1)
  • Perhitungan score di GetMTFConfirmation() dan ValidateSignalWithMTF()
  • Dashboard display di RenderHUD()

Kesimpulan

Perbaikan ini menyelesaikan masalah fundamental di mana buy_score dan sell_score selalu sama karena sharing field strength yang sama. Sekarang setiap timeframe memiliki strength terpisah untuk buy dan sell, memungkinkan perhitungan score yang akurat dan signal generation yang benar.