Files
XauBot/docs/arsitektur-ai/16-MT5-Connector.md
T
GifariKemalandClaude Opus 4.6 a240d974f6 docs: add architecture documentation for remaining 8 components (16-23)
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>
2026-02-06 09:17:20 +07:00

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
)
```