144 lines
4.7 KiB
Markdown
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.
|