# CLI Scripts

Semua script dijalankan dari root project dengan virtual environment aktif.

```bash
cd /path/to/investasi.kamu.co.id
source .venv/bin/activate
```

---

## Seeding Scripts

### seed_admin.py — Buat Admin Pertama

Membuat record `Admin` + `User` beserta settings default.

```bash
python scripts/seed_admin.py [--username admin] [--email admin@koinkamu.com] [--password admin123]
```

**Opsi:**
- `--username` (default: `admin`)
- `--email` (default: `admin@koinkamu.com`)
- `--password` (default: `admin123`)

**Apa yang dibuat:**
- 1 record Admin (superadmin)
- 1 record User (dengan settings fee, capital, display preferences)

> Jalankan setelah `seed_data.py` agar settings bisa di-copy ke user.

---

### seed_data.py — Seed Settings & Coins

Seed 16 default settings + 12 cryptocurrency awal + source mappings.

```bash
python scripts/seed_data.py
```

**Settings yang dibuat:**
- Data source: `indodax` (default)
- Sync timeframes: `1h, 4h, 1D`
- Fee crypto: buy 0.31%, sell 0.31%
- Fee saham: buy 0.15%, sell 0.25%, tax 0.10%
- Capital: Rp 1.000.000 (75% aktif, 25% reserve)

**Coins:** Bitcoin, Ethereum, BNB, XRP, Solana, Cardano, Dogecoin, TRON, Polkadot, Chainlink, dll.

---

### seed_stocks.py — Seed Saham IDX

Membuat 10 saham populer Indonesia (BBCA, BBRI, BMRI, TLKM, ASII, dll).

```bash
python3 scripts/seed_stocks.py
```

Setiap saham dibuat dengan `lot_size: 100`, sektor, dan mapping Yahoo Finance (`SYMBOL.JK`).

---

### seed_us_stocks.py — Seed Saham US

Membuat 20 saham US populer (AAPL, MSFT, GOOGL, AMZN, NVDA, dll).

```bash
python3 scripts/seed_us_stocks.py
```

Saham US menggunakan `lot_size: 1` dan mapping Yahoo Finance langsung (tanpa suffix).

---

### merge_idx_excel.py — Import Saham IDX dari Excel

Merge data dari file Excel listing BEI ke database.

```bash
# Preview perubahan
python3 scripts/merge_idx_excel.py --dry-run

# Eksekusi
python3 scripts/merge_idx_excel.py
```

**Input:** File Excel `Daftar Saham - *.xlsx` di root project.

**Apa yang dilakukan:**
- Update saham existing (listing date, sektor, nama)
- Buat saham baru yang belum ada
- Tambah Yahoo Finance mapping (`SYMBOL.JK`)

---

## Sync Scripts

### sync_data.py — Sync Market Data

Script utama untuk sinkronisasi profile + OHLCV dari provider eksternal.

```bash
# Sync semua crypto (default)
python3 scripts/sync_data.py

# Sync berdasarkan mode
python3 scripts/sync_data.py --mode stock        # Saham IDX
python3 scripts/sync_data.py --mode stock_us     # Saham US
python3 scripts/sync_data.py --mode all          # Semua mode

# Filter scope
python3 scripts/sync_data.py --scope never_synced  # Hanya yang belum pernah sync
python3 scripts/sync_data.py --scope stale          # Hanya yang sudah basi (>24 jam)

# Filter coin tertentu
python3 scripts/sync_data.py --coin bitcoin,ethereum

# Batasi jumlah
python3 scripts/sync_data.py --limit 10

# Timeframe tertentu
python3 scripts/sync_data.py --timeframes 1h,4h,1D

# Hanya profile atau OHLCV
python3 scripts/sync_data.py --profile-only
python3 scripts/sync_data.py --ohlcv-only

# Dry run (preview)
python3 scripts/sync_data.py --dry-run
```

**Semua opsi:**

