feat: add 5 dashboard features — dark mode, trade history, backtests, model insights, alerts
- Dark mode: class-based theme toggle with localStorage persistence and flash prevention - Trade History (/trades): paginated table, stats cards, equity curve chart with DB API endpoints - Backtest Viewer (/backtests): log parser for 35 backtest results, sidebar + detail + comparison tabs - Model Insights: dashboard card + dialog showing feature importance, regime distribution, training history - Alert/Signal Log (/alerts): signal stats, filterable table with execution tracking - API: 8 new endpoints with psycopg2 DB connection pool - Dark mode sweep across books page, about dialog, and all dashboard components - Architecture docs rewritten with Mermaid diagrams (23 docs) - README and FEATURES.md rewritten bilingual (Indonesian + English) - main_live.py: write model_metrics.json on startup and retrain Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
b2dc2dacd7
commit
e8355b3f62
@@ -1,212 +1,73 @@
|
||||
# News Agent — Monitoring Berita Ekonomi
|
||||
# *News Agent* — Monitoring Berita Ekonomi
|
||||
|
||||
> **File:** `src/news_agent.py`
|
||||
> **Class:** `NewsAgent`
|
||||
> **Status:** Aktif tapi **TIDAK MEMBLOKIR** trading (monitoring only)
|
||||
> **Status: NONAKTIF** — dikomentari di `main_live.py` baris 64
|
||||
|
||||
---
|
||||
|
||||
## Apa Itu News Agent?
|
||||
## Status Saat Ini
|
||||
|
||||
News Agent memonitor **berita ekonomi high-impact** (NFP, FOMC, CPI) yang bisa menyebabkan volatilitas ekstrem di pasar gold. Awalnya dirancang untuk memblokir trading saat news, tapi setelah backtest menunjukkan bahwa blocking justru **kehilangan $178 profit**, sekarang hanya berfungsi sebagai **monitor dan logger**.
|
||||
|
||||
**Analogi:** News Agent seperti **stasiun cuaca** — melaporkan badai yang datang, tapi pilot (bot) tetap terbang karena pesawat (ML model) sudah cukup tangguh menangani turbulensi.
|
||||
> **PENTING:** Modul *News Agent* saat ini **tidak aktif** dalam sistem *live*. *Import* dikomentari di `main_live.py`:
|
||||
>
|
||||
> ```python
|
||||
> # from src.news_agent import NewsAgent, create_news_agent, MarketCondition # DISABLED
|
||||
> ```
|
||||
>
|
||||
> Modul ini tersedia dalam *codebase* untuk aktivasi di masa mendatang.
|
||||
|
||||
---
|
||||
|
||||
## Kenapa Tidak Blocking?
|
||||
## Apa Itu *News Agent*?
|
||||
|
||||
```
|
||||
Hasil Backtest (29 trades):
|
||||
- Win rate tanpa filter: 64.9%
|
||||
- Win rate saat news: 62.1% (selisih hanya 2.8%)
|
||||
- Profit yang hilang jika filter aktif: $178.15
|
||||
*News Agent* adalah modul yang **memonitor berita ekonomi** berdampak tinggi dan menilai potensi dampaknya terhadap perdagangan XAUUSD. Ketika aktif, modul ini dapat:
|
||||
|
||||
Kesimpulan:
|
||||
-> ML model sudah cukup menangani volatilitas news
|
||||
-> Blocking justru kehilangan peluang profit
|
||||
-> Monitoring cukup, tidak perlu blocking
|
||||
1. **Mengambil kalender ekonomi** dari sumber eksternal
|
||||
2. **Menilai dampak berita** terhadap pasar emas
|
||||
3. **Memberi peringatan** atau **memblokir *trading*** saat berita berdampak tinggi
|
||||
|
||||
---
|
||||
|
||||
## *Design* Modul
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A["Sumber Berita<br/>API Kalender Ekonomi"] --> B["NewsAgent"]
|
||||
B --> C{"Dampak?"}
|
||||
C -->|"Rendah"| D["✅ Trading normal"]
|
||||
C -->|"Sedang"| E["⚠️ Kurangi lot"]
|
||||
C -->|"Tinggi"| F["🛑 Blokir trading"]
|
||||
F --> G["NFP, FOMC, CPI<br/>Buffer 15-45 menit"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Event yang Dipantau
|
||||
## Berita Berdampak Tinggi (Tersimpan di `session_filter.py`)
|
||||
|
||||
### 3 Event High-Impact
|
||||
Meskipun *News Agent* nonaktif, daftar waktu berita sudah tersimpan di *Session Filter*:
|
||||
|
||||
| Event | Waktu (WIB) | Hari | Dampak ke Gold |
|
||||
|-------|-------------|------|---------------|
|
||||
| **NFP** (Non-Farm Payroll) | 20:30 | Jumat pertama bulan | Sangat tinggi |
|
||||
| **FOMC** (Fed Decision) | 02:00 | ~8x per tahun | Sangat tinggi |
|
||||
| **CPI** (Inflation) | 20:30 | Tgl 10-15 (Sel/Rab/Kam) | Tinggi |
|
||||
|
||||
### Deteksi Event
|
||||
|
||||
```python
|
||||
# NFP: Jumat pertama bulan
|
||||
if weekday == 4 and day <= 7: # Friday, day 1-7
|
||||
if 19 <= hour <= 21: # 19:00-21:00 WIB
|
||||
return "NFP (Non-Farm Payroll) - HIGH IMPACT"
|
||||
|
||||
# FOMC: Tanggal spesifik (hardcoded schedule)
|
||||
fomc_dates = [
|
||||
(1,29), (3,19), (5,7), (6,18), (7,30), # 2025
|
||||
(9,17), (11,5), (12,17),
|
||||
(1,29), (3,18), (5,6), (6,17), (7,29), # 2026
|
||||
]
|
||||
if (month, day) in fomc_dates:
|
||||
if 1 <= hour <= 3: # 01:00-03:00 WIB
|
||||
return "FOMC Decision - HIGH IMPACT"
|
||||
|
||||
# CPI: Sekitar tanggal 10-15, hari kerja
|
||||
if 10 <= day <= 15 and 19 <= hour <= 21:
|
||||
if weekday in [1, 2, 3]: # Selasa-Kamis
|
||||
return "CPI (Inflation) - HIGH IMPACT"
|
||||
```
|
||||
| Berita | Jam WIB | *Buffer* Sebelum | *Buffer* Setelah |
|
||||
|--------|---------|------------------|------------------|
|
||||
| **NFP** (*Non-Farm Payrolls*) | 19:30 | 15 menit | 30 menit |
|
||||
| **FOMC** (*Federal Reserve*) | 01:00 | 15 menit | 45 menit |
|
||||
| **CPI** (*Consumer Price Index*) | 19:30 | 15 menit | 30 menit |
|
||||
|
||||
---
|
||||
|
||||
## Buffer Times
|
||||
## Rencana Aktivasi
|
||||
|
||||
| Parameter | Default | Aktif di Production |
|
||||
|-----------|---------|-------------------|
|
||||
| `news_buffer_minutes` | 30 menit | **0** (disabled) |
|
||||
| `high_impact_buffer_minutes` | 60 menit | **0** (disabled) |
|
||||
Langkah-langkah untuk mengaktifkan kembali *News Agent*:
|
||||
|
||||
```python
|
||||
# Inisialisasi di main_live.py
|
||||
self.news_agent = create_news_agent(
|
||||
news_buffer_minutes=0, # No blocking
|
||||
high_impact_buffer_minutes=0, # No blocking
|
||||
)
|
||||
```
|
||||
1. Hapus komentar di `main_live.py` baris 64
|
||||
2. Konfigurasi sumber data berita di `.env`
|
||||
3. Integrasikan pengecekan berita ke *entry filter pipeline*
|
||||
4. Uji coba dengan mode *monitoring only* (tidak memblokir, hanya *log*)
|
||||
5. Aktifkan *blocking* setelah validasi
|
||||
|
||||
---
|
||||
|
||||
## Market Condition States
|
||||
## Mengapa Dinonaktifkan?
|
||||
|
||||
| Kondisi | Bisa Trade? | Lot Multiplier | Trigger |
|
||||
|---------|------------|---------------|---------|
|
||||
| `SAFE` | Ya | 1.0x | Tidak ada news |
|
||||
| `CAUTION` | Ya | 0.5x | News medium-impact |
|
||||
| `DANGER_NEWS` | Tidak* | 0.0x | High-impact news |
|
||||
| `DANGER_SENTIMENT` | Tidak* | 0.5x | Sentimen sangat bearish |
|
||||
|
||||
*\*Di production, DANGER tetap diizinkan trading (monitoring only)*
|
||||
|
||||
---
|
||||
|
||||
## Analisis Sentimen
|
||||
|
||||
News Agent juga bisa menganalisis headline berita berdasarkan keyword:
|
||||
|
||||
### Keyword Bullish (untuk Gold)
|
||||
|
||||
```
|
||||
Geopolitical: war, conflict, invasion, crisis, escalation
|
||||
Economic: rate cut, dovish, easing, recession, stimulus
|
||||
Market: safe haven, gold surge, gold rally, buy gold
|
||||
```
|
||||
|
||||
### Keyword Bearish (untuk Gold)
|
||||
|
||||
```
|
||||
Geopolitical: peace deal, ceasefire, de-escalation
|
||||
Economic: rate hike, hawkish, tightening, strong dollar
|
||||
Market: risk on, stocks rally, sell gold, gold crash
|
||||
```
|
||||
|
||||
### Keyword Volatile
|
||||
|
||||
```
|
||||
breaking, urgent, flash, sudden, unexpected, shock, crash, spike
|
||||
```
|
||||
|
||||
### Scoring
|
||||
|
||||
```
|
||||
Setiap keyword match:
|
||||
Bullish: +0.3
|
||||
Bearish: -0.3
|
||||
Volatile: -0.1 (penalty)
|
||||
|
||||
Score range: -1.0 (sangat bearish) sampai +1.0 (sangat bullish)
|
||||
Confidence berdasarkan jumlah keyword yang match
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Method `should_trade()`
|
||||
|
||||
```python
|
||||
def should_trade(headlines=None) -> (bool, str, float):
|
||||
"""
|
||||
Returns:
|
||||
can_trade: bool <- Apakah aman trading
|
||||
reason: str <- Alasan
|
||||
lot_multiplier: float <- Pengali lot (0.0-1.0)
|
||||
"""
|
||||
# 1. Cek economic calendar (MT5 + hardcoded events)
|
||||
# 2. Analisis sentimen (jika ada headlines)
|
||||
# 3. Tentukan kondisi pasar
|
||||
# 4. Return rekomendasi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integrasi di Main Loop
|
||||
|
||||
```python
|
||||
# main_live.py Lines 485-496
|
||||
# NEWS AGENT MONITORING (NO BLOCKING)
|
||||
|
||||
can_trade_news, news_reason, news_lot_mult = self.news_agent.should_trade()
|
||||
|
||||
# Hanya LOG, TIDAK block
|
||||
if not can_trade_news and loop_count % 300 == 0: # Setiap 5 menit
|
||||
logger.info(f"News Agent: HIGH IMPACT NEWS - {news_reason} (trading allowed)")
|
||||
|
||||
# Catatan:
|
||||
# - news_lot_mult dihitung tapi TIDAK diterapkan
|
||||
# - Trading tetap berjalan normal
|
||||
# - Informasi digunakan untuk logging dan analisis
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Sumber Data
|
||||
|
||||
| Sumber | Status | Keterangan |
|
||||
|--------|--------|-----------|
|
||||
| **MT5 Calendar** | Aktif | Cek economic calendar dari terminal |
|
||||
| **Hardcoded Events** | Aktif (Fallback) | NFP, FOMC, CPI schedule |
|
||||
| **NewsAPI** | Tersedia, tidak digunakan | External API (butuh API key) |
|
||||
| **ForexFactory** | Tersedia, tidak diimplementasi | Placeholder untuk scraping |
|
||||
|
||||
---
|
||||
|
||||
## Konfigurasi
|
||||
|
||||
```python
|
||||
NewsAgent(
|
||||
news_buffer_minutes=30, # Buffer news biasa (disabled: 0)
|
||||
high_impact_buffer_minutes=60, # Buffer high-impact (disabled: 0)
|
||||
enable_mt5_calendar=True, # Cek MT5 calendar
|
||||
enable_sentiment=True, # Analisis sentimen
|
||||
)
|
||||
|
||||
# Cache
|
||||
_cache_duration = 15 menit # Cache hasil calendar check
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Contoh Output Log
|
||||
|
||||
```
|
||||
[14:30] News Agent: HIGH IMPACT NEWS - NFP (Non-Farm Payroll) (trading allowed)
|
||||
[14:35] News Agent: Market condition SAFE - no upcoming events
|
||||
[20:25] News Agent: HIGH IMPACT NEWS - CPI (Inflation) (trading allowed)
|
||||
```
|
||||
|
||||
**Catatan:** Meskipun terdeteksi "HIGH IMPACT NEWS", bot tetap trading. Log ini berguna untuk analisis post-trade — apakah trade yang terjadi saat news perform baik atau buruk.
|
||||
- **Ketergantungan API eksternal** — memerlukan *API key* dan koneksi internet stabil
|
||||
- **Latensi tambahan** — setiap pengecekan berita menambah waktu *loop*
|
||||
- **Hasil *backtest* tanpa *News Agent* sudah baik** — sistem sudah terproteksi oleh *session filter* dan *regime detector*
|
||||
|
||||
Reference in New Issue
Block a user