Binance punya salah satu API paling lengkap dan paling rapi dokumentasinya di dunia kripto, dan Python adalah bahasa yang ideal untuk menggarapnya. Di tutorial ini Anda akan membangun fondasi bot trading yang nyata — bukan mainan. Kita akan memprioritaskan tiga hal yang membedakan kode hobi dari kode serius: keamanan API key, pemisahan tanggung jawab dan tes sebelum eksekusi live.
Sebelum semuanya — soal risiko: bot kripto beroperasi di pasar dengan volatilitas sangat tinggi, 24/7, tanpa circuit breaker. Satu bug di kode Anda bisa mengosongkan akun saat Anda tidur. Semua yang ada di sini harus diuji habis-habisan di testnet. Jangan pernah menjalankannya dengan uang yang tidak sanggup Anda relakan, dan jangan pernah mengaktifkan izin penarikan dana di API key Anda.
01Setup lingkungan
Python 3.11+, virtualenv, dan library-nya. Ada dua pilihan utama: python-binance (khusus, lebih langsung untuk Binance) dan ccxt (generik, jalan di puluhan exchange). Supaya fokus di awal, kita pakai python-binance.
# Buat proyek dan environment terisolasi mkdir bot-binance && cd bot-binance python -m venv venv source venv/bin/activate # Linux/Mac (Windows: venv\Scripts\activate) pip install python-binance pandas python-dotenv
02Membuat API key (dengan aman)
Di akun Binance Anda, masuk ke API Management lalu buat sebuah key. Aturan emas keamanannya:
- Izin seminimal mungkin: aktifkan hanya "Read" dan "Spot Trading". JANGAN PERNAH aktifkan "Withdraw".
- Batasi berdasarkan IP kalau Anda menjalankannya di VPS dengan IP tetap.
- Simpan Secret Key saat itu juga — dia cuma muncul sekali.
Taruh key-nya di sebuah file .env (dan tambahkan .env ke .gitignore):
# .env — JANGAN pernah commit file ini
BINANCE_API_KEY=sua_chave_aqui
BINANCE_API_SECRET=seu_secret_aqui
Kesalahan yang mahal harganya: menempelkan key langsung di kode lalu mengunggahnya ke GitHub. Bot-bot menyisir GitHub dalam hitungan detik mencari key yang terekspos, lalu mengosongkan akun. Selalu .env + .gitignore.
03Koneksi dan menarik candle
Kontak pertama — connect ke testnet (lingkungan uji dengan saldo fiktif) dan tarik datanya:
# conectar.py import os from binance.client import Client from dotenv import load_dotenv import pandas as pd load_dotenv() # testnet=True usa o ambiente de teste — comece SEMPRE aqui client = Client(os.getenv("BINANCE_API_KEY"), os.getenv("BINANCE_API_SECRET"), testnet=True) def get_candles(symbol="BTCUSDT", interval="15m", limit=100): raw = client.get_klines(symbol=symbol, interval=interval, limit=limit) df = pd.DataFrame(raw, columns=[ "open_time","open","high","low","close","volume", "close_time","qav","trades","tbav","tqav","ignore"]) df["close"] = df["close"].astype(float) return df df = get_candles() print(df[["close"]].tail())
04Menghitung sinyal (strategi sebagai fungsi murni)
Inilah prinsip yang membedakan kode profesional: strateginya adalah sebuah fungsi murni — menerima data, mengembalikan sinyal, tanpa efek samping. Itu membuatnya bisa diuji terpisah, tanpa perlu connect ke mana pun. Contohnya dengan crossover moving average + RSI:
# strategy.py import pandas as pd def calcular_rsi(series, periodo=14): delta = series.diff() ganho = delta.clip(lower=0).rolling(periodo).mean() perda = -delta.clip(upper=0).rolling(periodo).mean() rs = ganho / perda return 100 - (100 / (1 + rs)) def calcular_sinal(df: pd.DataFrame) -> str: df["ma_rapida"] = df["close"].rolling(9).mean() df["ma_lenta"] = df["close"].rolling(21).mean() df["rsi"] = calcular_rsi(df["close"]) u = df.iloc[-1] # Beli: tren naik + RSI belum overbought if u["ma_rapida"] > u["ma_lenta"] and u["rsi"] < 70: return "COMPRA" if u["ma_rapida"] < u["ma_lenta"] and u["rsi"] > 30: return "VENDA" return "AGUARDA"
Kenapa fungsi murni itu penting: Anda bisa menjalankan calcular_sinal() di atas data historis 5 tahun dalam hitungan detik, tanpa connect ke API. Ini fondasi backtest. Logika strategi yang tercampur dengan kode eksekusi mustahil diuji dengan benar.
05Mengeksekusi order (di testnet dulu!)
Setelah sinyalnya terhitung, lapisan eksekusi mengirim order. Perhatikan bahwa ini berjalan di testnet — saldonya fiktif:
# executor.py from binance.enums import * def executar_ordem(client, symbol, sinal, quantidade): if sinal == "COMPRA": ordem = client.create_order( symbol=symbol, side=SIDE_BUY, type=ORDER_TYPE_MARKET, quantity=quantidade) return ordem if sinal == "VENDA": ordem = client.create_order( symbol=symbol, side=SIDE_SELL, type=ORDER_TYPE_MARKET, quantity=quantidade) return ordem return None # TUNGGU: tidak melakukan apa-apa
Mau proyek lengkapnya, sudah jadi dan berkomentar?
Unduh contoh bot open source kami — struktur rapi, sudah termasuk tes dan manajemen risiko.
06Arsitektur bot yang tidak membuat Anda bangkrut
Satukan semua bagiannya dengan pemisahan yang jelas. Bot yang serius punya lapisan-lapisan yang saling independen:
# struktur yang disarankan # ├── client.py # koneksi Binance + reconnect # ├── strategy.py # fungsi murni: data → sinyal (bisa dites) # ├── risk.py # ukuran posisi, stop, take, limit # ├── executor.py # kirim order, kontrol state # ├── logger.py # catat semuanya (audit itu vital) # └── main.py # loop utama, merekatkan semuanya # main.py — loop básico import time while True: try: df = get_candles() sinal = calcular_sinal(df) qtd = calcular_tamanho_posicao(saldo, risco_pct=1) # dari risk.py if sinal != "AGUARDA": executar_ordem(client, "BTCUSDT", sinal, qtd) log(sinal, qtd) time.sleep(60) # cek tiap menit except Exception as e: log_erro(e) time.sleep(30) # jangan pernah biarkan loop mati diam-diam
07Manajemen risiko di dalam kode
Strategi menentukan kapan masuk; manajemen risiko menentukan seberapa besar. Tanpa yang kedua, yang pertama tidak ada artinya. risk.py minimal harus berisi:
- Ukuran posisi berdasarkan % dari modal (misal: risiko 1% per trade).
- Stop loss otomatis di setiap posisi — jangan pernah tanpa itu.
- Batas kerugian harian yang mematikan bot begitu tersentuh.
- Maksimum posisi bersamaan supaya risikonya tidak menumpuk.
08Testnet dan backtest sebelum akun real
Urutan wajib sebelum menyentuh uang sungguhan: (1) backtest fungsi strategi di atas data historis, (2) testnet Binance selama berminggu-minggu dengan saldo fiktif di kondisi pasar yang nyata, (3) baru setelah itu akun real dengan nilai minimum. Melewati salah satu tahap sama saja menyetir sambil menutup mata.
Langkah berikutnya yang wajar: setelah menguasai Binance API, polanya bisa dipindahkan nyaris identik ke exchange lain lewat ccxt, dan arsitektur yang sama (strategi murni + executor + risiko) berlaku juga untuk bot di MT5. Lihat panduan umum membuat bot trading.
09Pertanyaan yang sering diajukan
python-binance atau ccxt?
python-binance itu spesifik dan lebih langsung untuk memulai dengan fokus di Binance. ccxt generik dan jalan di puluhan exchange dengan sintaks yang sama — lebih baik kalau Anda berencana trading di beberapa exchange. Untuk belajar, mulai dengan python-binance.
Apakah butuh uang untuk mulai tes?
Tidak. Binance punya testnet gratis dengan saldo fiktif, di kondisi pasar yang nyata. Pakai testnet=True di client-nya. Tes berminggu-minggu sebelum menyentuh uang sungguhan.
Apakah aman menaruh API key di dalam kode?
Tidak pernah aman. Pakai environment variable (.env), batasi izin key seminimal mungkin (read + spot, jangan sekali-kali withdraw), dan tambahkan .env ke .gitignore. Bot-bot menyisir GitHub mencari key yang terekspos.
Bisakah bot jalan sendiri 24 jam?
Bisa, tapi dia harus berjalan di mesin yang selalu menyala — idealnya sebuah VPS. Kripto buka 24/7, jadi bot di PC pribadi Anda ikut berhenti begitu mesinnya dimatikan.
Bisakah ini dipakai di B3?
Binance API itu untuk kripto. Untuk B3 di Brasil (mini indeks, mini dolar), jalurnya lewat MT5 dengan library MetaTrader5 di Python, atau lewat API broker Anda. Arsitekturnya (strategi murni + executor) sama saja.