| Flag | Keterangan |
|------|------------|
| `--mode` | `crypto`, `stock`, `stock_us`, `all` (default: crypto) |
| `--coin` | Comma-separated coin IDs |
| `--scope` | `never_synced`, `stale`, atau kosong |
| `--limit` | Max jumlah coin (0 = semua) |
| `--timeframes` | Contoh: `1h,4h,1D` |
| `--ohlcv-only` | Skip profile & icon download |
| `--profile-only` | Skip OHLCV data |
| `--no-icon` | Skip icon download |
| `--available-only` | Skip coin dengan 0 record |
| `--dry-run` | Preview tanpa eksekusi |
| `--quiet` / `-q` | Output minimal (untuk cron) |
| `--verbose` / `-v` | Debug logging |

---

### remote_sync.py — Sync Lokal ↔ Production

Sinkronisasi bidirectional antara database lokal dan production.

```bash
# Sync dua arah (default)
python scripts/remote_sync.py

# Hanya push (lokal → production)
python scripts/remote_sync.py --direction push

# Hanya pull (production → lokal)
python scripts/remote_sync.py --direction pull

# Table tertentu
python scripts/remote_sync.py --table ohlcv_data --direction push

# Full sync (abaikan timestamp terakhir)
python scripts/remote_sync.py --full

# Preview
python scripts/remote_sync.py --dry-run

# Cek status server
python scripts/remote_sync.py --status
```

**Konfigurasi `.env` wajib:**
```
SYNC_REMOTE_URL=https://investasi.kamu.co.id
SYNC_API_KEY=<your-api-key>
SYNC_ENABLED=true
```

**Push:** OHLCV, scores, signals, profiles
**Pull:** User data, watchlists, portfolio, trade history

---

## Analysis Scripts

### scan_range_trading.py — Scan Oscillation Score (Range Trading)

Analisis semua coin untuk range-trading score.

```bash
# Default (timeframe 1D)
python3 scripts/scan_range_trading.py

# Dengan filter harga
python3 scripts/scan_range_trading.py --max-price 1000

# Timeframe lain
python3 scripts/scan_range_trading.py --timeframe 1h
```

### scan_cycle_frequency.py — Scan Cycle Frequency (Adaptive S/R)

Hitung frekuensi cycle adaptive support/resistance per coin. Menghitung berapa kali harga menyelesaikan cycle (support→resistance→support) per hari menggunakan multi-timeframe data.

```bash
# Mode agresif (default)
python3 scripts/scan_cycle_frequency.py

# Mode moderate
python3 scripts/scan_cycle_frequency.py --mode moderate

# Mode santai
python3 scripts/scan_cycle_frequency.py --mode santai

# Quiet (untuk cron)
python3 scripts/scan_cycle_frequency.py --quiet
```

| Flag | Default | Keterangan |
|------|---------|------------|
| `--mode` | `agresif` | Mode deteksi: `agresif` / `moderate` / `santai` |
| `--quiet` | off | Hanya tampilkan summary |

Modes:
- **agresif**: lookback pendek, range ketat → lebih banyak cycle terdeteksi
- **moderate**: balance antara sensitivity dan noise filtering
- **santai**: lookback panjang, range lebar → cycle yang lebih pasti

---

### scan_bullish_momentum.py — Scan Bullish Momentum

Deteksi early bullish breakout momentum semua coin. Menjalankan full 31-algorithm TradingEngine per coin untuk klasifikasi fase:
- 🟢 **EARLY_BULLISH**: awal breakout, potensi rally besar
- 🟡 **PEAK_BULLISH**: momentum kuat, mungkin sudah dekat puncak
- ⚪ **NOT_BULLISH**: belum ada sinyal bullish signifikan

```bash
# Default (timeframe 1D)
python3 scripts/scan_bullish_momentum.py

# Timeframe 4h
python3 scripts/scan_bullish_momentum.py --timeframe 4h

# Quiet mode
python3 scripts/scan_bullish_momentum.py --quiet
```

