New documentation files: - 16-MT5-Connector: Broker bridge with auto-reconnect & Polars native - 17-Configuration: 6 sub-configs with capital mode auto-adjustment - 18-Trade-Logger: Dual storage (PostgreSQL + CSV), thread-safe - 19-Position-Manager: 7 action conditions, trailing SL, market close handler - 20-Risk-Engine: Kelly Criterion sizing, circuit breaker, order validation - 21-Database: PostgreSQL integration with 6 repositories - 22-Train-Models: Initial training script (HMM + XGBoost) - 23-Main-Live-Orchestrator: Main loop coordinating 15+ components Updated README.md with complete index of all 23 components. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
206 lines
4.8 KiB
Markdown
206 lines
4.8 KiB
Markdown
# MT5 Connector — Jembatan ke MetaTrader 5
|
|
|
|
> **File:** `src/mt5_connector.py`
|
|
> **Class:** `MT5Connector`, `MT5SimulationConnector`
|
|
> **Library:** MetaTrader5 (Python API)
|
|
|
|
---
|
|
|
|
## Apa Itu MT5 Connector?
|
|
|
|
MT5 Connector adalah **jembatan komunikasi** antara bot AI dan terminal MetaTrader 5. Semua interaksi dengan broker — ambil data harga, kirim order, cek posisi — dilakukan melalui modul ini.
|
|
|
|
**Analogi:** MT5 Connector seperti **penerjemah di bandara** — menerjemahkan perintah bot (Python) ke bahasa yang dipahami broker (MT5 API), dan sebaliknya.
|
|
|
|
---
|
|
|
|
## Fungsi Utama
|
|
|
|
| Method | Fungsi | Return |
|
|
|--------|--------|--------|
|
|
| `connect()` | Koneksi ke MT5 terminal | `bool` |
|
|
| `disconnect()` | Putus koneksi | - |
|
|
| `reconnect()` | Reconnect otomatis | `bool` |
|
|
| `ensure_connected()` | Cek & auto-reconnect | `bool` |
|
|
| `get_market_data()` | Ambil data OHLCV | `pl.DataFrame` |
|
|
| `get_tick()` | Ambil harga real-time | `TickData` |
|
|
| `send_order()` | Kirim order BUY/SELL | `OrderResult` |
|
|
| `close_position()` | Tutup posisi | `OrderResult` |
|
|
| `get_open_positions()` | Cek posisi terbuka | `pl.DataFrame` |
|
|
| `get_symbol_info()` | Info simbol (spread, dll) | `Dict` |
|
|
|
|
---
|
|
|
|
## Koneksi & Auto-Reconnect
|
|
|
|
```
|
|
connect(max_retries=3)
|
|
|
|
|
v
|
|
Shutdown koneksi lama (jika ada)
|
|
|
|
|
v
|
|
mt5.initialize(login, password, server)
|
|
|
|
|
v
|
|
Tunggu 2 detik (stabilisasi terminal)
|
|
|
|
|
v
|
|
Verifikasi: terminal_info() != None?
|
|
|
|
|
├── Ya → Cek terminal.connected?
|
|
│ ├── Ya → ✅ Connected!
|
|
│ └── Tidak → Tunggu 3 detik → Retry
|
|
│
|
|
└── Tidak → Exponential backoff (2s, 4s, 8s) → Retry
|
|
```
|
|
|
|
### Auto-Reconnect
|
|
|
|
```python
|
|
ensure_connected():
|
|
"""
|
|
Dipanggil sebelum setiap operasi penting.
|
|
|
|
1. Cek flag _connected
|
|
2. Coba mt5.account_info()
|
|
3. Gagal? → reconnect()
|
|
4. Max 5 attempts, lalu cooldown 60 detik
|
|
"""
|
|
```
|
|
|
|
---
|
|
|
|
## Data Fetching (Polars Native)
|
|
|
|
```python
|
|
get_market_data(symbol="XAUUSD", timeframe="M15", count=200)
|
|
```
|
|
|
|
**Proses:**
|
|
|
|
```
|
|
MT5 Terminal
|
|
|
|
|
v
|
|
mt5.copy_rates_from_pos() → numpy structured array
|
|
|
|
|
v
|
|
LANGSUNG ke Polars DataFrame (TANPA Pandas)
|
|
|
|
|
v
|
|
Cast types:
|
|
├── time: Unix timestamp → Datetime
|
|
├── open/high/low/close: Float64
|
|
├── tick_volume → volume (Int64)
|
|
└── spread, real_volume: Int64
|
|
|
|
|
v
|
|
Return pl.DataFrame
|
|
```
|
|
|
|
**Kolom output:**
|
|
|
|
| Kolom | Tipe | Keterangan |
|
|
|-------|------|------------|
|
|
| `time` | Datetime | Waktu candle |
|
|
| `open` | Float64 | Harga buka |
|
|
| `high` | Float64 | Harga tertinggi |
|
|
| `low` | Float64 | Harga terendah |
|
|
| `close` | Float64 | Harga tutup |
|
|
| `volume` | Int64 | Tick volume |
|
|
| `spread` | Int64 | Spread |
|
|
| `real_volume` | Int64 | Real volume |
|
|
|
|
---
|
|
|
|
## Order Execution
|
|
|
|
```python
|
|
send_order(
|
|
symbol="XAUUSD",
|
|
order_type="BUY", # atau "SELL"
|
|
volume=0.01, # Lot size
|
|
sl=4937.00, # Stop Loss
|
|
tp=4976.00, # Take Profit
|
|
deviation=20, # Max slippage (points)
|
|
magic=123456, # Bot ID
|
|
comment="AI Bot",
|
|
max_retries=3,
|
|
)
|
|
```
|
|
|
|
**Retry Logic:**
|
|
|
|
```
|
|
Kirim order
|
|
|
|
|
├── RETCODE 10009 (DONE) → ✅ Success
|
|
|
|
|
├── RETCODE 10013-10016 (INVALID) → ❌ Non-retryable
|
|
|
|
|
├── RETCODE 10027 (TRADE DISABLED) → ❌ Raise error
|
|
|
|
|
└── RETCODE lain (requote/reject) → 🔄 Retry (max 3x)
|
|
```
|
|
|
|
---
|
|
|
|
## Timeframe Mapping
|
|
|
|
| String | MT5 Constant | Penggunaan |
|
|
|--------|-------------|------------|
|
|
| `M1` | TIMEFRAME_M1 | 1 menit |
|
|
| `M5` | TIMEFRAME_M5 | 5 menit |
|
|
| `M15` | TIMEFRAME_M15 | **Utama** (execution) |
|
|
| `M30` | TIMEFRAME_M30 | 30 menit |
|
|
| `H1` | TIMEFRAME_H1 | 1 jam |
|
|
| `H4` | TIMEFRAME_H4 | Trend analysis |
|
|
| `D1` | TIMEFRAME_D1 | 1 hari |
|
|
|
|
---
|
|
|
|
## Error Codes
|
|
|
|
| Code | Nama | Aksi |
|
|
|------|------|------|
|
|
| 10009 | DONE | Order berhasil |
|
|
| 10004 | REQUOTE | Retry |
|
|
| 10006 | REJECT | Retry |
|
|
| 10013 | INVALID | Stop, order salah |
|
|
| 10014 | INVALID_VOLUME | Stop, lot salah |
|
|
| 10015 | INVALID_PRICE | Stop, harga salah |
|
|
| 10016 | INVALID_STOPS | Stop, SL/TP salah |
|
|
| 10027 | TRADE_DISABLED | AutoTrading off |
|
|
| -10003 | NO_CONNECTION | Reconnect |
|
|
| -10004 | NO_IPC | Reconnect |
|
|
|
|
---
|
|
|
|
## Simulation Mode
|
|
|
|
```python
|
|
class MT5SimulationConnector(MT5Connector):
|
|
"""
|
|
Untuk testing tanpa MT5 terminal.
|
|
|
|
- connect() selalu berhasil
|
|
- get_market_data() generate data sintetis (random walk)
|
|
- Base price XAUUSD: $2000
|
|
"""
|
|
```
|
|
|
|
---
|
|
|
|
## Konfigurasi Koneksi
|
|
|
|
```python
|
|
MT5Connector(
|
|
login=12345678, # Dari .env MT5_LOGIN
|
|
password="password123", # Dari .env MT5_PASSWORD
|
|
server="BrokerServer-Live", # Dari .env MT5_SERVER
|
|
path="C:/Program Files/MT5/...", # Dari .env MT5_PATH (opsional)
|
|
timeout=60000, # 60 detik timeout
|
|
)
|
|
```
|