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

144 lines
4.7 KiB
Markdown

# 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
```cpp
// 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**:
```cpp
struct MTFConfirmation {
double h1_strength, m15_strength, m5_strength, m1_strength;
// ... other fields
};
```
**Sesudah**:
```cpp
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**:
```cpp
// 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()**:
```cpp
// 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**:
```cpp
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**:
```cpp
// 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.