| Flag | Default | Keterangan |
|------|---------|------------|
| `--timeframe` | `1D` | OHLCV timeframe: `1m`,`15m`,`30m`,`1h`,`4h`,`1D`,`1W` |
| `--quiet` | off | Hanya tampilkan summary |

---

### scan_trading_signals.py — Generate Trading Signals (31 Algo + ML)

Generate sinyal trading untuk semua coin. Pipeline:
1. Auto-evaluate past signal outcomes (feeds Kelly Criterion & adaptive weights)
2. Delete old active signals
3. Run 31-algorithm engine + ML per coin
4. Save TradingSignal records (BUY/SELL/HOLD) dengan entry, SL, TP, confidence

```bash
# Default (timeframe 1D)
python3 scripts/scan_trading_signals.py

# Timeframe 4h
python3 scripts/scan_trading_signals.py --timeframe 4h

# Timeframe 1h
python3 scripts/scan_trading_signals.py --timeframe 1h

# Quiet mode (untuk cron)
python3 scripts/scan_trading_signals.py --quiet
```

| Flag | Default | Keterangan |
|------|---------|------------|
| `--timeframe` | `1D` | OHLCV timeframe: `1m`,`15m`,`30m`,`1h`,`4h`,`1D`,`1W` |
| `--quiet` | off | Hanya tampilkan summary |

Output per coin: signal type (BUY/SELL/HOLD), score, regime, strategy, ETA.

---

## ML (Machine Learning) Scripts

Semua ML scripts menggunakan engine dari `app/engine/ml/` dan services dari `app/services/ml_*.py`.

### ml_predict.py — Prediksi Arah Harga (Ensemble 3 Model)

Menjalankan RandomForest + GradientBoosting + Ridge ensemble predictions.

```bash
# Prediksi semua crypto (top 50)
python3 scripts/ml_predict.py

# Saham IDX
python3 scripts/ml_predict.py --asset-type stock

# Coin tertentu
python3 scripts/ml_predict.py --symbol BTC,ETH,SOL

# Hanya strong signals
python3 scripts/ml_predict.py --strong-only

# Min confidence 60%
python3 scripts/ml_predict.py --min-confidence 60

# Output JSON (untuk pipeline)
python3 scripts/ml_predict.py --json
```

| Flag | Keterangan |
|------|------------|
| `--asset-type` | `crypto`, `stock`, `stock_us` (default: crypto) |
| `--symbol` | Symbols, comma-separated |
| `--limit` | Max coins (default: 50) |
| `--sort` | `confidence`, `signal`, `symbol` |
| `--strong-only` | Hanya strong_buy / strong_sell |
| `--min-confidence` | Min confidence % |
| `--quiet` / `-q` | Hanya summary |
| `--json` | Output JSON |

**Output:**
```
  #  Symbol   Direction   Conf  Signal       RF     GB   Ridge  Agree
  1  USDY     📈    up    88%  🟢 strong_buy  75%   82%  +2.1%  3/3
  2  BTC      📈    up    67%  🟩 buy         61%   70%  +0.8%  3/3
  3  DOGE     📉  down    72%  🟥 sell        68%   74%  -1.3%  3/3
```

---

### ml_train.py — Train/Retrain ML Models

Train advanced EnsemblePredictor (TreeBoost + DirectionClassifier) per coin.
Models disimpan ke `model_cache/` untuk reuse.

```bash
# Train top 20 crypto
python3 scripts/ml_train.py

# Coin tertentu
python3 scripts/ml_train.py --coin bitcoin,ethereum,solana

# Dengan hyperparameter optimization (Optuna)
python3 scripts/ml_train.py --hyperopt --trials 100

# Dengan DEEP feature selection (SHAP, lebih lambat)
python3 scripts/ml_train.py --feature-selection deep

# Force retrain (abaikan timer)
python3 scripts/ml_train.py --force

# Timeframe 4h
python3 scripts/ml_train.py --timeframe 4h
```

