OHLC.dev editorial

IDX Market Intelligence Dashboard with Top Brokers and Economic Calendar

IDX Market Intelligence Dashboard is a Python-based dashboard project that combines Top Brokers data and Economic Calendar data. The notebook displays broker activity, economic agendas, insight sections, and a conclusion to help users understand market conditions more simply.

June 14, 20265 min readRafatar
IDX Market Intelligence Dashboard with Top Brokers and Economic Calendar

Understanding market conditions is not only about reading stock prices. Broker activity can show market participation, while economic calendar data can help investors understand important events that may influence market sentiment.

This project builds an IDX Market Intelligence Dashboard using Python. The notebook combines Top Brokers data and Economic Calendar data into one simple dashboard so users can read broker activity and economic agendas more easily.

CELL 1 — Import Libraries

import requests
import pandas as pd
import time
from IPython.display import display, Markdown

Explanation

Cell 1 imports the required Python libraries.

The notebook uses requests to retrieve data from the API, pandas to process data into dataframes, time to add delays between requests, and display with Markdown to present the dashboard more neatly.

CELL 2 — API Configuration

BASE_URL = "https://indonesia-stock-exchange-idx.p.rapidapi.com"

HEADERS = {
    "Content-Type": "application/json",
    "x-rapidapi-host": "indonesia-stock-exchange-idx.p.rapidapi.com",
    "x-rapidapi-key": "YOUR_API_KEY"
}

Explanation

Cell 2 defines the API configuration.

BASE_URL stores the main API address. HEADERS contains the request configuration needed to access the IDX API through RapidAPI.

CELL 3 — Fetch API Function

def fetch_api(endpoint, params=None, max_retries=3, delay=5):
    url = BASE_URL + endpoint

    for attempt in range(1, max_retries + 1):
        try:
            response = requests.get(url, headers=HEADERS, params=params, timeout=30)

            if response.status_code == 200:
                return response.json()

            elif response.status_code == 429:
                print(f"⚠️ Rate limit terkena. Menunggu {delay} detik... Percobaan {attempt}/{max_retries}")
                time.sleep(delay)

            else:
                print(f"❌ Error {response.status_code}: {response.text}")
                return None

        except Exception as e:
            print(f"❌ Terjadi error: {e}")
            time.sleep(delay)

    return None


def extract_list(data):
    if data is None:
        return []

    if isinstance(data, list):
        return data

    if isinstance(data, dict):
        for key in ["data", "result", "results", "items"]:
            if key in data and isinstance(data[key], list):
                return data[key]

        return [data]

    return []

Explanation

Cell 3 creates the API helper functions.

fetch_api() is used to request data from an endpoint. It includes retry handling when rate limits occur. If the response status is 429, the notebook waits before trying again.

extract_list() is used to extract list-based data from API responses.

CELL 4 — Retrieve API Data

top_brokers_endpoint = "/api/market-detector/top-broker"

top_brokers_params = {
    "marketType": "MARKET_TYPE_ALL",
    "period": "TB_PERIOD_LAST_1_DAY",
    "order": "ORDER_BY_ASC",
    "sort": "TB_SORT_BY_TOTAL_VALUE"
}

economic_calendar_endpoint = "/api/calendar/economic"


display(Markdown("## 🔄 Mengambil Data dari API"))

top_brokers_raw = fetch_api(top_brokers_endpoint, params=top_brokers_params)

time.sleep(5)

economic_calendar_raw = fetch_api(economic_calendar_endpoint)

display(Markdown("✅ Proses pengambilan data selesai."))

Explanation

Cell 4 retrieves data from two API endpoints.

The first endpoint retrieves Top Brokers data. The second endpoint retrieves Economic Calendar data.

The notebook also adds a delay between requests using time.sleep(5) and displays a completion message after the data retrieval process is finished.

CELL 5 — Dashboard and Analysis

display(Markdown("# 📊 IDX Market Intelligence Dashboard"))
display(Markdown("Dashboard sederhana untuk membaca data **Top Brokers** dan **Economic Calendar** agar lebih mudah dipahami."))


# =========================
# TOP BROKERS
# =========================

display(Markdown("## 🏆 Top Brokers Berdasarkan Total Value"))

