Files
GifariKemal e8355b3f62 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>
2026-02-09 05:46:54 +07:00

8.5 KiB

Entry Trade — Proses Masuk Posisi

File utama: main_live.py File pendukung: src/smc_polars.py, src/ml_model.py, src/smart_risk_manager.py, src/session_filter.py


Apa Itu Entry Trade?

Entry Trade adalah keseluruhan proses dari mendeteksi peluang hingga mengirim order ke broker. Bot menggunakan 14 filter yang harus SEMUA lolos sebelum satu trade dieksekusi.

Analogi: Entry Trade seperti proses boarding pesawat — harus punya tiket (signal), passport valid (confirmation), lulus security check (risiko), tepat waktu (sesi), dan gate terbuka (position limit).


Daftar Checklist Entry (Semua Harus PASS)

# Filter Keterangan Status
1 Flash Crash Guard Apakah ada pergerakan harga ekstrem? Aktif
2 Regime Filter Apakah regime HMM bukan SLEEP? Aktif
3 Risk Check Apakah risk_metrics.can_trade = true? Aktif
4 Session Filter Apakah sesi perdagangan mengizinkan trading? Aktif
5 SMC Signal Apakah ada sinyal valid dari SMC Analyzer? Aktif
6 Signal Combination Apakah kombinasi SMC + ML menghasilkan sinyal akhir? Aktif
7 H1 Bias (#31B) Apakah bias H1 EMA20 sejalan dengan sinyal? Aktif
8 Filter Waktu (#34A) Apakah bukan jam 9 atau 21 WIB? Aktif
9 Trade Cooldown Sudah 5 menit sejak trade terakhir? Aktif
10 Pullback Filter Apakah bukan sedang pullback/retrace? Nonaktif
11 Smart Risk Gate Mode trading bukan STOPPED/COOLDOWN? Aktif
12 Kalkulasi Lot Apakah lot size > 0 setelah semua adjustment? Aktif
13 Spread Validasi Apakah spread tidak terlalu lebar? Aktif
14 Batas Posisi Posisi terbuka < 2? Aktif

Semua PASS → Eksekusi Trade Satu GAGALSkip, tunggu loop berikutnya


Step-by-Step Flow

Filter 1: Flash Crash Guard

# main_live.py
is_flash, move_pct = self.flash_crash.detect(df.tail(5))
if is_flash:
    return  # Pergerakan harga ekstrem terdeteksi

Bisa block: Pergerakan harga > 2.5% dalam 1 menit (flash crash threshold dari config.py).


Filter 2: Regime Filter

regime_sleep = regime_state and regime_state.recommendation == "SLEEP"
if regime_sleep:
    return  # HMM mendeteksi kondisi krisis

Bisa block: Regime HIGH_VOLATILITY / CRISIS — pasar terlalu bergejolak.


Filter 3: Risk Check

if not risk_metrics.can_trade:
    return  # Risiko di luar batas

Filter 4: Session Filter

session_ok, session_reason, session_multiplier = self.session_filter.can_trade()
if not session_ok:
    return  # Bukan waktu trading

Bisa block: Weekend, Jumat > 23:00, zona bahaya (00:00-06:00), sesi low volatility. Tokyo-London overlap (15:00-16:00 WIB) diblokir — hasil optimasi backtest #24B.


Filter 5: SMC Signal

smc_signal = self.smc.generate_signal(df)
if smc_signal is None:
    return  # Tidak ada setup SMC yang valid

SMC membutuhkan:

  • Struktur pasar (bullish/bearish) ATAU BOS/CHoCH
  • DAN (FVG ATAU Order Block)
  • Minimum 2:1 risk/reward

Output: Entry price, SL, TP, confidence (55-85%), alasan.


Filter 6: Signal Combination

final_signal = self._combine_signals(smc_signal, ml_prediction, regime_state)
if final_signal is None:
    return  # Sinyal terfilter

Menggabungkan SMC + ML + Regime menjadi satu sinyal akhir. ML harus agree atau minimal tidak strongly disagree (> 65% confidence berlawanan).


Filter 7: H1 Bias (#31B)

# Backtest #31B: H1 EMA20 filter menambah +$345 profit
if h1_bias == "BULLISH" and final_signal.signal_type == "SELL":
    return  # BUY signal vs H1 bullish = blokir
if h1_bias == "BEARISH" and final_signal.signal_type == "BUY":
    return  # SELL signal vs H1 bearish = blokir
if h1_bias == "NEUTRAL":
    return  # Tidak ada bias jelas = blokir

Tujuan: Hanya masuk posisi yang sejalan dengan trend H1.


Filter 8: Filter Waktu (#34A)

# Backtest #34A: skip jam 9 dan 21 WIB menambah +$356 profit
wib_hour = datetime.now(ZoneInfo("Asia/Jakarta")).hour
if wib_hour in (9, 21):
    return  # Jam transisi — volatilitas tidak optimal

Tujuan: Menghindari jam transisi sesi yang berpotensi whipsaw.


Filter 9: Trade Cooldown

trade_cooldown = 300  # 5 menit
if last_trade_time and (now - last_trade_time).total_seconds() < 300:
    return  # Tunggu cooldown selesai

Tujuan: Mencegah overtrading — minimal 5 menit antar trade.


Filter 10: Pullback Filter (NONAKTIF)

# DISABLED — mode SMC-only
# Struktur SMC sudah memvalidasi zona entry

Filter ini dinonaktifkan karena analisis SMC sudah mencakup validasi pullback dalam logika Order Block dan FVG.


Filter 11: Smart Risk Gate

risk_rec = self.smart_risk.get_trading_recommendation()
if not risk_rec["can_trade"]:
    return  # Mode STOPPED/COOLDOWN

4 mode Smart Risk: NORMAL → PROTECTED → RECOVERY → COOLDOWN/STOPPED.


Filter 12-14: Lot, Spread, dan Batas Posisi

# Kalkulasi lot
safe_lot = self.smart_risk.calculate_lot_size(...)
safe_lot = max(0.01, safe_lot * session_multiplier)
if safe_lot <= 0:
    return  # Lot 0 = tidak boleh trade

# Validasi spread
if spread > max_allowed:
    return  # Spread terlalu lebar

# Batas posisi (max 2)
can_open, limit_reason = self.smart_risk.can_open_position()
if not can_open:
    return  # Sudah 2 posisi terbuka

Eksekusi Order

Setelah semua 14 filter lolos:

# Step A: Ambil harga real-time
tick = mt5.get_tick(symbol)
current_price = tick.ask if BUY else tick.bid

# Step B: Validasi broker SL (min 10 pips)
broker_sl = signal.stop_loss
if jarak_terlalu_dekat:
    broker_sl = paksa_lebih_lebar

# Step C: Kirim order
result = mt5.send_order(
    symbol="XAUUSD",
    order_type="BUY" / "SELL",
    volume=0.01 - 0.05,
    sl=broker_sl,             # SL berbasis ATR
    tp=signal.take_profit,    # TP dari SMC (ATR-capped)
    magic=123456,
    comment="AI Safe v3",
)

# Step D: Fallback jika broker reject SL
if gagal dan error 10016:
    result = mt5.send_order(sl=0, ...)

# Step E: Validasi slippage
if result.success:
    slippage = abs(result.price - signal.entry_price)
    max_slippage = signal.entry_price * 0.0015  # 0.15%
    if slippage > max_slippage:
        log WARNING "HIGH SLIPPAGE"

# Step F: Register posisi (gunakan nilai AKTUAL)
    smart_risk.register_position(
        ticket=result.order_id,
        entry_price=result.price,      # Harga aktual
        lot_size=result.volume,        # Volume aktual
        direction=signal.signal_type,
    )

Post-Entry

# Log trade detail ke PostgreSQL
trade_logger.log_trade_open(signal, ml_prediction, regime, market_quality, ...)

# Kirim notifikasi Telegram
await telegram.send_trade_open(trade_info)

# Update cooldown timer
last_trade_time = now

Diagram Flow Lengkap

graph TD
    A["Loop Setiap ~30 Detik"] --> B["Fetch 200 Bar M15"]
    B --> C["Feature Eng + SMC + HMM + XGBoost"]
    C --> F1{"1. Flash Crash?"}
    F1 -->|Ya| SKIP["Skip ↩"]
    F1 -->|Tidak| F2{"2. Regime SLEEP?"}
    F2 -->|Ya| SKIP
    F2 -->|Tidak| F3{"3. Risk OK?"}
    F3 -->|Tidak| SKIP
    F3 -->|Ya| F4{"4. Session OK?"}
    F4 -->|Tidak| SKIP
    F4 -->|Ya| F5{"5. SMC Signal?"}
    F5 -->|Tidak| SKIP
    F5 -->|Ya| F6{"6. Signal Combo?"}
    F6 -->|Tidak| SKIP
    F6 -->|Ya| F7{"7. H1 Bias OK?"}
    F7 -->|Tidak| SKIP
    F7 -->|Ya| F8{"8. Jam OK?"}
    F8 -->|Tidak| SKIP
    F8 -->|Ya| F9{"9. Cooldown OK?"}
    F9 -->|Tidak| SKIP
    F9 -->|Ya| F11{"10. Risk Gate?"}
    F11 -->|Tidak| SKIP
    F11 -->|Ya| F12{"11-14. Lot/Spread/Pos?"}
    F12 -->|Tidak| SKIP
    F12 -->|Ya| EXEC["EKSEKUSI TRADE"]
    EXEC --> POST["Register + Log + Telegram"]

Statistik Filter

Dalam kondisi normal, dari ratusan loop per jam:

Sumber Block Persentase Keterangan
Tidak ada sinyal SMC ~95% Pasar sideways, tidak ada setup
ML disagreement / low confidence ~3% ML tidak yakin atau berlawanan
Pullback, sesi, H1 bias ~1% Filter waktu dan arah
Lolos semua → Trade < 1% Sangat selektif

Rata-rata: 3-8 trade per hari.