Kenapa tutorial ini ada (dan apa yang bukan tujuannya): Deriv punya API publik yang beneran dan WebSocket yang terdokumentasi rapi, sesuatu yang langka di segmen ini. Materinya bagus banget buat belajar memprogram bot — autentikasi, streaming data, pemrosesan asinkron. Halaman ini mengajarkan teknologinya. Bukan menganjurkan kamu trading synthetic indices atau kontrak fixed-odds Deriv — produk semacam itu tidak punya perlindungan regulasi di Indonesia, dan opsi biner sendiri ilegal di sini serta diklasifikasikan Bappebti sebagai judi, bukan trading. Pakai pengetahuan WebSocket dari sini untuk konek ke platform mana pun yang punya API.
01Kenapa Deriv API layak dipelajari
Tiga alasan yang bikin dia jadi studi kasus teknis yang bagus: dokumentasinya publik dan jelas, ada sandbox/demo gratis untuk tes (tanpa perlu setor dana), dan protokolnya WebSocket — persis yang perlu kamu pahami untuk konek ke exchange kripto modern mana pun, ke MT5 lewat bridge, atau ke platform apa pun dengan streaming data real-time. Yang kamu pelajari di sini langsung bisa dipindah ke Binance, Bybit, Deribit.
02Setup lingkungan
Kamu butuh Python 3.11+, sebuah virtualenv, dan dua library. Di terminal:
# Buat proyek dan environment terisolasi mkdir bot-deriv && cd bot-deriv python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows # Instal dependensi pip install websockets asyncio python-dotenv
Setelah itu, buat akun demo di Deriv (gratis, tanpa setoran) semata-mata untuk mendapatkan satu API token read-only. Kamu tidak perlu menyetor dana maupun trading.
- Buka
app.deriv.comdan buat akun demo - Masuk ke Pengaturan → API Tokens
- Buat token dengan scope
Read(read-only) untuk tutorial ini - Salin token itu dan simpan di file
.envdi dalam proyek:
# .env DERIV_TOKEN=seu_token_aqui DERIV_APP_ID=1089 # app_id publik untuk testing
03Hello World: menyambung ke WebSocket
Server Deriv memakai WebSocket di wss://ws.derivws.com/websockets/v3. Semua komunikasi bersifat asinkron — kamu kirim satu pesan JSON, server membalas juga dalam JSON, bisa jadi berupa streaming. Kontak pertama:
# conectar.py import asyncio, json, os import websockets from dotenv import load_dotenv load_dotenv() APP_ID = os.getenv("DERIV_APP_ID") URL = f"wss://ws.derivws.com/websockets/v3?app_id={APP_ID}" async def ping(): async with websockets.connect(URL) as ws: await ws.send(json.dumps({"ping": 1})) resposta = await ws.recv() print("Servidor respondeu:", resposta) asyncio.run(ping())
Jalankan dengan python conectar.py. Kamu semestinya melihat {"echo_req": {"ping": 1}, "msg_type": "pong", "ping": "pong"}. Kalau muncul, selamat — kamu sudah terhubung. Kalau tidak, cek firewall atau proxy.
04Autentikasi
Setelah handshake, autentikasi dilakukan dengan token:
# autenticar.py async def autenticar(): token = os.getenv("DERIV_TOKEN") async with websockets.connect(URL) as ws: await ws.send(json.dumps({"authorize": token})) resp = json.loads(await ws.recv()) if "error" in resp: print("Falha:", resp["error"]["message"]) else: print("Conta:", resp["authorize"]["loginid"]) print("Saldo:", resp["authorize"]["balance"])
Praktik keamanan yang baik: jangan pernah commit token ke Git. Selalu pakai .env + .gitignore. Untuk produksi, pakai secret vault (AWS Secrets Manager, HashiCorp Vault).
05Streaming candle real-time
Di sinilah WebSocket bersinar. Alih-alih polling REST tiap detik, kamu berlangganan sebuah stream dan server yang mendorong update-nya sendiri:
# candles.py async def stream_candles(symbol="frxEURUSD", granularity=60): async with websockets.connect(URL) as ws: await ws.send(json.dumps({ "ticks_history": symbol, "adjust_start_time": 1, "count": 100, "end": "latest", "style": "candles", "granularity": granularity, "subscribe": 1 })) while True: msg = json.loads(await ws.recv()) if msg.get("msg_type") == "ohlc": c = msg["ohlc"] print(f"{c['epoch']} O:{c['open']} H:{c['high']} L:{c['low']} C:{c['close']}") asyncio.run(stream_candles())
Parameter subscribe: 1 adalah kuncinya — dia menjaga koneksi tetap terbuka dan mendorong setiap candle baru. Kamu tidak perlu memintanya lagi.
06Menyusunnya seperti bot sungguhan
Contoh di atas sifatnya didaktis. Bot sungguhan punya tiga lapisan yang terpisah: koneksi (reconnect otomatis, heartbeat), strategi (aturan murni, bisa diuji), dan eksekusi (mengirim order, mengelola state). Kerangka yang kami sarankan:
# struktur/ # ├── client.py # WebSocket + reconnect + heartbeat # ├── strategy.py # Fungsi murni: diberi DataFrame, mengembalikan sinyal # ├── executor.py # Kirim order, kontrol posisi terbuka # ├── risk.py # Stop loss, take profit, sizing posisi # └── main.py # Merekatkan semuanya # strategy.py - exemplo: cruzamento de médias import pandas as pd def calcular_sinal(df: pd.DataFrame) -> str: df["ma_curta"] = df["close"].rolling(9).mean() df["ma_longa"] = df["close"].rolling(21).mean() ultima = df.iloc[-1] anterior = df.iloc[-2] # Crossover ke atas if anterior["ma_curta"] < anterior["ma_longa"] and ultima["ma_curta"] > ultima["ma_longa"]: return "compra" # Crossover ke bawah if anterior["ma_curta"] > anterior["ma_longa"] and ultima["ma_curta"] < ultima["ma_longa"]: return "venda" return "hold"
Pemisahan itu penting: strategi dalam bentuk fungsi murni bisa diuji dengan pytest dalam hitungan detik, tanpa perlu konek ke apa pun. Kamu jalankan backtest dengan data 5 tahun, validasi, dan baru setelah itu colok ke executor sungguhan.
07Penanganan error dan reconnect
WebSocket di produksi pasti putus. Server restart, jaringan goyang, timeout lewat. Bot yang tidak bisa reconnect adalah bot yang tidak berguna. Pola yang kami sarankan:
async def conectar_com_retry(): backoff = 1 while True: try: async with websockets.connect(URL, ping_interval=20) as ws: print("Conectado") backoff = 1 # reset await rotina_principal(ws) except (websockets.ConnectionClosed, OSError) as e: print(f"Conexão caiu: {e}. Reconectando em {backoff}s") await asyncio.sleep(backoff) backoff = min(backoff * 2, 60) # exponential, dibatasi di 60s
08Di mana pengetahuan ini bisa dipakai
Pola WebSocket + asyncio yang barusan kamu pelajari jalan di hampir semua platform modern dengan streaming. Ini membawamu ke mana:
- Binance / Bybit — API-nya mirip, filosofinya identik.
websockets+ autentikasi + stream candle. Kodenya nyaris tidak berubah. - MT5 lewat library Python — bukan WebSocket murni, tapi struktur "strategi sebagai fungsi murni + executor" langsung berlaku.
- TradingView Webhooks — di sini kamu ada di sisi sebaliknya: menerima alert lewat HTTP dan memakai pola ini untuk memprosesnya.
- Pasar teregulasi (B3, Brasil) — di Brasil, broker lokal menyediakan API proprietary; logika stream dan pemisahan lapisan tetap berlaku.
Mau kerangka bot yang lengkap?
Unduh proyek contoh kami di GitHub — kode dengan komentar baris per baris, plus tes dan arsitektur yang rapi.
Unduh bot gratis →