CCXT: WebSocket Emir Defteri Metodları Gerçekte Nasıl Çalışır
Merhaba! Bugün işlem sistemi geliştiricileri için en önemli konulardan birine dalacağız — CCXT'de emir defterleri almak için WebSocket metodlarının nasıl çalıştığına. "Metot belgede var ama pratikte çalışmıyor, neden?" veya "100'den fazla işlem çiftini izlemek için hangi metodu seçmeliyim?" gibi sorularla hiç karşılaştıysanız, bu makale tam size göre.
Giriş: Bu Neden Önemli
Piyasa verisi toplamak için CCXT ile çalışırken pek çok kişi kritik sorularla karşılaşır:
- Hangi WebSocket emir defteri metodları farklı borsalarda gerçekten destekleniyor?
- Metodlar trafik hacmi ve veri yapısı açısından nasıl farklılaşıyor?
- Otomatik testler "✓" gösterirken metot pratikte neden çalışmayabilir?
Bu makalede — popüler metodların, özelliklerinin ve 75'ten fazla borsadaki gerçek durumun ayrıntılı analizi.
Temel Metodlara Genel Bakış
Emir defteri verisi için dört ana WebSocket metodu: tekli abonelik, toplu abonelik, kitabın tepesini izleme ve tek seferlik anlık görüntü
Modern borsa API'leri, WebSocket üzerinden emir defteri verisi almanın birkaç yolunu sunar. Her birini inceleyelim:
1. watchOrderBook - Klasik Yaklaşım
Bu, tek bir işlem çifti için emir defteri güncellemelerine abone olmak üzere kullanılan ana metoddur.
Temel özellikler:
- Amaç: Bir çift için emir defteri güncellemelerine abone ol
- Bağlantı türü: Kalıcı WebSocket bağlantısı
- Veri: Tam emir defteri (genellikle her taraf için 100–1000 seviye)
- Trafik: Orta ile yüksek arasında, güncelleme sıklığına ve derinliğe bağlı
Kullanım örneği:
const exchange = new ccxt.pro.binance();
const orderbook = await exchange.watchOrderBook('BTC/USDT');
console.log(orderbook);
2. watchOrderBookForSymbols - Toplu Abonelik
Bu metot, borsa destekliyorsa aynı anda birden fazla işlem çiftine abone olmayı sağlar.
Temel özellikler:
- Amaç: Aynı anda birden fazla çifte abone ol
- Bağlantı türü: Kalıcı WebSocket, çoğunlukla birden fazla çift için tek bağlantı
- Veri: Her çift için — tam emir defteri
- Trafik: Çok sayıda çiftle çok yüksek (100–1000 seviye × 2 taraf × çift sayısı)
Örnek yanıt:
{
"BTC/USDT": {
"bids": [[50000.1, 1.5], [50000.0, 2.1]],
"asks": [[50001.0, 1.2], [50001.1, 0.8]],
"timestamp": 1717398000000,
"datetime": "2025-06-03T12:00:00Z"
},
"ETH/USDT": {
"bids": [[3000.5, 10.2], [3000.4, 5.7]],
"asks": [[3001.0, 8.3], [3001.1, 12.1]],
"timestamp": 1717398000000,
"datetime": "2025-06-03T12:00:00Z"
}
}
Önemli uyarı: Gerçekte tüm borsalarda desteklenmez. Bazen metot API'de mevcut olsa da uygulanmamış olabilir.
3. watchBidsAsks - Optimize Edilmiş İzleme
Birden fazla işlem çiftinde en iyi fiyatları takip etmenin en ekonomik yolu.
Temel özellikler:
- Amaç: Birden fazla çift için yalnızca en iyi fiyatlara (kitabın tepesi) abone ol
- Bağlantı türü: Kalıcı WebSocket, çoğunlukla tüm çiftler için tek bağlantı
- Veri: Her taraf için yalnızca bir fiyat (alış/satış)
- Trafik: Minimum, çok sayıda çifti izlemek için uygun
Örnek yanıt:
{
"BTC/USDT": {
"bids": [[50000.1, 1.5]],
"asks": [[50001.0, 1.2]],
"timestamp": 1717398000000,
"datetime": "2025-06-03T12:00:00Z"
},
"ETH/USDT": {
"bids": [[3000.5, 10.2]],
"asks": [[3001.0, 8.3]],
"timestamp": 1717398000000,
"datetime": "2025-06-03T12:00:00Z"
}
}
Özellik: Genellikle ticker uç noktası aracılığıyla uygulanır — hem istemci hem de borsa için kaynak tasarrufu sağlar.
4. fetchOrderBookWs - Tek Seferlik İstekler
Emir defteri anlık görüntüsü almak için REST API'ye alternatif.
Temel özellikler:
- Amaç: WebSocket üzerinden tek seferlik emir defteri isteği (REST benzeri)
- Bağlantı türü: Geçici WebSocket, veri alındıktan sonra bağlantı kapanır
- Veri: Emir defteri anlık görüntüsü
- Trafik: Minimum
Önemli Farklar ve Metot Karşılaştırması
Metodlar arasındaki farkları anlamak, doğru yaklaşımı seçmek için kritik öneme sahiptir:
Kalıcı ve Geçici Bağlantılar
- watch metodları* — kalıcı bağlantı oluşturur, gerçek zamanlı akış güncellemeleri alır
- fetch metodları* — WebSocket'i yalnızca tek seferlik istek için kullanır, REST API'ye benzer
Trafik Karşılaştırması
watchBidsAsks ile watchOrderBookForSymbols:
watchBidsAsks— 100–1000 kat daha az trafik, toplu izleme için idealwatchOrderBookForSymbols— güçlü ancak trafik açısından çok ağır ve tüm borsalar tarafından desteklenmiyor
Trafik hesaplama örneği:
- 100 çift için watchBidsAsks: ~100 kayıt (çift başına 1 alış/satış)
- 100 çift için watchOrderBookForSymbols: ~100.000-1.000.000 kayıt (100-1000 seviye × 2 taraf × 100 çift)
Tam emir defteri ile kitabın tepesi (Alış/Satış) metodları arasındaki veri yoğunluğunun görsel karşılaştırması
Pratik Örnek: Gate.io ve Gerçeklik ile Belgeleme Karşılaştırması
Temiz API belgelemesi ile gerçek dünya borsa davranışı arasındaki uçurum
Belgelemenin pratiğe uymadığı gerçek bir örneğe bakalım.
Test: Gate.io'da watchOrderBookForSymbols
10 popüler işlem çiftine abone olmaya çalışma:
const symbols = [
'1CAT/USDT:USDT',
'1INCH/USDT:USDT',
'A8/USDT:USDT',
'AAVE/USDT:USDT',
'ACE/USDT:USDT',
'ACH/USDT:USDT',
'ACT/USDT:USDT',
'ACX/USDT:USDT',
'ADA/USDT:USDT',
'ADX/USDT:USDT'
];
const exchange = new ccxt.pro.gateio();
try {
const orderbooks = await exchange.watchOrderBookForSymbols(symbols);
console.log('Başarılı!', orderbooks);
} catch (error) {
console.error('Hata:', error.message);
}
Gerçek sonuç:
NotSupported: gateio watchOrderBookForSymbols() is not supported yet
Önemli ders: Bir metot API belgelemesinde ilan edilmiş olsa bile bu, belirli bir borsa için çalıştığını garanti etmez. Her zaman pratikte test edin!
Otomatik Denetim: Gerçekte Ne Destekleniyor
75'ten fazla kripto para borsasında gerçek metot desteğini gösteren uyumluluk matrisi
Metot desteğinin gerçek resmini elde etmek için tüm CCXT borsalarını kontrol eden bir betik yazıldı:
const ccxt = require('ccxt');
async function checkAllExchangeMethods() {
const results = [];
// Desteklenen tüm borsaların listesini al
const exchangeIds = ccxt.pro.exchanges;
for (const exchangeId of exchangeIds) {
try {
const exchange = new ccxt.pro[exchangeId]();
// Metot varlığını kontrol et
const hasWatchOrderBook = typeof exchange.watchOrderBook === 'function';
const hasWatchBidsAsks = typeof exchange.watchBidsAsks === 'function';
const hasWatchOrderBookForSymbols = typeof exchange.watchOrderBookForSymbols === 'function';
// Spot ve vadeli işlem desteğini kontrol et
const hasSpot = exchange.has['spot'];
const hasFutures = exchange.has['future'] || exchange.has['swap'];
results.push({
exchange: exchangeId,
spot: hasSpot,
futures: hasFutures,
watchOrderBook: hasWatchOrderBook,
watchBidsAsks: hasWatchBidsAsks,
watchOrderBookForSymbols: hasWatchOrderBookForSymbols
});
} catch (error) {
console.error(`${exchangeId} kontrol hatası:`, error.message);
}
}
return results;
}
// Kontrolü çalıştır
checkAllExchangeMethods().then(results => {
console.table(results);
});
Denetim Sonuçları (En İyi Borsaların Bir Bölümü)
Borsa | Spot (OB/BA/OBS) | Vadeli (OB/BA/OBS)
----------------------------------------------------------
binance | ✓/✓/✓ | ✓/✓/✓
bybit | ✓/✓/✓ | ✓/✓/✓
okx | ✓/✓/✓ | ✓/✓/✓
gateio | ✓/✓/✓ | ✓/✓/✓
mexc | ✓/✓/✓ | ✓/✓/✓
kucoin | ✓/✓/✓ | ✓/✓/✓
huobi | ✓/✓/✓ | ✓/✓/✓
bitget | ✓/✓/✓ | ✓/✓/✓
Önemli not:
Betik yalnızca JavaScript nesnesindeki metot varlığını kontrol eder, borsa tarafındaki gerçek desteği değil. Bu nedenle "✓" her zaman işlevsellik anlamına gelmez — Gate.io örneğinde gördüğümüz gibi.
Metot Seçimi İçin Pratik Öneriler
Kullanım senaryonuza göre doğru WebSocket metodunu seçmek için karar akış şeması
Farklı Kullanım Senaryoları İçin
1. Çok sayıda çifti izleme (100+):
watchBidsAskskullanın- Minimum trafik
- Yalnızca en iyi fiyatları alın
- Arbitraj botları için ideal
2. Tek bir çift için tam emir defteri oluşturma:
watchOrderBookkullanın- Tam piyasa derinliği
- Piyasa yapıcı stratejiler için uygun
3. Birkaç çifti tam derinlikle izleme:
- Önce
watchOrderBookForSymbolsdeneyin - Desteklenmiyorsa — birden fazla
watchOrderBookkullanın - Borsa bağlantı sayısı sınırlarını göz önünde bulundurun
4. Tek seferlik veri alma:
fetchOrderBookWsveya normal REST API kullanın- Anlık görüntüler veya başlatma için
Performans Optimizasyonu
Kaotik bireysel bağlantılar (sol) ile optimize edilmiş çoğullanmış WebSocket bağlantısı (sağ)
Bağlantı yönetimi:
// Kötü: birden fazla bağlantı oluşturma
const symbols = ['BTC/USDT', 'ETH/USDT', 'ADA/USDT'];
const orderbooks = await Promise.all(
symbols.map(symbol => exchange.watchOrderBook(symbol))
);
// İyi: tüm çiftler için tek bağlantı (destekleniyorsa)
try {
const orderbooks = await exchange.watchOrderBookForSymbols(symbols);
} catch (error) {
// Bireysel aboneliklere geri dön
const orderbooks = await Promise.all(
symbols.map(symbol => exchange.watchOrderBook(symbol))
);
}
Derinlik yönetimi:
// Trafik tasarrufu için derinliği sınırla
const orderbook = await exchange.watchOrderBook('BTC/USDT', 20); // yalnızca 20 seviye
Hata Yönetimi ve Bağlantı Kurtarma
Üstel geri çekilme yeniden deneme deseniyle dayanıklı bağlantı kurtarma
WebSocket bağlantıları düşebilir, bu nedenle uygun hata yönetimi önemlidir:
async function robustWatchOrderBook(exchange, symbol, maxRetries = 3) {
let retries = 0;
while (retries < maxRetries) {
try {
const orderbook = await exchange.watchOrderBook(symbol);
retries = 0; // başarıda sayacı sıfırla
return orderbook;
} catch (error) {
retries++;
console.error(`Abonelik hatası (deneme ${retries}):`, error.message);
if (retries >= maxRetries) {
throw new Error(`${maxRetries} denemeden sonra abone olunamadı`);
}
// Üstel geri çekilme
await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, retries)));
}
}
}
Veri Kalitesi İzleme
Doğrulama kontrol noktalarından geçen emir defteri verisi: yapı, tazelik ve spread mantığı
Alınan verinin kalitesini takip etmek önemlidir:
function validateOrderBook(orderbook) {
// Temel yapıyı kontrol et
if (!orderbook.bids || !orderbook.asks) {
throw new Error('Geçersiz emir defteri yapısı');
}
// Veri tazeliğini kontrol et
const now = Date.now();
const dataAge = now - orderbook.timestamp;
if (dataAge > 10000) { // 10 saniyeden eski
console.warn('Eski emir defteri verisi:', dataAge, 'ms');
}
// Fiyat mantığını kontrol et
const bestBid = orderbook.bids[0] ? orderbook.bids[0][0] : 0;
const bestAsk = orderbook.asks[0] ? orderbook.asks[0][0] : 0;
if (bestBid >= bestAsk && bestBid > 0 && bestAsk > 0) {
console.warn('Çapraz spread:', { bestBid, bestAsk });
}
}
Sonuçlar ve En İyi Uygulamalar
CCXT ile pratik deneyimlere dayanarak temel öneriler şunlardır:
1. Yalnızca Belgelemeye Güvenmeyin
Üretimde uygulamadan önce metodları her zaman gerçek veriyle test edin. API'de metodun varlığı işlevselliği garanti etmez.
2. Görev İçin Doğru Metodu Seçin
- Toplu izleme:
watchBidsAsks - Ayrıntılı analiz:
watchOrderBook - Tek seferlik istekler:
fetchOrderBookWs
3. Trafiği Optimize Edin
Çok sayıda çifti izlemek için watchBidsAsks, watchOrderBookForSymbols'dan 1000 kat daha verimli olabilir.
4. Arızalara Hazır Olun
Sağlam yeniden deneme mantığı ve veri kalitesi izlemesi uygulayın.
5. Üretim Yüklerinde Test Edin
API davranışı, yük altında test isteklerine kıyasla dramatik biçimde farklılık gösterebilir.
Emir Defterleri İçin WebSocket API'lerinin Geleceği
Parçalı borsa bağlantılarından birleşik standartlaştırılmış API protokollerine
Sektör daha standartlaştırılmış yaklaşımlara doğru ilerliyor:
- Borsalar arasında metot birleştirme
- Gerçek örneklerle geliştirilmiş belgeleme
- Daha verimli veri sıkıştırma protokolleri
- Daha iyi hata ayıklama araçları ve izleme
Sonuç
Emir defterleri için WebSocket API'leri güçlü araçlardır ancak her borsanın özelliklerini derinlemesine anlamayı gerektirir. CCXT, arayüzleri birleştirerek çalışmayı önemli ölçüde basitleştirir, ancak gerçeklik hâlâ belgeden daha karmaşıktır.
Başarının anahtarı test etmek, izlemek ve belirli görevler için doğru metodları seçmektir. Unutmayın: bir borsada çalışan şey, API'ler özdeş görünse bile başka bir borsada çalışmayabilir.
Başarılı bir işlem sistemi yalnızca doğru algoritmalar değil, aynı zamanda güvenilir bir veri altyapısıdır. Ve CCXT WebSocket metodları bu altyapının önemli bir parçasıdır.
Borsa WebSocket API'leriyle deneyiminiz nasıl? Beklenmedik sorunlarla karşılaştınız mı? Yorumlarda paylaşın!
Faydalı Bağlantılar
Atıf
@software{soloviov2025ccxtprowebsocketorderbook,
author = {Soloviov, Eugen},
title = {CCXT: How WebSocket Orderbook Methods Really Work},
year = {2025},
url = {https://marketmaker.cc/tr/blog/post/ccxt-pro-websocket-orderbook-methods},
version = {0.1.0},
description = {CCXT WebSocket emir defteri metodlarının ayrıntılı analizi: watchOrderBook, watchBidsAsks, watchOrderBookForSymbols. 75'ten fazla borsada gerçek testler.}
}
Yazarlar
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.