Python ile Binance trading botu yapmak için dört parçaya ihtiyacın var: Binance'ten alınmış bir API anahtarı, borsadan piyasa verisi çeken bir katman, bu veriye bakıp al ya da sat kararı veren bir strateji ve emirleri gönderip pozisyonu izleyen bir emir yönetimi katmanı. Bunlara bir de risk kontrolü (stop-loss, pozisyon büyüklüğü) ve hata yönetimi eklendiğinde, 7/24 çalışabilen bir Python crypto trading bot elde edersin.
Bu rehberde Python ile kripto botu yapımını baştan sona anlatıyorum: Binance API key nasıl alınır, Python Binance API ile nasıl bağlanılır, WebSocket ile canlı fiyat nasıl dinlenir, emir nasıl gönderilir ve bot nasıl güvenli tutulur. Örnekler, kendi geliştirdiğim Kripto Al-Sat botu üzerinde çalışırken karşılaştığım durumlardan geliyor.
Bu yazı bir yazılım rehberidir, yatırım tavsiyesi değildir. Kaldıraçlı kripto işlemleri sermayenin tamamını kaybetme riski taşır.
Python Binance trading bot nedir?
Python Binance trading bot, Binance'in API'sine Python kodu ile bağlanıp alım satım emirlerini insan müdahalesi olmadan veren bir programdır. Bot piyasayı sürekli izler, önceden yazılmış kurallara ya da bir yapay zekâ modelinin kararına göre işlem açar ve kapatır. Kısacası bir kripto al sat botu, bir otomatik al sat botu ya da daha genel adıyla bir trading bot.
Python bu iş için en çok tercih edilen dildir, çünkü:
- Veri işleme için pandas ve NumPy gibi güçlü kütüphaneler var,
- Teknik analiz göstergeleri (RSI, EMA, MACD) için hazır paketler bulunuyor,
- Makine öğrenmesi ile yapay zeka botu geliştirmek kolay,
- Binance için resmî ve topluluk kütüphaneleri mevcut.
Bir trading botunun mimarisi
Kripto trading bot mimarisi genelde şu bileşenlerden oluşur:
| Bileşen | Görevi |
|---|---|
| Veri katmanı | REST API ile geçmiş mumları (OHLCV), WebSocket ile canlı fiyatı alır |
| Strateji motoru | Veriye bakıp sinyal üretir: al, sat ya da bekle |
| Risk kontrolü | Pozisyon büyüklüğünü, kaldıracı ve stop seviyesini belirler |
| Emir yönetimi | Emri gönderir, dolup dolmadığını izler, pozisyonu kapatır |
| Kayıt (log) | Her kararı ve emri dosyaya ya da veritabanına yazar |
| Bildirim | Telegram gibi bir kanaldan önemli olayları haber verir |
Bu parçaları ayrı tutmak, botu test etmeyi ve sonradan stratejiyi değiştirmeyi kolaylaştırır. Benim botumda strateji kısmı tamamen değiştirilebilir; aynı emir yönetimi hem yapay zekâ modeliyle hem de kural tabanlı stratejilerle çalışıyor.
1. Binance API key nasıl alınır?
Binance API key oluşturma adımları kabaca şöyledir (arayüz zamanla değişebileceği için güncel adımları Binance dokümantasyonunda kontrol et):
- Binance hesabında API Yönetimi bölümüne gir.
- Yeni bir API anahtarı oluştur; sana bir API key ve bir secret key verilir.
- İzinleri ayarla: bot vadeli işlem yapacaksa sadece Futures iznini aç.
- Para çekme iznini asla açma.
- IP kısıtlaması ekle: anahtar sadece botun çalıştığı sunucunun IP adresinden kullanılabilsin.
Binance API key ve secret key farkı şudur: API key seni tanıtır, secret key ise her isteği imzalamak için kullanılır. Secret key'i ele geçiren kişi senin adına emir verebilir; bu yüzden asla koda yazılmaz, GitHub'a yüklenmez ve ekran görüntüsüne girmez. Anahtarları ortam değişkeninde ya da sadece botun bilgisayarında duran bir dosyada sakla.
Binance API kullanımı ücretsizdir; ödediğin şey yalnızca işlem komisyonlarıdır.
2. Python ortamı ve kütüphaneler
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install requests websockets pandas
Hazır kütüphaneler (resmî Binance connector, python-binance ya da birden çok borsayı destekleyen CCXT) işini hızlandırır. Ama botun ne yaptığını tam anlamak için ilk denemede imzalı isteği kendin yazmanı öneririm.
3. Binance API bağlantısı: imzalı istek
Binance, emir gönderme ve bakiye sorgulama gibi özel isteklerin HMAC SHA256 ile imzalanmasını ister:
import hashlib, hmac, os, time
from urllib.parse import urlencode
import requests
API_KEY = os.environ["BINANCE_API_KEY"]
SECRET = os.environ["BINANCE_SECRET"].encode()
BASE = "https://fapi.binance.com" # vadeli işlemler (USDⓈ-M Futures)
def imzali_istek(method: str, path: str, **params):
params["timestamp"] = int(time.time() * 1000)
params["recvWindow"] = 5000
sorgu = urlencode(params)
imza = hmac.new(SECRET, sorgu.encode(), hashlib.sha256).hexdigest()
url = f"{BASE}{path}?{sorgu}&signature={imza}"
r = requests.request(method, url, headers={"X-MBX-APIKEY": API_KEY}, timeout=10)
r.raise_for_status()
return r.json()
bakiye = imzali_istek("GET", "/fapi/v2/balance")
Python Binance API kullanımında en sık görülen iki hata:
- Timestamp hatası (-1021): Bilgisayarının saati Binance sunucusundan farklıysa istek reddedilir. Sistem saatini NTP ile senkronize et.
- Invalid signature (-1022): Parametre sırası ya da kodlaması imzalanan metinle gönderilen metin arasında farklıysa çıkar.
4. Python ile kripto fiyatlarını almak
Geçmiş mumlar (OHLCV) herkese açık uç noktadan imzasız alınır:
import pandas as pd
def mumlar(sembol="BTCUSDT", aralik="5m", adet=200) -> pd.DataFrame:
r = requests.get(f"{BASE}/fapi/v1/klines",
params={"symbol": sembol, "interval": aralik, "limit": adet}, timeout=10)
kolonlar = ["acilis_zamani", "acilis", "yuksek", "dusuk", "kapanis", "hacim"]
df = pd.DataFrame([satir[:6] for satir in r.json()], columns=kolonlar)
return df.astype({"acilis": float, "yuksek": float, "dusuk": float, "kapanis": float, "hacim": float})
Önemli bir ayrıntı: son satır henüz kapanmamış mumdur. Kararı kapanmamış mum üzerinden verirsen, geçmişte test ettiğin strateji canlıda farklı davranır. Benim botum yalnızca kapanmış 5 dakikalık mumlara bakıyor.
5. WebSocket ile canlı piyasa verisi
Fiyatı her saniye REST ile sorgulamak hem yavaştır hem de Binance API rate limit sınırına takılırsın. Canlı veri için Binance WebSocket API kullanılır:
import asyncio, json, websockets
async def canli_fiyat(sembol="btcusdt"):
url = f"wss://fstream.binance.com/ws/{sembol}@markPrice@1s"
while True:
try:
async with websockets.connect(url, ping_interval=20) as ws:
async for mesaj in ws:
veri = json.loads(mesaj)
print(veri["s"], veri["p"])
except Exception as hata:
print("bağlantı koptu, 5 sn sonra yeniden:", hata)
await asyncio.sleep(5)
asyncio.run(canli_fiyat())
Bu bir Python asyncio trading bot iskeletidir. Dış döngü kritik: WebSocket bağlantıları ağ sorunu ya da borsa bakımı yüzünden kopar ve bot yeniden bağlanabilmelidir. Benim botum açık pozisyonları bu akışla saniye saniye izliyor.
6. Basit bir al-sat stratejisi
Örnek olarak iki hareketli ortalamanın kesişimine bakan kural tabanlı bir strateji:
def sinyal(df: pd.DataFrame) -> str:
kisa = df["kapanis"].rolling(9).mean()
uzun = df["kapanis"].rolling(21).mean()
if kisa.iloc[-2] <= uzun.iloc[-2] and kisa.iloc[-1] > uzun.iloc[-1]:
return "AL"
if kisa.iloc[-2] >= uzun.iloc[-2] and kisa.iloc[-1] < uzun.iloc[-1]:
return "SAT"
return "BEKLE"
Bu sadece kodun nasıl kurulduğunu göstermek için bir örnek; tek başına bir kazanç stratejisi değildir. RSI trading bot ya da MACD trading bot da aynı iskelete farklı bir sinyal fonksiyonu yazılarak kurulur. Daha gelişmiş botlarda bu fonksiyonun yerini bir makine öğrenmesi modeli alır; yapay zeka botu ile kural tabanlı botun farkını kripto botları nasıl çalışır? yazısında anlattım.
7. Emir gönderme ve pozisyon yönetimi
def emir(sembol, yon, miktar, fiyat=None):
p = {"symbol": sembol, "side": yon, "quantity": miktar}
if fiyat:
p.update(type="LIMIT", price=fiyat, timeInForce="GTC")
else:
p.update(type="MARKET")
return imzali_istek("POST", "/fapi/v1/order", **p)
Kripto botu emir yönetimi sadece emri göndermekle bitmez:
- Emrin dolduğunu kontrol et. Limit emir hiç dolmayabilir ya da parça parça dolabilir (
PARTIALLY_FILLED). - Aynı emri iki kez gönderme. Ağ zaman aşımında emir borsaya ulaşmış olabilir. Her emre kendi
newClientOrderIddeğerini ver ve tekrar denemeden önce o kimlikle sorgula. - Miktar ve fiyat hassasiyetine uy. Her coinin adım büyüklüğü ve en küçük emir tutarı farklıdır;
exchangeInfouç noktasından al. - Takip etmediğin pozisyonu kontrol et. Bot yeniden başladığında borsada açık pozisyon varsa ne yapacağına karar vermeli.
8. Stop-loss ve pozisyon büyüklüğü
Her pozisyonun açıldığı anda bir stop-loss seviyesi olmalı. Benim botumda ilk dolumda hemen borsaya yedek bir stop konuyor; böylece bot çökse bile pozisyon korumasız kalmıyor. Kâr alma ise botun kendisi tarafından yapılıyor.
Pozisyon büyüklüğünü "bu işlemde en fazla bakiyenin yüzde kaçını kaybedebilirim?" sorusuyla hesapla. Kaldıraç, tasfiye fiyatı ve trailing stop konularını kaldıraç nedir kripto? yazısında ayrıntılı ele aldım.
9. Önce test et: testnet ve paper trading
Yeni yazılmış bir botu gerçek parayla çalıştırmak, kodda fark etmediğin bir hatayı pahalıya öğrenmek demektir. Önce sanal bakiyeyle (paper trading), sonra Binance test ağında dene. Testnet API anahtarının nasıl alınacağını Binance testnet API nasıl alınır? yazısında anlattım.
10. Hata yönetimi ve loglama
Bir trading botunu "çalışan bir script"ten güvenilir bir sisteme dönüştüren şey hata yönetimidir:
| Durum | Ne yapmalı? |
|---|---|
RequestTimeout / ağ hatası |
Birkaç kez bekleyerek yeniden dene, sonra bildirim gönder |
-2019 Margin is insufficient |
Pozisyonu küçült ya da işlemi atla |
-2015 Invalid API-key, IP |
IP adresin değişmiş olabilir; Binance'te IP listesini güncelle |
| WebSocket kopması | Otomatik yeniden bağlan, aradaki veriyi REST ile tamamla |
| Beklenmeyen hata | Botu durdurmadan önce açık pozisyonları güvenceye al ve haber ver |
Her kararı ve emri bir trading bot loglama sistemine yaz. Bir işlemin neden açıldığını sonradan görebilmek, stratejiyi geliştirmenin tek yoludur. Önemli olayları Telegram'a göndermek de iyi bir fikir; benzer bir bildirim kurgusunu WhatsApp destek botu nasıl çalışır? yazımda anlattım.
11. Botu VPS üzerinde çalıştırmak
Bilgisayarın kapandığında bot da durur. 7/24 çalışması için küçük bir Linux sunucu (VPS) kiralayıp botu bir servis olarak çalıştırabilirsin. Dikkat edilecekler:
- Sunucunun IP adresini Binance API anahtarının IP listesine ekle,
- Sistem saatini senkronize tut,
- Bot çökerse otomatik yeniden başlasın (systemd gibi),
- Anahtarları sadece sunucuda tut.
Sonuç
Python ile Binance trading botu yapmak; API anahtarını güvenle oluşturmak, imzalı istek göndermek, canlı veriyi WebSocket ile almak, stratejiyi emir yönetiminden ayırmak ve her hatayı öngörmekten ibarettir. Asıl zorluk kod yazmak değil, botun beklenmedik durumlarda doğru davranmasını sağlamaktır. Her yeni botu önce testnet ve paper modda dene.
İşletmen ya da kendi projen için Python ile bir bot geliştirmek istersen Python botları ve otomasyon sayfama bakabilir ya da iletişim sayfamdan yazabilirsin.