| Flag | Keterangan |
|------|------------|
| `--asset-type` | `crypto`, `stock`, `stock_us` |
| `--coin` | Coin IDs, comma-separated |
| `--limit` | Max coins (default: 20) |
| `--timeframe` | `1h`, `4h`, `1D` (default: 1D) |
| `--force` | Force retrain |
| `--hyperopt` | Enable Optuna hyperparameter tuning |
| `--trials` | Optuna trials (default: 50) |
| `--feature-selection` | `none`, `fast`, `deep` (default: fast) |
| `--quiet` / `-q` | Hanya summary |

**Output:**
```
  ✓  [1/20] BTC        MAE=0.0234  DirAcc=61.3%  feat=92  rows=305  (4.2s)
  ✓  [2/20] ETH        MAE=0.0312  DirAcc=58.7%  feat=92  rows=305  (3.8s)
```

---

### ml_ensemble.py — Full ML Pipeline

Pipeline lengkap: Features → Regime → Train → Predict → Risk Check.
Ini adalah versi CLI dari halaman `/admin/ml-ensemble`.

```bash
# Full pipeline top 10 crypto
python3 scripts/ml_ensemble.py

# Coin tertentu dengan detail
python3 scripts/ml_ensemble.py --coin bitcoin,ethereum --verbose

# Saham IDX
python3 scripts/ml_ensemble.py --asset-type stock --limit 10

# Output JSON
python3 scripts/ml_ensemble.py --json
```

| Flag | Keterangan |
|------|------------|
| `--asset-type` | `crypto`, `stock`, `stock_us` |
| `--coin` | Coin IDs, comma-separated |
| `--limit` | Max coins (default: 10) |
| `--timeframe` | `1h`, `4h`, `1D` |
| `--verbose` / `-v` | Regime, risk, horizons detail |
| `--quiet` / `-q` | Hanya summary |
| `--json` | Output JSON |

**Output:**
```
  📈 [1/10] BTC      regime=trending_up     dir=up   prob= 72.3%  ✅ trade=YES  (8.1s)
  📉 [2/10] ETH      regime=volatile         dir=down prob= 61.5%  ⛔ trade=NO   (7.3s)
```

**Verbose output menambahkan:**
- Hurst exponent, ADX, volatility rank
- Multi-horizon predictions (short/medium/long)
- Risk check reasons

---

### ml_health_check.py — Monitor Model Health

Cek kesehatan model ML: accuracy, degradation, alerts.
Ini adalah versi CLI dari halaman `/admin/ml-health`.

```bash
# Health check crypto
python3 scripts/ml_health_check.py

# Saham IDX, periode 60 hari
python3 scripts/ml_health_check.py --asset-type stock --period 60

# Strict mode — exit code 1 jika ada critical alert
python3 scripts/ml_health_check.py --strict

# Output JSON (untuk monitoring)
python3 scripts/ml_health_check.py --json
```

| Flag | Keterangan |
|------|------------|
| `--asset-type` | `crypto`, `stock`, `stock_us` |
| `--period` | Periode evaluasi hari (default: 30) |
| `--strict` | Exit 1 jika critical alert |
| `--quiet` / `-q` | Hanya status + alerts |
| `--json` | Output JSON |

**Health levels:**
- 🟢 Healthy — Accuracy >60%, no degradation
- 🟡 Warning — Accuracy 50-60% or declining trend
- 🔴 Critical — Accuracy <50% or rapid degradation

**Output:**
```
🟢  ML Health Report — crypto (30d)
═══════════════════════════════════
📊  Signal Accuracy
    Overall    : 62.3%  (187/300 correct)
    BUY signals: 65.1%
    SELL signals: 58.2%

    By Confidence:
      🟢 High    : 71.2%  (42 signals)
      🟡 Medium  : 58.3%  (128 signals)
      🔴 Low     : 47.8%  (130 signals)
```

---

