Co-authored-by: Cursor <cursoragent@cursor.com>
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_scoredansell_scoresekarang 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:
- Melihat
buy_scoredansell_scoreyang berbeda di log - Mendapatkan signal buy atau sell yang sesuai dengan kondisi market
- 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.