c31096fe4b
- Add check_holidays MCP tool in server.py with SQLite caching (cache-first, API-fallback) - Add Section 6 Pre-Analysis Checklist (market status, holidays, news, analysis type) to SKILL.md - Add holidays-data named volume to docker-compose.yml for DB persistence - Add API_CO_ID_KEY and HOLIDAYS_DB_PATH env vars to Dockerfile and .env.example - Remove scripts/ directory (replaced by MCP tool), slim down Dockerfile
620 lines
24 KiB
Markdown
620 lines
24 KiB
Markdown
# SKILL: Indonesian Stock Analysis Using TradingView Screener MCP
|
||
|
||
## Overview
|
||
|
||
Use the TradingView Screener MCP tools to analyze Indonesian stocks (IDX: Jakarta Stock Exchange) by combining **fundamental analysis** (company financial health) and **technical analysis** (price/volume action). This skill provides structured methodologies to produce actionable stock analysis reports.
|
||
|
||
Indonesian stocks are accessed via `market_type="stocks"` and `market_country="indonesia"`.
|
||
|
||
---
|
||
|
||
## Available MCP Tools
|
||
|
||
| Tool | Purpose |
|
||
|------|---------|
|
||
| `get_stock_quotes(tickers=["IDX:SYMBOL"])` | Get real-time price & indicators for 1+ tickers |
|
||
| `screen_market(market_country="indonesia", ...)` | Screen across all IDX stocks with filters |
|
||
| `find_top_gainers(market_country="indonesia")` | Top gainers by % change |
|
||
| `find_top_losers(market_country="indonesia")` | Top losers by % change |
|
||
| `find_most_active(market_country="indonesia")` | Most active by volume |
|
||
| `technical_scan(market_country="indonesia", ...)` | Screen using technical conditions |
|
||
| `fundamental_scan(market_country="indonesia", ...)` | Screen using fundamental metrics |
|
||
| `check_holidays(mode="upcoming", limit=10)` | Check IDX holidays (SQLite-cached, `refresh=True` to re-fetch) |
|
||
| `check_holidays(mode="check", date="2026-05-14")` | Check if a specific date is a holiday |
|
||
| `check_holidays(mode="range", start_date="...", end_date="...")` | List holidays in a date range |
|
||
|
||
---
|
||
|
||
## 1. Get Indonesian Stock Data
|
||
|
||
### 1.1 Quote Data for Specific Stocks
|
||
|
||
```json
|
||
get_stock_quotes({
|
||
"tickers": ["IDX:BBRI", "IDX:TLKM", "IDX:ASII"],
|
||
"columns": ["name","close","change","volume","RSI","MACD.macd","MACD.signal","SMA50","SMA200","market_cap_basic","price_earnings_ttm","price_to_book_fq","dividends_yield_current","return_on_equity","sector","industry"]
|
||
})
|
||
```
|
||
|
||
### 1.2 Screen Indonesian Market
|
||
|
||
```json
|
||
screen_market({
|
||
"market_country": "indonesia",
|
||
"columns": ["name","close","change","volume","RSI","market_cap_basic","price_earnings_ttm"],
|
||
"order_by": "volume",
|
||
"limit": 50
|
||
})
|
||
```
|
||
|
||
### 1.3 Fundamental Screen
|
||
|
||
```json
|
||
fundamental_scan({
|
||
"market_country": "indonesia",
|
||
"filters": [
|
||
{"field": "market_cap_basic", "operator": ">", "value": 10000000000000},
|
||
{"field": "price_earnings_ttm", "operator": "between", "value": [5, 20]},
|
||
{"field": "dividends_yield_current", "operator": ">", "value": 2},
|
||
{"field": "return_on_equity", "operator": ">", "value": 10}
|
||
],
|
||
"columns": ["name","close","market_cap_basic","price_earnings_ttm","price_to_book_fq","dividends_yield_current","return_on_equity","debt_to_equity","profit_margin","sector"]
|
||
})
|
||
```
|
||
|
||
### 1.4 Technical Scan
|
||
|
||
```json
|
||
technical_scan({
|
||
"market_country": "indonesia",
|
||
"filters": [
|
||
{"field": "RSI", "operator": "<", "value": 35},
|
||
{"field": "close", "operator": "above_pct", "value": ["SMA200", 0.95]}
|
||
],
|
||
"columns": ["name","close","change","RSI","SMA50","SMA200","volume","relative_volume_10d_calc"]
|
||
})
|
||
```
|
||
|
||
---
|
||
|
||
## 2. Fundamental Analysis Framework
|
||
|
||
### Core Metrics Table
|
||
|
||
| Metric | Field Name | What It Tells You | Healthy Range (IDX) |
|
||
|--------|-----------|-------------------|-------------------|
|
||
| **Market Cap** | `market_cap_basic` | Company size (in IDR) | Large-cap: >10T IDR |
|
||
| **P/E Ratio** | `price_earnings_ttm` | Price per unit of earnings | 8-18 (value); 18-30 (growth) |
|
||
| **P/B Ratio** | `price_to_book_fq` | Price vs book value | <2.5 for banks; <1.5 for cyclicals |
|
||
| **P/S Ratio** | `price_to_sales` | Price per unit of revenue | <3 (undervalued) >5 (premium) |
|
||
| **P/CF Ratio** | `price_to_cash_flow` | Price vs operating cash flow | <15 (reasonable) |
|
||
| **EPS (TTM)** | `earnings_per_share_diluted_ttm` | Profit per share | Positive & growing |
|
||
| **EPS Growth** | `earnings_per_share_diluted_yoy_growth_ttm` | Earnings momentum | >10% YoY |
|
||
| **Revenue Growth** | `revenue_growth` | Top-line growth | >5% (mature) >15% (growth) |
|
||
| **Earnings Growth** | `earnings_growth` | Bottom-line growth | Should track revenue growth |
|
||
| **ROE** | `return_on_equity` | Return on shareholder equity | >12% (good) >20% (excellent) |
|
||
| **ROA** | `return_on_assets` | Return on total assets | >5% (good) |
|
||
| **Profit Margin** | `profit_margin` | Net profit margin | >10% (good) |
|
||
| **Operating Margin** | `operating_margin` | Operating efficiency | >15% (good) |
|
||
| **Debt/Equity** | `debt_to_equity` | Leverage ratio | <1 (conservative) <2 (moderate) |
|
||
| **Current Ratio** | `current_ratio_fq` | Liquidity | >1.5 (safe) |
|
||
| **Dividend Yield** | `dividends_yield_current` | Dividend return | 2-6% (varies by sector) |
|
||
| **Beta** | `beta_1_year` | Volatility vs market | 0.5-1.5 (typical) |
|
||
| **Sector** | `sector` | Industry classification | — |
|
||
| **Industry** | `industry` | Sub-industry | — |
|
||
|
||
### 2.1 Valuation Analysis
|
||
|
||
Use this combo to assess if a stock is **undervalued, fair, or overvalued**:
|
||
|
||
```
|
||
P/E + P/B + P/S + Dividend Yield + EPS Growth → Valuation Picture
|
||
<10 + <1 + <1 + >4% + positive → Deep value
|
||
10-15 + 1-2 + 1-3 + 2-4% + 5-15% → Fair value
|
||
15-25 + 2-4 + 3-6 + 1-2% + 15-25% → Growth premium
|
||
>25 + >4 + >6 + <1% + >25% → Overvalued / high growth
|
||
```
|
||
|
||
### 2.2 Quality Analysis (PEG + ROE + Debt)
|
||
|
||
```
|
||
PEG Ratio = P/E ÷ EPS Growth
|
||
- <1.0 → Undervalued relative to growth
|
||
- 1.0-2.0 → Fairly valued
|
||
- >2.0 → Overvalued relative to growth
|
||
|
||
Quality Score (0-3):
|
||
- ROE > 15% → +1
|
||
- D/E < 1.0 → +1
|
||
- Profit Margin > 10% → +1
|
||
```
|
||
|
||
### 2.3 Indonesian Market-Specific Notes
|
||
|
||
- **Sector concentration**: IDX is dominated by Financials (banks: BBRI, BMRI, BBNI), Consumer (UNVR, ICBP, INDF), Telecom (TLKM), Mining/Energy (ADRO, ITMG, BUMI), and Infrastructure (JSMR, TLKM).
|
||
- **Liquidity matters**: Only stocks with daily volume > 1M shares are reliably tradeable.
|
||
- **Foreign ownership**: Sudden changes affect price — track institutional/insider ownership.
|
||
- **Regulatory influence**: Government policy (energy, mining, banking) heavily impacts IDX.
|
||
- **Rupiah (IDR) risk**: Currency depreciation hurts import-heavy sectors, benefits export/mining.
|
||
- **Dividend season**: Most IDX companies pay dividends once a year around April-June.
|
||
- **ARB / ARA limits**: IDX has daily price limits (7% down = ARB, up = ARA typically for most stocks, but can vary). Use `low`/`high` to check.
|
||
|
||
---
|
||
|
||
## 3. Technical Analysis Framework
|
||
|
||
### Core Indicators
|
||
|
||
| Indicator | Field | What It Does | How to Interpret |
|
||
|-----------|-------|-------------|------------------|
|
||
| **RSI (14)** | `RSI` | Momentum oscillator (0-100) | >70 overbought, <30 oversold |
|
||
| **RSI (5)** | `RSI.5` | Short-term momentum | Same, faster signals |
|
||
| **MACD** | `MACD.macd`, `MACD.signal`, `MACD.histogram` | Trend-momentum | Line > Signal → bullish, < Signal → bearish |
|
||
| **Stochastic** | `Stoch.K`, `Stoch.D` | %K & %D lines | >80 overbought, <20 oversold; K crosses D → signal |
|
||
| **Bollinger Bands** | `BB.upper`, `BB.middle`, `BB.lower` | Volatility bands | Touch upper → overextended; touch lower → potential bounce |
|
||
| **SMA 20** | `SMA20` | Short-term trend | Price > SMA20 → short-term uptrend |
|
||
| **SMA 50** | `SMA50` | Medium-term trend | Price > SMA50 → medium-term uptrend |
|
||
| **SMA 200** | `SMA200` | Long-term trend | Price > SMA200 → long-term bull market |
|
||
| **EMA 5/20/50/200** | `EMA5`, `EMA20`, `EMA50`, `EMA200` | Exponential MA (faster response) | Same as SMA but more current-price-sensitive |
|
||
| **ADX** | `ADX` | Trend strength | >25 → trending; <25 → ranging |
|
||
| **ATR** | `ATR` | Volatility measure | Higher → wider stops needed |
|
||
| **CCI (20)** | `CCI20` | Commodity Channel Index | >100 overbought, <-100 oversold |
|
||
| **OBV** | `OBV` | On-Balance Volume | Confirms price trends; divergence warns of reversal |
|
||
| **Williams %R** | `Williams %R` | Momentum (-100 to 0) | <-80 oversold, >-20 overbought |
|
||
| **Awesome Osc** | `AO` | Momentum (SMA5-SMA34) | >0 bullish momentum, <0 bearish |
|
||
| **VWAP** | `VWAP` | Volume-weighted avg price | Above VWAP → bullish intraday |
|
||
| **52W High/Low** | `52 Week High`, `52 Week Low` | Yearly range | Near 52W high → strong trend; near 52W low → weak |
|
||
| **Rel Volume** | `relative_volume_10d_calc` | Volume vs 10d avg | >1.5 → unusually active |
|
||
| **Tech Rating** | `TechRating_1D` | Aggregate daily rating | 0-6 range (6 = best) |
|
||
|
||
### 3.1 Trend Confirmation Pattern
|
||
|
||
```
|
||
Bullish Setup:
|
||
- Price > SMA50 > SMA200 (golden arrangement)
|
||
- SMA50 > SMA200 (golden cross already happened)
|
||
- RSI between 40-70 (room to run)
|
||
- MACD > Signal line (momentum up)
|
||
- ADX > 25 (trending)
|
||
|
||
Bearish Setup:
|
||
- Price < SMA50 < SMA200 (death arrangement)
|
||
- SMA50 < SMA200 (death cross)
|
||
- RSI between 30-50
|
||
- MACD < Signal line
|
||
- ADX > 25 (trending)
|
||
```
|
||
|
||
### 3.2 Reversal / Bounce Pattern
|
||
|
||
```
|
||
Potential Bottom:
|
||
- RSI < 30 (oversold)
|
||
- Price near BB.lower or below SMA200
|
||
- MACD histogram narrowing (bearish momentum fading)
|
||
- Stoch.K crossing above Stoch.D near <20
|
||
- OBV diverging bullish (price lower, OBV higher)
|
||
|
||
Potential Top:
|
||
- RSI > 70 (overbought)
|
||
- Price near BB.upper or far above SMA200
|
||
- MACD histogram narrowing (bullish momentum fading)
|
||
- Stoch.K crossing below Stoch.D near >80
|
||
- OBV diverging bearish (price higher, OBV lower)
|
||
```
|
||
|
||
### 3.3 Volume Analysis
|
||
|
||
```
|
||
relative_volume_10d_calc:
|
||
- > 2.0 → Extraordinary volume (breakout / breakdown)
|
||
- 1.5-2.0 → Above average (institutional interest)
|
||
- 1.0-1.5 → Normal activity
|
||
- < 0.5 → Low interest (illiquid)
|
||
|
||
Powerful signals:
|
||
- Price up + Volume > 1.5x → Strong accumulation
|
||
- Price up + Volume < 0.7x → Weak rally (may reverse)
|
||
- Price down + Volume > 1.5x → Strong distribution
|
||
- Price down + Volume < 0.7x → Exhaustion (may bottom)
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Comprehensive Analysis Template
|
||
|
||
Use this structure when asked to analyze a specific Indonesian stock. Fetch data in a single batch call using `get_stock_quotes` with ALL relevant columns.
|
||
|
||
### Required Data Fetch
|
||
|
||
```json
|
||
get_stock_quotes({
|
||
"tickers": ["IDX:{TICKER}"],
|
||
"columns": [
|
||
"name","description","sector","industry","exchange","currency",
|
||
"close","open","high","low","volume","change","change_abs",
|
||
"market_cap_basic","price_earnings_ttm","earnings_per_share_diluted_ttm",
|
||
"earnings_per_share_diluted_yoy_growth_ttm","price_to_book_fq","price_to_sales",
|
||
"price_to_cash_flow","dividends_yield_current","dividends_payout_ratio",
|
||
"return_on_equity","return_on_assets","operating_margin","profit_margin",
|
||
"revenue_growth","earnings_growth","debt_to_equity","current_ratio_fq",
|
||
"beta_1_year","float","shares_outstanding",
|
||
"RSI","RSI.5","Stoch.K","Stoch.D","MACD.macd","MACD.signal","MACD.histogram",
|
||
"BB.upper","BB.middle","BB.lower","SMA20","SMA50","SMA200",
|
||
"ADX","ATR","CCI20","OBV","AO","Williams %R",
|
||
"VWAP","52 Week High","52 Week Low","relative_volume_10d_calc","volume_ma_10",
|
||
"TechRating_1D"
|
||
]
|
||
})
|
||
```
|
||
|
||
### 4.1 Analysis Report Format
|
||
|
||
```
|
||
# Stock Analysis: {NAME} ({TICKER})
|
||
|
||
## Company Overview
|
||
- Sector: {sector}
|
||
- Industry: {industry}
|
||
- Market Cap: {market_cap_basic} IDR
|
||
- Description: {description}
|
||
|
||
## Price Snapshot
|
||
- Current Price: {close}
|
||
- Daily Change: {change}% ({change_abs})
|
||
- 52W Range: {52 Week Low} - {52 Week High}
|
||
- VWAP: {VWAP}
|
||
|
||
## Fundamental Analysis
|
||
|
||
### Valuation
|
||
- P/E (TTM): {price_earnings_ttm} — [Undervalued/Fair/Overvalued — explain vs sector avg]
|
||
- P/B: {price_to_book_fq} — [Price vs book value assessment]
|
||
- P/S: {price_to_sales}
|
||
- P/CF: {price_to_cash_flow}
|
||
- Dividend Yield: {dividends_yield_current}%
|
||
|
||
### Profitability
|
||
- ROE: {return_on_equity}%
|
||
- ROA: {return_on_assets}%
|
||
- Operating Margin: {operating_margin}%
|
||
- Profit Margin: {profit_margin}%
|
||
|
||
### Growth & Momentum
|
||
- EPS (TTM): {earnings_per_share_diluted_ttm}
|
||
- EPS YoY Growth: {earnings_per_share_diluted_yoy_growth_ttm}%
|
||
- Revenue Growth: {revenue_growth}%
|
||
- Earnings Growth: {earnings_growth}%
|
||
|
||
### Financial Health
|
||
- Debt/Equity: {debt_to_equity}
|
||
- Current Ratio: {current_ratio_fq}
|
||
- Beta (1Y): {beta_1_year}
|
||
|
||
## Technical Analysis
|
||
|
||
### Trend
|
||
- Price vs SMA20: {close vs SMA20}
|
||
- Price vs SMA50: {close vs SMA50}
|
||
- Price vs SMA200: {close vs SMA200}
|
||
- ADX: {ADX} — [Trending (ADX>25) or Ranging]
|
||
- Overall Trend: [Bullish/Bearish/Neutral]
|
||
|
||
### Momentum
|
||
- RSI (14): {RSI} — [Overbought/Oversold/Neutral]
|
||
- RSI (5): {RSI.5}
|
||
- MACD: {MACD.macd} vs Signal {MACD.signal} — [Bullish/Bearish crossover? Histogram {MACD.histogram}]
|
||
- Stochastic: %K {Stoch.K} vs %D {Stoch.D}
|
||
- CCI (20): {CCI20}
|
||
- Williams %R: {Williams %R}
|
||
- Awesome Osc: {AO} — [Positive=Bearish momentum waiting / Negative=Bearish / Positive=Bulish / Negative=Bearish momentum waiting]
|
||
|
||
### Volatility
|
||
- ATR: {ATR}
|
||
- Bollinger Bands Position: {close relative to BB.upper/BB.lower}
|
||
- 52W Range Position: {(close - 52W Low) / (52W High - 52W Low) * 100}%
|
||
|
||
### Volume
|
||
- Volume: {volume}
|
||
- vs 10d Avg: {relative_volume_10d_calc}x
|
||
- OBV: {OBV}
|
||
- Vol MA(10): {volume_ma_10}
|
||
|
||
### Technical Rating
|
||
- TechRating_1D: {TechRating_1D}/6
|
||
|
||
## Summary & Verdict
|
||
|
||
### Fundamental Verdict
|
||
- [BUY / HOLD / SELL] — Based on valuation, profitability, growth, and financial health
|
||
|
||
### Technical Verdict
|
||
- [BUY / HOLD / SELL] — Based on trend, momentum, volume, and volatility
|
||
|
||
### Overall Recommendation
|
||
- [Strong Buy / Buy / Hold / Sell / Strong Sell]
|
||
- Key Catalysts/Risks:
|
||
1. ...
|
||
2. ...
|
||
3. ...
|
||
```
|
||
|
||
### 4.2 Interpretation for Specific Indonesian Sectors
|
||
|
||
**Financials / Banks (BBRI, BMRI, BBNI, BBTN)**:
|
||
- Focus on: P/B (<1.5 is cheap), ROE (>15%), NIM, D/E
|
||
- Healthy D/E is higher for banks (5-10x is normal)
|
||
- Low P/B + ROE > 15% = classic Graham-style buy for Indonesian banks
|
||
|
||
**Consumer Goods (UNVR, ICBP, INDF, HMSP, GGRM)**:
|
||
- Focus on: Profit Margin > 12%, Revenue Growth > 5%, Dividend Yield
|
||
- Low D/E expected (< 0.8)
|
||
- Stable performers during economic uncertainty
|
||
|
||
**Mining / Energy (ADRO, ITMG, PTBA, MEDC)**:
|
||
- Focus on: P/E (cyclical — buy at high P/E when earnings are low, avoid low P/E when earnings peak)
|
||
- Revenue Growth & Earnings Growth are commodity-price-driven
|
||
- High dividend yields common in coal sector
|
||
|
||
**Infrastructure / Telco (TLKM, ISAT, JSMR, EXCL)**:
|
||
- Focus on: D/E (cap-ex heavy), Profit Margin, Revenue Growth
|
||
- P/E range 10-20 is normal for TLKM
|
||
|
||
**Property / Real Estate (BSDE, PWON, CTRA, SMRA)**:
|
||
- Focus on: P/B, Current Ratio, D/E
|
||
- Highly sensitive to interest rates and BI policy
|
||
|
||
### 4.3 Rating Scale
|
||
|
||
When combining fundamental + technical into an overall verdict:
|
||
|
||
| Score | Rating | Criteria |
|
||
|-------|--------|----------|
|
||
| 4.5-5.0 | **Strong Buy** | Undervalued + Bullish technical + Strong financials |
|
||
| 3.5-4.4 | **Buy** | Fair/Undervalued + Bullish/neutral technical + Good financials |
|
||
| 2.5-3.4 | **Hold** | Fair value + mixed technical + average financials |
|
||
| 1.5-2.4 | **Sell** | Overvalued + bearish technical + weak financials |
|
||
| 1.0-1.4 | **Strong Sell** | Overvalued + bearish technical + poor financials |
|
||
|
||
---
|
||
|
||
## 5. Quick Screening Commands
|
||
|
||
### Find Undervalued Large-Caps in IDX
|
||
```json
|
||
fundamental_scan({
|
||
"market_country": "indonesia",
|
||
"filters": [
|
||
{"field": "market_cap_basic", "operator": ">", "value": 10000000000000},
|
||
{"field": "price_earnings_ttm", "operator": "between", "value": [5, 15]},
|
||
{"field": "price_to_book_fq", "operator": "<", "value": 2},
|
||
{"field": "return_on_equity", "operator": ">", "value": 12}
|
||
],
|
||
"columns": ["name","close","change","market_cap_basic","price_earnings_ttm","price_to_book_fq","return_on_equity","dividends_yield_current","sector"],
|
||
"order_by": "market_cap_basic",
|
||
"limit": 20
|
||
})
|
||
```
|
||
|
||
### Find Oversold Bounce Candidates
|
||
```json
|
||
technical_scan({
|
||
"market_country": "indonesia",
|
||
"filters": [
|
||
{"field": "RSI", "operator": "<", "value": 30},
|
||
{"field": "close", "operator": "above_pct", "value": ["SMA200", 0.9]},
|
||
{"field": "relative_volume_10d_calc", "operator": ">", "value": 1.2}
|
||
],
|
||
"columns": ["name","close","change","RSI","SMA200","relative_volume_10d_calc","MACD.histogram"],
|
||
"order_by": "RSI",
|
||
"limit": 20
|
||
})
|
||
```
|
||
|
||
### Find Breakout Candidates
|
||
```json
|
||
technical_scan({
|
||
"market_country": "indonesia",
|
||
"filters": [
|
||
{"field": "RSI", "operator": "between", "value": [50, 70]},
|
||
{"field": "close", "operator": ">", "value": "SMA50"},
|
||
{"field": "close", "operator": ">", "value": "SMA200"},
|
||
{"field": "relative_volume_10d_calc", "operator": ">", "value": 1.5},
|
||
{"field": "ADX", "operator": ">", "value": 25}
|
||
],
|
||
"columns": ["name","close","change","RSI","SMA50","SMA200","ADX","relative_volume_10d_calc"],
|
||
"order_by": "relative_volume_10d_calc",
|
||
"limit": 20
|
||
})
|
||
```
|
||
|
||
### Find High-Dividend Stocks
|
||
```json
|
||
fundamental_scan({
|
||
"market_country": "indonesia",
|
||
"filters": [
|
||
{"field": "dividends_yield_current", "operator": ">", "value": 4},
|
||
{"field": "market_cap_basic", "operator": ">", "value": 5000000000000},
|
||
{"field": "price_earnings_ttm", "operator": "<", "value": 20},
|
||
{"field": "dividends_payout_ratio", "operator": "<", "value": 80}
|
||
],
|
||
"columns": ["name","close","dividends_yield_current","dividends_payout_ratio","price_earnings_ttm","market_cap_basic","sector"],
|
||
"order_by": "dividends_yield_current",
|
||
"limit": 20
|
||
})
|
||
```
|
||
|
||
### Find Growth Stocks
|
||
```json
|
||
fundamental_scan({
|
||
"market_country": "indonesia",
|
||
"filters": [
|
||
{"field": "revenue_growth", "operator": ">", "value": 15},
|
||
{"field": "earnings_growth", "operator": ">", "value": 10},
|
||
{"field": "return_on_equity", "operator": ">", "value": 10},
|
||
{"field": "market_cap_basic", "operator": ">", "value": 1000000000000}
|
||
],
|
||
"columns": ["name","close","revenue_growth","earnings_growth","return_on_equity","price_earnings_ttm","market_cap_basic","sector"],
|
||
"order_by": "revenue_growth",
|
||
"limit": 20
|
||
})
|
||
```
|
||
|
||
---
|
||
|
||
## 6. Pre-Analysis Checklist
|
||
|
||
Before running any analysis, always perform these 3 preliminary checks:
|
||
|
||
### 6.1 Check Today's Date & Market Status
|
||
|
||
IDX (Bursa Efek Indonesia) trading schedule:
|
||
- **Session 1:** 09:00 – 12:00 WIB
|
||
- **Session 2:** 13:30 – 15:50 WIB (pre-closing: 15:50-16:00)
|
||
- **Trading days:** Monday – Friday
|
||
- **Weekend:** Closed Saturday & Sunday
|
||
|
||
Use `bash` with `date` to check today's date and day-of-week. Determine if market is open/closed.
|
||
|
||
### 6.2 Check Indonesian Holidays (MCP Tool — SQLite Cached)
|
||
|
||
IDX is also closed on national holidays. Holidays can cause multi-day breaks (e.g., 4 days off for long weekends), which significantly impacts BSJP and short-term strategies.
|
||
|
||
**Use the `check_holidays` MCP tool instead of the shell script** — the data is stored in `holidays.db` (SQLite) so subsequent calls are instant:
|
||
|
||
```
|
||
# Upcoming holidays (default, next 10):
|
||
check_holidays(mode="upcoming", limit=10)
|
||
|
||
# All holidays for a given year:
|
||
check_holidays(mode="year", year=2026)
|
||
|
||
# Check if a specific date is a holiday:
|
||
check_holidays(mode="check", date="2026-05-14")
|
||
|
||
# List holidays in a date range:
|
||
check_holidays(mode="range", start_date="2026-05-01", end_date="2026-05-31")
|
||
|
||
# Force re-fetch from API (bypass cache):
|
||
check_holidays(mode="upcoming", refresh=True)
|
||
```
|
||
|
||
The first call fetches from the API and caches. Subsequent calls read directly from SQLite. Pass `refresh=True` to force a fresh fetch.
|
||
|
||
Requires `API_CO_ID_KEY` in `.env`.
|
||
|
||
**Holiday impact on analysis:**
|
||
- If today is the last trading day before a multi-day holiday, BSJP entries become **extended holds** (2-4 days instead of overnight). The gap at reopening can be larger.
|
||
- Historical candle data showing "flat" prices across dates may actually mean the market was closed — that the stock didn't move.
|
||
- Always cross-reference dates against the holiday calendar before drawing conclusions about price action.
|
||
|
||
### 6.3 Include Market Calendar in Every Report
|
||
|
||
```
|
||
Analysis Date: {YYYY-MM-DD HH:MM WIB}
|
||
Day: {Monday/Tuesday/...}
|
||
Market Status: [OPEN / CLOSED]
|
||
Last Trading Day: {YYYY-MM-DD}
|
||
Next Trading Day: {YYYY-MM-DD}
|
||
Upcoming Holidays: {list any within next 14 days}
|
||
Holiday Note: {if next trading day is after a break, flag this}
|
||
```
|
||
|
||
### 6.4 News Search for Target Stocks
|
||
|
||
Before analyzing any stock, search for recent news that may affect price:
|
||
|
||
```
|
||
websearch(query="{Stock Name} {Ticker} berita saham terbaru {YYYY}")
|
||
```
|
||
|
||
Key things to look for:
|
||
- Earnings releases / financial reports
|
||
- Insider buying/selling
|
||
- Sector-wide news (commodity prices, regulation changes)
|
||
- Corporate actions (stock split, rights issue, buyback)
|
||
- Analyst ratings changes
|
||
|
||
Include relevant news in the report under a "Recent News & Catalysts" section.
|
||
|
||
### 6.5 Determine Analysis Type
|
||
|
||
Depending on what the user asks, pick one of these paths:
|
||
|
||
| Analysis Type | Data Needed |
|
||
|--------------|-------------|
|
||
| **Full fundamental + technical** | All columns (Section 4 template) |
|
||
| **BSJP (Beli Sore Jual Pagi)** | Top losers today, RSI, volume, BB.lower, market cap |
|
||
| **Breakout scan** | RSI 50-70, SMA50/200, ADX >25, rel volume >1.5 |
|
||
| **Oversold bounce** | RSI <30, near SMA200/SMA50, volume confirmation |
|
||
| **Dividend hunting** | Dividend yield, payout ratio, P/E, market cap |
|
||
|
||
---
|
||
|
||
## 7. Workflow: How to Run Full Analysis
|
||
|
||
**Step 0** — Run Pre-Analysis Checklist (Section 6):
|
||
```
|
||
date → check today's date & day
|
||
check_holidays(mode="upcoming") → check upcoming IDX holidays (SQLite-cached)
|
||
check_holidays(mode="check", date="YYYY-MM-DD") → verify if key dates are holidays
|
||
websearch → check news for target ticker
|
||
```
|
||
|
||
**Step 1** — Get company overview & fundamentals:
|
||
```
|
||
get_stock_quotes(tickers=["IDX:BBRI"], columns=[all fundamental + general fields])
|
||
```
|
||
|
||
**Step 2** — Get technical indicators:
|
||
```
|
||
get_stock_quotes(tickers=["IDX:BBRI"], columns=[all technical fields + price fields])
|
||
```
|
||
|
||
**Step 3** — Get sector context:
|
||
```
|
||
screen_market({
|
||
"market_country": "indonesia",
|
||
"filters": [{"field": "sector", "operator": "==", "value": "Financials"}],
|
||
"columns": ["name","close","change","price_earnings_ttm","return_on_equity","market_cap_basic"],
|
||
"limit": 10
|
||
})
|
||
```
|
||
|
||
**Step 4** — Produce report following Section 4 template.
|
||
|
||
---
|
||
|
||
## 8. Field Reference (for constructing queries)
|
||
|
||
### Indonesian Stock Ticker Format
|
||
- `IDX:BBRI` — Bank Rakyat Indonesia
|
||
- `IDX:TLKM` — Telkom Indonesia
|
||
- `IDX:ASII` — Astra International
|
||
- `IDX:UNVR` — Unilever Indonesia
|
||
- `IDX:ICBP` — Indofood CBP
|
||
- `IDX:INDF` — Indofood Sukses Makmur
|
||
- `IDX:BMRI` — Bank Mandiri
|
||
- `IDX:BBNI` — Bank Negara Indonesia
|
||
- `IDX:ADRO` — Adaro Energy
|
||
- `IDX:ITMG` — Indo Tambangraya Megah
|
||
- `IDX:JSMR` — Jasa Marga
|
||
- `IDX:PGAS` — Perusahaan Gas Negara
|
||
- `IDX:SMGR` — Semen Indonesia
|
||
- `IDX:CTRA` — Ciputra Development
|
||
- `IDX:PWON` — Pakuwon Jati
|
||
- `IDX:BSDE` — Bumi Serpong Damai
|
||
- `IDX:EXCL` — XL Axiata
|
||
- `IDX:ISAT` — Indosat
|
||
- `IDX:HMSP` — HM Sampoerna
|
||
- `IDX:GGRM` — Gudang Garam
|
||
|
||
### All Available Columns (for easy copy-paste)
|
||
|
||
```
|
||
General: name, description, ticker, exchange, market, sector, industry, country, currency, type, typespecs, is_primary
|
||
Price: open, high, low, close, volume, change, change_abs, premarket_change, postmarket_change, VWAP, 52 Week High, 52 Week Low
|
||
Fundamental: market_cap_basic, price_earnings_ttm, earnings_per_share_diluted_ttm, earnings_per_share_diluted_yoy_growth_ttm, dividends_yield_current, dividends_payout_ratio, price_to_book_fq, price_to_sales, price_to_cash_flow, return_on_equity, return_on_assets, operating_margin, profit_margin, revenue_growth, earnings_growth, debt_to_equity, current_ratio_fq, beta_1_year, float, shares_outstanding, insider_ownership, institutional_ownership, AnalystRating
|
||
Technical: RSI, RSI.5, Stoch.K, Stoch.D, MACD.macd, MACD.signal, MACD.histogram, BB.upper, BB.middle, BB.lower, SMA, EMA, SMA20, SMA50, SMA200, EMA5, EMA20, EMA50, EMA200, ADX, ATR, AO, OBV, CCI20, ROC, Williams %R, relative_volume_10d_calc, volume_ma_10, TechRating_1D
|
||
```
|