### ml_backtest.py — Walk-Forward Backtesting

Backtesting dengan walk-forward method + Monte Carlo validation.

```bash
# Backtest top 5 crypto
python3 scripts/ml_backtest.py

# Coin tertentu
python3 scripts/ml_backtest.py --coin bitcoin,ethereum

# Custom fee
python3 scripts/ml_backtest.py --fee 0.5

# Verbose — equity curve, Monte Carlo CI
python3 scripts/ml_backtest.py --verbose

# Output JSON
python3 scripts/ml_backtest.py --json
```

| Flag | Keterangan |
|------|------------|
| `--asset-type` | `crypto`, `stock`, `stock_us` |
| `--coin` | Coin IDs, comma-separated |
| `--limit` | Max coins (default: 5) |
| `--timeframe` | `1h`, `4h`, `1D` |
| `--fee` | Roundtrip fee % (default: 0.62) |
| `--verbose` / `-v` | Equity curve, monthly returns, Monte Carlo |
| `--quiet` / `-q` | Hanya summary |
| `--json` | Output JSON |

**Output:**
```
  🟢 [1/5] BTC      WR=58.3%  PF=1.42  Sharpe=1.21  MaxDD=-12.3%  Return=+34.2%  Trades=47
  🟡 [2/5] ETH      WR=52.1%  PF=1.08  Sharpe=0.34  MaxDD=-18.7%  Return=+5.8%   Trades=52
```

**Metrik:**
- Win Rate, Profit Factor, Sharpe Ratio
- Max Drawdown, Total Return
- Monthly returns breakdown
- Monte Carlo CI (5th, 25th, 50th, 75th, 95th percentile)

---

### ml_feature_eng.py — Feature Engineering Analysis

Generate 90+ features dan analisis kualitasnya.

```bash
# Generate features top 5 crypto
python3 scripts/ml_feature_eng.py

# Coin tertentu dengan distribusi
python3 scripts/ml_feature_eng.py --coin bitcoin --show-dist

# Korelasi antar features
python3 scripts/ml_feature_eng.py --coin bitcoin --show-corr

# NaN report
python3 scripts/ml_feature_eng.py --show-nan

# Export ke CSV
python3 scripts/ml_feature_eng.py --coin bitcoin --export /tmp/features.csv
```

| Flag | Keterangan |
|------|------------|
| `--asset-type` | `crypto`, `stock`, `stock_us` |
| `--coin` | Coin IDs, comma-separated |
| `--limit` | Max coins (default: 5) |
| `--timeframe` | `1h`, `4h`, `1D` |
| `--show-dist` | Tampilkan distribusi (mean, std, min, max) |
| `--show-corr` | Top correlated pairs |
| `--show-nan` | NaN report per feature |
| `--export` | Export CSV path |
| `--quiet` / `-q` | Hanya summary |
| `--json` | Output JSON |

**Feature categories:** Price (6), Momentum (8), Trend (9), Volatility (5), Volume (5), Lags (12), Rolling (20), Microstructure (4), Wavelet (5), Fourier (4)

---

## Universal Screener CLI

### screener.py — Akses Semua 132 Screener via Satu Command

Satu CLI universal untuk semua screener service — menggantikan kebutuhan 100+ script individual. Mendukung tiga pola service: `get_candidates()`, `scan_all()`, dan custom methods.

