2026-02-09 05:46:54 +07:00
|
|
|
|
# Konfigurasi — Pusat Pengaturan Bot
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
|
|
|
|
|
> **File:** `src/config.py`
|
|
|
|
|
|
> **Class:** `TradingConfig`, `RiskConfig`, `SMCConfig`, `MLConfig`, `ThresholdsConfig`, `RegimeConfig`
|
2026-02-09 05:46:54 +07:00
|
|
|
|
> **Sumber:** *Environment variables* (`.env`)
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
## Struktur Konfigurasi
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
```mermaid
|
|
|
|
|
|
graph TD
|
|
|
|
|
|
A[".env File"] --> B["TradingConfig.from_env()"]
|
|
|
|
|
|
B --> C["CapitalMode<br/>SMALL / MEDIUM"]
|
|
|
|
|
|
C -->|"≤ $10.000"| D["SMALL<br/>Risk 1%, Max Lot 0.05"]
|
|
|
|
|
|
C -->|"> $10.000"| E["MEDIUM<br/>Risk 0.5%, Max Lot 2.0"]
|
|
|
|
|
|
B --> F["RiskConfig"]
|
|
|
|
|
|
B --> G["SMCConfig"]
|
|
|
|
|
|
B --> H["MLConfig"]
|
|
|
|
|
|
B --> I["ThresholdsConfig"]
|
|
|
|
|
|
B --> J["RegimeConfig"]
|
2026-02-06 09:17:20 +07:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
## 2 Mode Kapital
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
### Mode SMALL (≤ $10.000) — *Growth Mode*
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
| Parameter | Nilai | Keterangan |
|
|
|
|
|
|
|-----------|-------|------------|
|
|
|
|
|
|
| `risk_per_trade` | **1.0%** | $50 risiko per *trade* (akun $5.000) |
|
|
|
|
|
|
| `max_daily_loss` | **3.0%** | Batas kerugian harian $150 |
|
|
|
|
|
|
| `max_leverage` | **1:100** | *Leverage* tinggi untuk akun kecil |
|
|
|
|
|
|
| `max_positions` | **3** | Maksimal 3 posisi bersamaan |
|
|
|
|
|
|
| `max_lot_size` | **0.05** | Batas atas *lot* per *trade* |
|
|
|
|
|
|
| `min_lot_size` | **0.01** | *Lot* minimum |
|
|
|
|
|
|
| `execution_timeframe` | **M15** | *Scalping* / *day trading* |
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
### Mode MEDIUM (> $10.000) — *Preservation Mode*
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
| Parameter | Nilai | Keterangan |
|
|
|
|
|
|
|-----------|-------|------------|
|
|
|
|
|
|
| `risk_per_trade` | **0.5%** | $250 risiko per *trade* (akun $50.000) |
|
|
|
|
|
|
| `max_daily_loss` | **2.0%** | Batas kerugian harian $1.000 |
|
|
|
|
|
|
| `max_leverage` | **1:30** | *Leverage* konservatif |
|
|
|
|
|
|
| `max_positions` | **5** | Lebih banyak diversifikasi |
|
|
|
|
|
|
| `max_lot_size` | **2.0** | Batas atas *lot* |
|
|
|
|
|
|
| `execution_timeframe` | **H1** | *Swing trading* |
|
|
|
|
|
|
| `trend_timeframe` | **H4** | Analisis *trend* jangka menengah |
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
---
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
## *Thresholds* (Ambang Batas)
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
### *ML Confidence*
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
| Parameter | Nilai | Fungsi |
|
|
|
|
|
|
|-----------|-------|--------|
|
|
|
|
|
|
| `ml_min_confidence` | **0.65** | Minimum *confidence* untuk pertimbangkan sinyal |
|
|
|
|
|
|
| `ml_entry_confidence` | **0.70** | *Default confidence* untuk *entry* |
|
|
|
|
|
|
| `ml_high_confidence` | **0.75** | *High confidence* — sinyal kuat |
|
|
|
|
|
|
| `ml_very_high_confidence` | **0.80** | Sangat yakin — *lot multiplier* aktif |
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
### *Dynamic Threshold*
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
| Parameter | Nilai | Kondisi |
|
|
|
|
|
|
|-----------|-------|---------|
|
|
|
|
|
|
| `dynamic_threshold_aggressive` | **0.65** | Pasar *trending* kuat |
|
|
|
|
|
|
| `dynamic_threshold_moderate` | **0.70** | Kondisi normal |
|
|
|
|
|
|
| `dynamic_threshold_conservative` | **0.75** | Pasar bergejolak |
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
### *Profit/Loss* ($)
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
| Parameter | Nilai | Keterangan |
|
|
|
|
|
|
|-----------|-------|------------|
|
|
|
|
|
|
| `min_profit_to_secure` | **$15** | Mulai pertimbangkan *take profit* |
|
|
|
|
|
|
| `good_profit_level` | **$25** | Level profit bagus |
|
|
|
|
|
|
| `great_profit_level` | **$40** | *Hard take profit* — ambil profit |
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
### *Trading Timing*
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
| Parameter | Nilai | Keterangan |
|
|
|
|
|
|
|-----------|-------|------------|
|
|
|
|
|
|
| `trade_cooldown_seconds` | **300** | 5 menit antar *trade* |
|
|
|
|
|
|
| `loop_interval_seconds` | **30** | Interval *main loop* |
|
|
|
|
|
|
| `sydney_lot_multiplier` | **0.5** | *Lot* dikurangi 50% saat Sydney |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## *Environment Variables* (`.env`)
|
|
|
|
|
|
|
|
|
|
|
|
```env
|
|
|
|
|
|
# MetaTrader 5 — WAJIB
|
|
|
|
|
|
MT5_LOGIN=12345678
|
|
|
|
|
|
MT5_PASSWORD=your_password
|
|
|
|
|
|
MT5_SERVER=YourBroker-Server
|
|
|
|
|
|
MT5_PATH=C:/Program Files/MetaTrader 5/terminal64.exe
|
|
|
|
|
|
|
|
|
|
|
|
# Telegram — OPSIONAL
|
|
|
|
|
|
TELEGRAM_BOT_TOKEN=bot123:ABC-DEF
|
|
|
|
|
|
TELEGRAM_CHAT_ID=123456789
|
|
|
|
|
|
|
|
|
|
|
|
# Trading
|
|
|
|
|
|
CAPITAL=5000 # Menentukan mode (SMALL/MEDIUM)
|
|
|
|
|
|
SYMBOL=XAUUSD # Pair yang diperdagangkan
|
|
|
|
|
|
|
|
|
|
|
|
# Override (opsional)
|
|
|
|
|
|
RISK_PER_TRADE=1.0 # Override risk per trade (%)
|
|
|
|
|
|
MAX_DAILY_LOSS_PERCENT=3.0
|
|
|
|
|
|
MAX_POSITION_SIZE=0.05
|
|
|
|
|
|
AI_CONFIDENCE_THRESHOLD=0.65
|
|
|
|
|
|
FLASH_CRASH_THRESHOLD=2.5
|
2026-02-06 09:17:20 +07:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
## Kalkulasi *Position Sizing*
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
Bot menggunakan **metode *Half-Kelly Criterion*** untuk menghitung ukuran *lot*:
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
|
|
|
|
|
```python
|
2026-02-09 05:46:54 +07:00
|
|
|
|
def calculate_position_size(self, entry_price, stop_loss_price, account_balance=None):
|
|
|
|
|
|
# 1. Hitung jumlah risiko dalam $
|
|
|
|
|
|
risk_amount = balance * (risk_per_trade / 100)
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
# 2. Hitung jarak SL dalam pips
|
|
|
|
|
|
sl_distance = abs(entry_price - stop_loss_price)
|
|
|
|
|
|
sl_pips = sl_distance / 0.1 # XAUUSD: 1 pip = $0.1
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
# 3. Hitung lot size
|
|
|
|
|
|
lot_size = risk_amount / (sl_pips * pip_value_per_lot)
|
|
|
|
|
|
|
|
|
|
|
|
# 4. Apply Half-Kelly (keamanan)
|
|
|
|
|
|
lot_size *= 0.5
|
|
|
|
|
|
|
|
|
|
|
|
# 5. Round dan batasi
|
|
|
|
|
|
lot_size = round(lot_size / lot_step) * lot_step
|
|
|
|
|
|
lot_size = max(min_lot, min(lot_size, max_lot))
|
2026-02-06 09:17:20 +07:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
**Contoh:** Akun $5.000, SL 50 *pips*, risiko 1%:
|
|
|
|
|
|
- Risiko = $50
|
|
|
|
|
|
- *Lot* = $50 / (50 × $1) = 0.01 *lot* (setelah *Half-Kelly*)
|
|
|
|
|
|
|
2026-02-06 09:17:20 +07:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
## Validasi Konfigurasi
|
2026-02-06 09:17:20 +07:00
|
|
|
|
|
2026-02-09 05:46:54 +07:00
|
|
|
|
```python
|
|
|
|
|
|
def _validate_required_settings(self):
|
|
|
|
|
|
"""Validasi environment variables wajib saat startup."""
|
|
|
|
|
|
# MT5_LOGIN harus ada dan > 0
|
|
|
|
|
|
# MT5_PASSWORD harus ada dan tidak kosong
|
|
|
|
|
|
# MT5_SERVER harus ada dan tidak kosong
|
|
|
|
|
|
# CAPITAL harus > 0
|
|
|
|
|
|
# Jika ada yang hilang → ValueError dengan pesan jelas
|
2026-02-06 09:17:20 +07:00
|
|
|
|
```
|
2026-02-09 05:46:54 +07:00
|
|
|
|
|
|
|
|
|
|
Bot **tidak bisa berjalan** tanpa kredensial MT5 yang valid.
|