try:
    broker_list = top_brokers_raw["data"]["data"]["list"]
    df_brokers = pd.DataFrame(broker_list)

    if not df_brokers.empty:
        display(Markdown(f"Jumlah broker yang berhasil ditampilkan: **{len(df_brokers)} broker**"))

        kolom_broker = [
            col for col in [
                "code", "name", "total_value", "net_value",
                "buy_value", "sell_value", "group"
            ] if col in df_brokers.columns
        ]

        df_brokers_view = df_brokers[kolom_broker].copy()

        rename_broker = {
            "code": "Kode Broker",
            "name": "Nama Broker",
            "total_value": "Total Nilai Transaksi",
            "net_value": "Net Value",
            "buy_value": "Nilai Beli",
            "sell_value": "Nilai Jual",
            "group": "Grup Broker"
        }

        df_brokers_view = df_brokers_view.rename(columns=rename_broker)

        for col in ["Total Nilai Transaksi", "Net Value", "Nilai Beli", "Nilai Jual"]:
            if col in df_brokers_view.columns:
                df_brokers_view[col] = df_brokers_view[col].apply(
                    lambda x: f"Rp {x:,.0f}".replace(",", ".") if pd.notnull(x) else "-"
                )

        display(df_brokers_view.head(20))

        top_broker = df_brokers_view.iloc[0]

        display(Markdown(f"""
### 🧠 Insight Top Broker

Broker dengan aktivitas transaksi terbesar adalah **{top_broker.get("Nama Broker", "-")}**  
dengan kode broker **{top_broker.get("Kode Broker", "-")}**.

Artinya, broker ini menjadi salah satu broker yang paling aktif berdasarkan total nilai transaksi pada periode data yang diambil.
"""))

    else:
        display(Markdown("❌ Data broker kosong."))

except Exception as e:
    display(Markdown(f"❌ Gagal mengolah data Top Brokers: `{e}`"))


# =========================
# ECONOMIC CALENDAR
# =========================

display(Markdown("## 🗓️ Economic Calendar"))

try:
    economic_list = economic_calendar_raw["data"]["data"]["economic"]
    df_economic = pd.DataFrame(economic_list)

    if not df_economic.empty:
        display(Markdown(f"Jumlah agenda ekonomi yang berhasil ditampilkan: **{len(df_economic)} agenda**"))

        kolom_economic = [
            col for col in [
                "econcal_date", "econcal_time", "country",
                "event", "actual", "previous", "forecast"
            ] if col in df_economic.columns
        ]

        df_economic_view = df_economic[kolom_economic].copy()

        rename_economic = {
            "econcal_date": "Tanggal",
            "econcal_time": "Waktu",
            "country": "Negara",
            "event": "Agenda Ekonomi",
            "actual": "Aktual",
            "previous": "Sebelumnya",
            "forecast": "Perkiraan"
        }

        df_economic_view = df_economic_view.rename(columns=rename_economic)

        display(df_economic_view.head(20))

        display(Markdown("""
### 🧠 Insight Economic Calendar

Economic Calendar berisi daftar agenda ekonomi penting seperti data inflasi, suku bunga, tenaga kerja, dan indikator ekonomi lainnya.

Data ini penting karena agenda ekonomi dapat memengaruhi sentimen pasar dan pergerakan harga saham.
"""))

    else:
        display(Markdown("❌ Data kalender ekonomi kosong."))

except Exception as e:
    display(Markdown(f"❌ Gagal mengolah data Economic Calendar: `{e}`"))


# =========================
# KESIMPULAN
# =========================

display(Markdown("""
## ✅ Kesimpulan

Dari projek ini, pengguna dapat membaca:

1. **Broker paling aktif** berdasarkan total nilai transaksi.
2. **Agenda ekonomi penting** yang dapat memengaruhi pasar.
3. Kombinasi keduanya dapat membantu investor memahami kondisi pasar secara lebih sederhana.

Projek ini cocok digunakan sebagai dashboard awal untuk analisis aktivitas broker dan kalender ekonomi.
"""))

Explanation

Cell 5 builds the final dashboard exactly from the notebook logic.

The dashboard displays Top Brokers Berdasarkan Total Value, shows the number of brokers retrieved, presents the broker table, and generates an Insight Top Broker section.

It also displays Economic Calendar, shows the number of economic agendas retrieved, presents the economic calendar table, and generates an Insight Economic Calendar section.

At the end, the notebook displays a conclusion explaining that users can read the most active brokers, important economic agendas, and use both datasets to understand market conditions more simply.

Result:

result

Overall Workflow

The project starts by importing the required libraries and configuring API access.

Then, the notebook creates helper functions for retrieving API data and extracting list-based responses.

After that, it retrieves Top Brokers data and Economic Calendar data from the IDX API.

The final cell processes both datasets into readable dashboard sections and displays broker insights, economic calendar insights, and a conclusion.

Why This Case Matters

Broker activity helps users understand which brokers are most active based on transaction value. Economic Calendar data helps users monitor events that may influence market sentiment and stock price movement.

By combining both datasets, the dashboard gives users a simple way to understand market activity from broker data and economic agendas.

Conclusion

This project demonstrates how to build an IDX Market Intelligence Dashboard using Python.

The notebook retrieves Top Brokers data and Economic Calendar data, processes both datasets, displays them through a dashboard, and provides simple insights for market monitoring.