```bash
# List semua screener yang tersedia (132 services)
python3 scripts/screener.py --list

# Jalankan screener dengan default params
python3 scripts/screener.py gem-finder
python3 scripts/screener.py oversold-bounce
python3 scripts/screener.py multibagger

# Dengan filter & options
python3 scripts/screener.py gem-finder --asset-type crypto --limit 10 --filter DIAMOND
python3 scripts/screener.py momentum-scanner --asset-type stock --limit 20 --sort score
python3 scripts/screener.py breakout-predictor --filter bullish --limit 10

# Output JSON (untuk pipeline/cron)
python3 scripts/screener.py gem-finder --json --limit 50

# Quiet mode (summary only)
python3 scripts/screener.py alpha-composite --quiet

# Search by symbol/name
python3 scripts/screener.py oversold-bounce --search BTC

# Pagination
python3 scripts/screener.py multibagger --page 2 --limit 20

# Single-coin analysis (services yang support 🔬)
python3 scripts/screener.py supply-demand --symbol BTC
python3 scripts/screener.py ichimoku --symbol ETH
python3 scripts/screener.py ml-ensemble --symbol BTC

# Extra service-specific params
python3 scripts/screener.py momentum-heatmap --extra timeframe=1h,group_by=sector
```

| Flag | Default | Keterangan |
|------|---------|------------|
| `--list`, `-l` | — | List semua screener tersedia |
| `--asset-type` | `crypto` | `crypto`, `stock`, `stock_us`, `all` |
| `--limit` | `20` | Max results |
| `--page` | `1` | Page number |
| `--sort` | service default | Sort field (e.g., `score`, `gem_score_desc`) |
| `--filter` | — | Service-specific filter (e.g., `DIAMOND`, `STRONG`, `BUY`) |
| `--min-score` | — | Minimum score filter |
| `--search` | — | Search query (symbol/name) |
| `--symbol` | — | Single coin analysis (for 🔬 services) |
| `--extra` | — | Extra params: `key1=val1,key2=val2` |
| `--json` | off | Output raw JSON |
| `--quiet`, `-q` | off | Minimal output |

**Fuzzy matching:** Supports input tanpa hyphen (`gemfinder` → `gem-finder`).

**3 Service Patterns:**

| Pattern | Jumlah | Contoh |
|---------|--------|--------|
| `get_candidates()` | 10 | oversold-bounce, breakout, swing-trade, sell-signal |
| `scan_all()` | 101 | gem-finder, multibagger, momentum-scanner, ichimoku |
| Custom method | 21 | fear-greed, leaderboard, momentum-heatmap, anomalies |

**Output Example:**
```
📊  gem-finder — Hidden gems — undervalued assets with massive upside
──────────────────────────────────────────────────────────────────────
  SYMBOL        SCORE     TIER              PRICE           CHANGE
  ────────────────────────────────────────────────────────────────────
  CHZ           70.0      RUBY              Rp 702          0.0%
  MYX           70.0      RUBY              Rp 32.1K        0.0%
  SUN           70.0      RUBY              Rp 292          0.0%

══════════════════════════════════════════════════════════════════════
📊  gem-finder — 3 results (total: 163)  |  Page 1  |  0.9s
══════════════════════════════════════════════════════════════════════
```

---

## Migration Scripts

Script migrasi database — jalankan sekali saja saat upgrade.

### migrate_coin_sources.py

Tambah tabel `coin_source_mappings` dan kolom baru di `coins`.

```bash
python3 scripts/migrate_coin_sources.py
```

### migrate_adaptive_lookback.py

Tambah kolom lookback ke `range_trading_scores`.

```bash
python3 scripts/migrate_adaptive_lookback.py
```

### migrate_cycle_frequency.py

Tambah 12 kolom cycle analysis ke `range_trading_scores`.

```bash
python3 scripts/migrate_cycle_frequency.py
```

### migrate_namespace_ids.py

Migrasi coin ID ke format namespace (`COIN.bitcoin`, `IDX.BBCA`, `NASDAQ.AAPL`).

```bash
# Backup dulu!
mysqldump -u root cornbyt1_investasikamu > backup_$(date +%Y%m%d).sql

# Jalankan migrasi
python3 scripts/migrate_namespace_ids.py

# Validasi setelah migrasi
python3 scripts/migrate_namespace_ids.py --validate
```

> **Penting:** Script ini mengubah primary key di 12+ tabel. Selalu backup database sebelum menjalankan.

---

## Cron Jobs (Contoh)

