Python ile Binance trading botu nasıl yazılır?
Python ile Binance trading botu beş katmandan oluşur: veri çekme, sinyal kuralı, risk denetimi, emir gönderme ve kayıt. Bu yazı her katmanı ayrı modül olarak Testnet üzerinde kurar, çekim yetkisi kapalı API anahtarı kullanır ve botu gerçek hesaba bağlamadan önce hangi testlerin geçmesi gerektiğini listeler. Kâr vaadi yoktur; amaç güvenli ve okunabilir bir iskelet kurmaktır.
Bot mimarisi neden beş katman?
Birçok geliştirici trading botu yazmaya başlarken tüm mantığı tek bir Python dosyası içine doldurur: Aynı betik mum verisini çeker, indikatör hesaplar, koşul sağlandığında doğrudan borsanın emir uç noktasına HTTP isteği atar ve terminale bir satır log basar. “Monolitik betik” yaklaşımı ilk bakışta pratik görünse de, canlı piyasada felakete davetiye çıkarır. Ağ koptuğunda, borsa beklenmedik bir hata kodu döndüğünde ya da API anahtarı yetkisizleştiğinde botun nerede tıkandığını anlamak ve zararı durdurmak imkânsızlaşır.
2000 yılından bu yana yazılımda mimari kararlar alıyorum, 2019’dan bu yana da kripto piyasasında day trading yapıyorum. Yazılımcılık tarafım bana sistem bileşenlerini birbirinden kesin sınırlarla ayırmayı, trader tarafım ise hiçbir emrin katı bir risk filtresinden geçmeden piyasaya gönderilemeyeceğini öğretti. Bu iki disiplinin kesiştiği sağlam bir trading botu mimarisi, birbirine bağımlılığı en aza indirilmiş beş temel katmandan oluşur:
- Veri katmanı (Data Layer): Borsadan veya yerel veri kaynağından ham mum ve derinlik verilerini çeker, veri tiplerini doğrular ve akışı normalize eder.
- Sinyal katmanı (Strategy Layer): Sadece matematiksel kuralı işletir; veriyi alır ve yönsel bir sinyal nesnesi (senaryo) üretir. Bu katman hesap bakiyesini, kaldıraç ayarını ya da emir türlerini bilmez.
- Risk denetimi katmanı (Risk Layer): Botun en kritik savunma hattıdır. Üretilen sinyali inceler, hesap sermayesini ve açık riskleri denetler, geçersizlik seviyesi olmayan hiçbir emri geçirmez.
- Yürütme katmanı (Execution Layer): Risk filtresini başarıyla geçen planı borsa emir formatına dönüştürür, API imzalarını oluşturur ve Testnet ortamında emri iletir.
- Kayıt ve telemetri katmanı (Journal & Audit Layer): Gönderilen her emri, alınan borsa yanıtlarını ve zaman damgalarını yerel bir JSON veya veritabanı kütüğüne işler.
Bu mimari sayesinde sinyal algoritmanızı değiştirmek istediğinizde emir gönderme koduna dokunmazsınız; ya da borsa bağlantı kütüphanesini güncellerken risk kurallarını bozma tehlikesi yaşamazsınız.
Veri katmanı: mum verisi nasıl çekilir?
Veri katmanının temel sorumluluğu, Binance Spot API üzerinden geçmiş ya da anlık mum (kline) verilerini çekip yapılandırılmış bir formata dönüştürmektir. Ağ kesintilerine karşı yeniden deneme (retry) mekanizması ve hız sınırı (rate limit) yönetimi bu katmanın görevidir.
Binance Spot Testnet ortamında GET /api/v3/klines uç noktası kullanılır. Aşağıdaki minimal Python modülü, ham veriyi çekip doğrulayan bir yapı örneğidir:
import os
import requests
from typing import List, Dict, Any
TESTNET_BASE_URL = "https://testnet.binance.vision"
def fetch_klines(symbol: str = "BTCUSDT", interval: str = "1h", limit: int = 100) -> List[Dict[str, Any]]:
url = f"{TESTNET_BASE_URL}/api/v3/klines"
params = {"symbol": symbol, "interval": interval, "limit": limit}
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
raw_data = response.json()
candles = []
for item in raw_data:
candles.append({
"open_time": int(item[0]),
"open": float(item[1]),
"high": float(item[2]),
"low": float(item[3]),
"close": float(item[4]),
"volume": float(item[5]),
"close_time": int(item[6]),
})
return candles
Bu kod parçasında önemli olan nokta, gelen dize (string) formatındaki fiyat verilerinin hemen tip dönüşümüne tabi tutulmasıdır. Fiyat verisi doğrulanmadan bir sonraki katmana aktarılmaz.
Sinyal kuralı nasıl izole edilir?
Sinyal katmanı saf (pure) fonksiyonlar mantığıyla çalışmalıdır: Aynı mum listesi verildiğinde her zaman aynı sinyal sonucunu üretmelidir. Bu katmanda borsa bağlantısı kurulmaz, emir kodu çağrılmaz ve ağ istekleri yapılmaz.
Örnek kural: son kapanış bir önceki kapanışın üzerindeyse yukarı yönlü senaryo üretilsin; geçersizlik seviyesi son on mumun en düşüğünün biraz altına konsun. Koşul sağlanmıyorsa sinyal yok.
from dataclasses import dataclass
from typing import Optional, List, Dict, Any
@dataclass(frozen=True)
class Signal:
symbol: str
direction: str # "BUY" veya "SELL"
entry_price: float
invalidation_price: float
target_price: float
def evaluate_strategy(candles: List[Dict[str, Any]]) -> Optional[Signal]:
if len(candles) < 20:
return None
current_close = candles[-1]["close"]
recent_low = min(c["low"] for c in candles[-10:])
# Basit bir eşik kuralı (örnek amaçlı)
if current_close > candles[-2]["close"] and current_close > recent_low:
invalidation = recent_low * 0.99
target = current_close + (current_close - invalidation) * 2.0
return Signal(
symbol="BTCUSDT",
direction="BUY",
entry_price=current_close,
invalidation_price=invalidation,
target_price=target,
)
return None
Görüldüğü gibi sinyal fonksiyonu doğrudan bir borsa emri üretmez; sadece teknik seviyeleri (entry_price, invalidation_price, target_price) içeren değişmez bir veri yapısı döner.
Risk denetimi katmanı neyi reddeder?
Risk denetimi katmanı, sistemin can damarıdır. Sinyal katmanından gelen plan ne kadar cazip görünürse görünsün, aşağıdaki şartlardan biri bile ihlal edilirse emir üretimi anında iptal edilir:
- Geçersizlik seviyesinin yokluğu: Sinyal nesnesinde açık bir geçersizlik seviyesi tanımlanmamışsa plan doğrudan reddedilir.
- Hatalı yön mantığı: Alış senaryosunda geçersizlik seviyesi girişin üzerindeyse veya satış senaryosunda geçersizlik seviyesi girişin altındaysa kurgu matematiksel olarak bozuktur ve engellenir.
- Maksimum risk sınırı: Hesabın o anki sermayesine göre riske atılan payın %1 kuralını aşması durumu. Pozisyon büyüklüğü hesabının tüm matematiksel ayrıntılarını Trading risk yönetimi yazımda inceleyebilirsiniz; bot bu formülü tavizsiz işletir.
- Günlük zarar limitinin dolması: O gün içinde gerçekleşen geçersizliklerin toplamı sermayenin belirlenen sınırını (örneğin %2’sini) aştıysa sistem yeni sinyal kabul etmez.
- API anahtar yetki denetimi: Bot başlatıldığında borsa API anahtarının yetkileri sorgulanır; eğer anahtarda çekim (withdrawal) yetkisi açık bırakılmışsa bot kendini derhal kapatır.
class RiskManager:
def __init__(self, max_risk_per_trade_ratio: float = 0.01):
self.max_risk_ratio = max_risk_per_trade_ratio
def validate_and_size(self, signal: Signal, total_capital: float) -> Optional[float]:
if signal.direction == "BUY" and signal.invalidation_price >= signal.entry_price:
return None # Geçersiz seviye kurgusu
if signal.direction == "SELL" and signal.invalidation_price <= signal.entry_price:
return None # Geçersiz seviye kurgusu
risk_distance = abs(signal.entry_price - signal.invalidation_price)
if risk_distance <= 0:
return None
allowed_risk_amount = total_capital * self.max_risk_ratio
position_size = allowed_risk_amount / risk_distance
return position_size
Risk denetiminden geçmeyen hiçbir talep bir alt katmana ulaştırılamaz.
Testnet’te emir gönderme ve kayıt
Tüm filtrelerden onay alan bir emir, yürütme katmanı tarafından Binance Spot Testnet API’sine iletilir. Canlı parayla işlem yapmadan önce tüm ağ gecikmelerini ve API yanıtlarını Testnet üzerinde deneyimlemek zorunludur.
Emir gönderildikten hemen sonra dönen sipariş kimliği (order ID), işlem zamanı ve parametreler yerel kayıt defterine kaydedilir. Bu şeffaf günlükleme, TradingView webhook ile otomatik emir köprülerinde kurduğumuz disiplinle tamamen örtüşür.
import hmac
import hashlib
import time
def sign_query(query_string: str, secret_key: str) -> str:
return hmac.new(secret_key.encode("utf-8"), query_string.encode("utf-8"), hashlib.sha256).hexdigest()
def execute_testnet_order(api_key: str, secret_key: str, symbol: str, side: str, quantity: float) -> Dict[str, Any]:
endpoint = f"{TESTNET_BASE_URL}/api/v3/order"
timestamp = int(time.time() * 1000)
# Not: Miktar borsa lot kurallarına göre yuvarlanmalıdır
params = f"symbol={symbol}&side={side}&type=MARKET&quantity={quantity:.4f}×tamp={timestamp}"
signature = sign_query(params, secret_key)
headers = {"X-MBX-APIKEY": api_key}
url = f"{endpoint}?{params}&signature={signature}"
response = requests.post(url, headers=headers, timeout=10)
response.raise_for_status()
return response.json()
Gerçek hesaba geçmeden hangi testler geçmeli?
Bir trading botunu gerçek bir borsa hesabına ve canlı sermayeye bağlamak, yazılım mühendisliğinde yüksek riskli bir üretim (production) dağıtımıdır. Aşağıdaki kontrol listesindeki maddelerin tamamı sağlanmadan bot gerçek ortama taşınmamalıdır:
- En az 30 günlük Testnet günlüğü: Bot kesintisiz olarak en az 30 gün boyunca Testnet üzerinde çalışmalı, ağ kopmaları ve borsa bakım dönemlerindeki davranışı belgelenmelidir.
- Birim test kapsamı: Sinyal katmanı ve özellikle risk katmanı için sıfır toleranslı birim testler yazılmalı; sınır değer testleri (örneğin sıfıra bölme, ters yönlü geçersizlik seviyeleri) doğrulanmalıdır.
- IP kısıtlamalı API: Borsa panelinde API anahtarı sadece botun çalıştığı sunucunun statik IP adresine sınırlandırılmalı ve çekim izni kesinlikle kapalı tutulmalıdır.
- Kayıt ve izleme entegrasyonu: Tıpkı bu sitede yer alan Analizler bölümünün şeffaf yöntem sayfasında olduğu gibi, botun aldığı tüm kararlar harici olarak izlenebilir ve denetlenebilir bir kütüğe yazılmalıdır.
Disiplinli bir bot mimarisi, piyasadaki dalgalanmalardan bağımsız olarak sermayenizi korumanın ve yazılımınızı güvenle çalıştırmanın en sağlam yoludur.
Kaynaklar
- Binance Dokümantasyonu, “Binance Spot Testnet Documentation”: https://developers.binance.com/docs/binance-spot-api-docs/testnet (erişim: 2026-09-28)
- Binance Resmi Deposu, “binance-connector-python”: https://github.com/binance/binance-connector-python (erişim: 2026-09-28)
Anahtar çıkarımlar
- Beş katman ayrı modül; sinyal kuralı emir kodundan izole edilir.
- Risk denetimi katmanı geçmeyen emir gönderilmez.
- Testnet'te en az 30 gün kayıt olmadan gerçek hesap yok.
Sık sorulan sorular
Binance API anahtarı güvenli mi?
Anahtar yalnızca işlem yetkisiyle, çekim yetkisi kapalı ve IP kısıtlamalı oluşturulursa risk sınırlıdır. Anahtar ortam değişkeninde tutulur, depoya girmez; sızma şüphesinde anahtar iptal edilir. Bu yazıdaki iskelet çekim yetkisi açık anahtarı reddeder.
Yasal uyarı
Bu sitede yer alan bilgi, yorum ve analizler yatırım danışmanlığı kapsamında değildir. Yatırım danışmanlığı hizmeti, yetkili kuruluşlar tarafından kişilerin risk ve getiri tercihleri dikkate alınarak kişiye özel sunulmaktadır. Burada yer alan içerik genel niteliktedir ve kişisel durumunuza uygun olmayabilir.
Analiz kayıtları, yayınlanmış bir senaryo analizini ve piyasanın o senaryoya verdiği yanıtı belgeler; hesap hareketi veya kişisel işlem beyanı değildir. Bir kayıt, analizin belirli bir tarihte yayınlandığını gösterir; geçmiş kayıtlar gelecekteki sonuçların göstergesi değildir. Kripto varlıklar yüksek fiyat oynaklığı taşır ve yatırılan tutarın tamamı kaybedilebilir.
Bu sitedeki hiçbir içerik alım, satım veya elde tutma çağrısı değildir. Yalnızca kendi araştırmanıza dayanarak ve gerekiyorsa yetkili bir danışmandan görüş alarak karar veriniz. Site sahibi, içeriğe dayanarak alınan kararlardan doğan sonuçlardan sorumlu değildir.
Yasal uyarının tamamı · metin sürümü 2026-09-28-v5
Hasan Çelik