```bash
# ── DATA SYNC ──
# Sync crypto setiap jam
0 * * * * cd /path && .venv/bin/python scripts/sync_data.py --quiet >> logs/sync_crypto.log 2>&1

# Sync IDX setiap 30 menit (jam trading, weekday)
*/30 9-16 * * 1-5 cd /path && .venv/bin/python scripts/sync_data.py --mode stock --quiet >> logs/sync_stock.log 2>&1

# Sync US stocks (jam trading US = WIB malam)
0 22-23,0-5 * * 1-5 cd /path && .venv/bin/python scripts/sync_data.py --mode stock_us --quiet >> logs/sync_us.log 2>&1

# Push ke production setiap 30 menit
*/30 * * * * cd /path && .venv/bin/python scripts/remote_sync.py --direction push --quiet >> logs/remote_push.log 2>&1

# ── ML PIPELINE ──
# Train ulang model setiap hari jam 3 pagi
0 3 * * * cd /path && .venv/bin/python scripts/ml_train.py --quiet >> logs/ml_train.log 2>&1

# Prediksi setiap 6 jam
0 */6 * * * cd /path && .venv/bin/python scripts/ml_predict.py --quiet >> logs/ml_predict.log 2>&1

# Full pipeline setiap 4 jam
0 */4 * * * cd /path && .venv/bin/python scripts/ml_ensemble.py --quiet >> logs/ml_ensemble.log 2>&1

# Health check setiap 6 jam (strict = exit 1 jika degradasi)
0 */6 * * * cd /path && .venv/bin/python scripts/ml_health_check.py --strict --quiet >> logs/ml_health.log 2>&1

# Backtest mingguan (Minggu jam 6 pagi)
0 6 * * 0 cd /path && .venv/bin/python scripts/ml_backtest.py --quiet >> logs/ml_backtest.log 2>&1

# ── ANALYSIS & SCAN ──
# Scan range trading setiap hari jam 4 pagi
0 4 * * * cd /path && .venv/bin/python scripts/scan_range_trading.py >> logs/scan_range.log 2>&1

# Cycle frequency scan setiap 6 jam
0 */6 * * * cd /path && .venv/bin/python scripts/scan_cycle_frequency.py --quiet >> logs/scan_cycles.log 2>&1

# Bullish momentum scan setiap 6 jam
30 */6 * * * cd /path && .venv/bin/python scripts/scan_bullish_momentum.py --quiet >> logs/scan_bullish.log 2>&1

# Trading signals scan setiap 4 jam
0 */4 * * * cd /path && .venv/bin/python scripts/scan_trading_signals.py --quiet >> logs/scan_signals.log 2>&1

# Trading signals 1h (jam trading, weekday)
0 9-16 * * 1-5 cd /path && .venv/bin/python scripts/scan_trading_signals.py --timeframe 1h --quiet >> logs/scan_signals_1h.log 2>&1

# ── UNIVERSAL SCREENER ──
# Top gems setiap 6 jam
0 */6 * * * cd /path && .venv/bin/python scripts/screener.py gem-finder --limit 20 --quiet >> logs/screener_gems.log 2>&1

# Momentum heatmap setiap 4 jam
0 */4 * * * cd /path && .venv/bin/python scripts/screener.py momentum-scanner --limit 50 --quiet >> logs/screener_momentum.log 2>&1

# Multibagger candidates harian jam 7 pagi
0 7 * * * cd /path && .venv/bin/python scripts/screener.py multibagger --limit 30 --json >> logs/screener_multibagger.json 2>&1

# Alpha composite setiap 8 jam
0 */8 * * * cd /path && .venv/bin/python scripts/screener.py alpha-composite --limit 30 --quiet >> logs/screener_alpha.log 2>&1

# Saham IDX screener (jam trading weekday)
0 10,13,15 * * 1-5 cd /path && .venv/bin/python scripts/screener.py oversold-bounce --asset-type stock --quiet >> logs/screener_idx.log 2>&1
```
