← Maqolalarga qaytish
June 3, 2025
5 daqiqa o'qish

CCXT: WebSocket order book metodlari aslida qanday ishlaydi

CCXT: WebSocket order book metodlari aslida qanday ishlaydi
#CCXT
#WebSocket
#orderbook
#exchanges
#API
#trading
#cryptocurrency
📖
Part 1 of 6 · Collection
Order Book & Market Microstructure

Salom! Bugun savdo tizimlari ishlab chiquvchilari uchun eng muhim mavzulardan biriga chuqurroq nazar tashlaymiz — CCXT'da order booklarni olish uchun WebSocket metodlari qanday ishlaydi. Agar sizda "nega bu metod hujjatlarda bor-u, amalda ishlamaydi?" yoki "100+ savdo juftini kuzatish uchun qaysi metodni tanlash kerak?" degan savollar tug'ilgan bo'lsa, ushbu maqola aynan siz uchun.

Kirish: bu nima uchun muhim

Bozor ma'lumotlarini yig'ish uchun CCXT bilan ishlashda ko'plab dasturchilar muhim savollarga duch kelishadi:

  • Order booklar uchun qaysi WebSocket metodlari turli birjalarda haqiqatan ham qo'llab-quvvatlanadi?
  • Metodlar trafik hajmi va ma'lumotlar tuzilishi bo'yicha qanday farq qiladi?
  • Nima uchun avtomatlashtirilgan testlar "✓" ko'rsatishi mumkin, holbuki metod amalda ishlamaydi?

Ushbu maqolada — mashhur metodlarning batafsil tahlili, ularning xususiyatlari va 75+ birjadagi haqiqiy holat.

Asosiy metodlarga umumiy nazar

WebSocket order book metodlariga umumiy nazar Order book ma'lumotlari uchun to'rtta asosiy WebSocket metodi: yakka obuna, ommaviy obuna, top-of-book kuzatuvi va bir martalik snapshot

Zamonaviy birja API'lari WebSocket orqali order book ma'lumotlarini olishning bir necha usulini taklif qiladi. Har birini ko'rib chiqamiz:

1. watchOrderBook - Klassik yondashuv

Bu bitta savdo jufti uchun order book yangilanishlariga obuna bo'lishning asosiy metodi.

Asosiy xususiyatlari:

  • Maqsadi: bir juft uchun order book yangilanishlariga obuna bo'lish
  • Ulanish turi: doimiy WebSocket ulanishi
  • Ma'lumotlar: to'liq order book (odatda har tomon uchun 100–1000 daraja)
  • Trafik: o'rtachadan yuqorigacha, yangilanish chastotasi va chuqurligiga bog'liq

Foydalanish namunasi:

const exchange = new ccxt.pro.binance();
const orderbook = await exchange.watchOrderBook('BTC/USDT');
console.log(orderbook);

2. watchOrderBookForSymbols - Ommaviy obuna

Bu metod, agar birja qo'llab-quvvatlasa, bir vaqtning o'zida bir nechta savdo juftlariga obuna bo'lish imkonini beradi.

Asosiy xususiyatlari:

  • Maqsadi: bir vaqtda bir nechta juftlarga obuna bo'lish
  • Ulanish turi: doimiy WebSocket, ko'pincha bir nechta juftlar uchun bitta ulanish
  • Ma'lumotlar: har bir juft uchun — to'liq order book
  • Trafik: juftlar soni ko'p bo'lganda juda yuqori (100–1000 daraja × 2 tomon × juftlar soni)

Javob namunasi:

{
  "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"
  }
}

Muhim ogohlantirish: aslida bu barcha birjalarda qo'llab-quvvatlanmaydi. Ba'zan metod API'da mavjud bo'ladi, lekin amalga oshirilmagan bo'ladi.

3. watchBidsAsks - Optimallashtirilgan kuzatuv

Bir nechta savdo juftlarida eng yaxshi narxlarni kuzatishning eng tejamkor usuli.

Asosiy xususiyatlari:

  • Maqsadi: bir nechta juftlar uchun faqat eng yaxshi narxlarga (top of book) obuna bo'lish
  • Ulanish turi: doimiy WebSocket, ko'pincha barcha juftlar uchun bitta ulanish
  • Ma'lumotlar: har tomon uchun faqat bitta narx (bid/ask)
  • Trafik: minimal, ko'p sonli juftlarni kuzatish uchun mos

Javob namunasi:

{
  "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"
  }
}

Xususiyati: odatda ticker endpoint orqali amalga oshiriladi — bu ham mijoz, ham birja uchun resurslarni tejaydi.

4. fetchOrderBookWs - Bir martalik so'rovlar

Order book snapshotlarini olish uchun REST API'ga muqobil.

Asosiy xususiyatlari:

  • Maqsadi: WebSocket orqali bir martalik order book so'rovi (REST'ga o'xshash)
  • Ulanish turi: vaqtinchalik WebSocket, ma'lumot olingandan so'ng ulanish yopiladi
  • Ma'lumotlar: order book snapshoti
  • Trafik: minimal

Muhim farqlar va metodlarni taqqoslash

To'g'ri yondashuvni tanlash uchun metodlar o'rtasidagi farqlarni tushunish juda muhim:

Doimiy va vaqtinchalik ulanishlar

  1. watch* metodlari — doimiy ulanish yaratadi, real vaqt rejimida streaming yangilanishlarni oladi
  2. fetch* metodlari — WebSocket'ni faqat bir martalik so'rov uchun ishlatadi, xuddi REST API kabi

Trafikni taqqoslash

watchBidsAsks vs watchOrderBookForSymbols:

  • watchBidsAsks — 100–1000 marta kam trafik, ommaviy kuzatuv uchun ideal
  • watchOrderBookForSymbols — kuchli, lekin trafikka juda og'ir va barcha birjalar tomonidan qo'llab-quvvatlanmaydi

Trafikni hisoblash namunasi:

  • 100 juft uchun watchBidsAsks: ~100 yozuv (har bir juft uchun 1 bid/ask)
  • 100 juft uchun watchOrderBookForSymbols: ~100 000-1 000 000 yozuv (100-1000 daraja × 2 tomon × 100 juft)

Order book metodlarining trafigini taqqoslash To'liq order book va top-of-book (Bids/Asks) metodlari o'rtasidagi ma'lumotlar intensivligini vizual taqqoslash

Amaliy holat: Gate.io va haqiqat vs hujjatlar

Hujjatlar vs haqiqat Toza API hujjatlari bilan birjaning real hayotdagi xatti-harakati o'rtasidagi tafovut

Hujjatlar amaliyot bilan mos kelmasligi mumkin bo'lgan haqiqiy misolni ko'rib chiqamiz.

Test: Gate.io'da watchOrderBookForSymbols

10 ta mashhur savdo juftiga obuna bo'lishga urinish:

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('Success!', orderbooks);
} catch (error) {
  console.error('Error:', error.message);
}

Haqiqiy natija:

NotSupported: gateio watchOrderBookForSymbols() is not supported yet

Muhim saboq: metod API hujjatlarida e'lon qilingan bo'lsa ham, bu uning ma'lum bir birjada ishlashiga kafolat bermaydi. Har doim amalda tekshirib ko'ring!

Avtomatlashtirilgan audit: aslida nima qo'llab-quvvatlanadi

Birjalar moslik auditi matritsasi 75+ kriptovalyuta birjasida metodlarning haqiqiy qo'llab-quvvatlanishini ko'rsatuvchi moslik matritsasi

Metodlarni qo'llab-quvvatlash haqida real tasavvur olish uchun barcha CCXT birjalarini tekshiruvchi skript yozildi:

const ccxt = require('ccxt');

async function checkAllExchangeMethods() {
    const results = [];
    
    // Get list of all supported exchanges
    const exchangeIds = ccxt.pro.exchanges;
    
    for (const exchangeId of exchangeIds) {
        try {
            const exchange = new ccxt.pro[exchangeId]();
            
            // Check for method presence
            const hasWatchOrderBook = typeof exchange.watchOrderBook === 'function';
            const hasWatchBidsAsks = typeof exchange.watchBidsAsks === 'function';
            const hasWatchOrderBookForSymbols = typeof exchange.watchOrderBookForSymbols === 'function';
            
            // Check spot and futures support
            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(`Error checking ${exchangeId}:`, error.message);
        }
    }
    
    return results;
}

// Run the check
checkAllExchangeMethods().then(results => {
    console.table(results);
});

Audit natijalari (top birjalar fragmenti)

Exchange        | Spot (OB/BA/OBS) | Futures (OB/BA/OBS)
----------------------------------------------------------
binance         | ✓/✓/✓            | ✓/✓/✓
bybit           | ✓/✓/✓            | ✓/✓/✓
okx             | ✓/✓/✓            | ✓/✓/✓
gateio          | ✓/✓/✓            | ✓/✓/✓
mexc            | ✓/✓/✓            | ✓/✓/✓
kucoin          | ✓/✓/✓            | ✓/✓/✓
huobi           | ✓/✓/✓            | ✓/✓/✓
bitget          | ✓/✓/✓            | ✓/✓/✓

Muhim eslatma:
Skript faqat JavaScript ob'ektida metodning mavjudligini tekshiradi, birja tomonidan haqiqiy qo'llab-quvvatlanishini emas. Shuning uchun "✓" har doim ham funksionallikni anglatmaydi — buni Gate.io misolida ko'rdik.

Metod tanlash bo'yicha amaliy tavsiyalar

Metod tanlash qaror daraxti Foydalanish holatingizga asoslangan to'g'ri WebSocket metodini tanlash uchun qaror sxemasi

Turli foydalanish holatlari uchun

1. Ko'p sonli juftlarni (100+) kuzatish:

  • watchBidsAsks dan foydalaning
  • Minimal trafik
  • Faqat eng yaxshi narxlarni oling
  • Arbitraj botlari uchun ideal

2. Bitta juft uchun to'liq order book yaratish:

  • watchOrderBook dan foydalaning
  • To'liq bozor chuqurligi
  • Market-meyking strategiyalari uchun mos

3. To'liq chuqurlik bilan bir nechta juftlarni kuzatish:

  • Avval watchOrderBookForSymbols ni sinab ko'ring
  • Qo'llab-quvvatlanmasa — bir nechta watchOrderBook dan foydalaning
  • Ulanishlar soni bo'yicha birja cheklovlarini hisobga oling

4. Bir martalik ma'lumot olish:

  • fetchOrderBookWs yoki oddiy REST API dan foydalaning
  • Snapshotlar yoki initsializatsiya uchun

Unumdorlikni optimallashtirish

Ulanishlarni optimallashtirish: ko'p vs multipleksatsiyalangan Tartibsiz individual ulanishlar (chapda) vs optimallashtirilgan multipleksatsiyalangan WebSocket ulanishi (o'ngda)

Ulanishlarni boshqarish:

// Bad: creating multiple connections
const symbols = ['BTC/USDT', 'ETH/USDT', 'ADA/USDT'];
const orderbooks = await Promise.all(
    symbols.map(symbol => exchange.watchOrderBook(symbol))
);

// Good: one connection for all pairs (if supported)
try {
    const orderbooks = await exchange.watchOrderBookForSymbols(symbols);
} catch (error) {
    // Fallback to individual subscriptions
    const orderbooks = await Promise.all(
        symbols.map(symbol => exchange.watchOrderBook(symbol))
    );
}

Chuqurlikni boshqarish:

// Limit depth to save traffic
const orderbook = await exchange.watchOrderBook('BTC/USDT', 20); // only 20 levels

Xatolarni qayta ishlash va ulanishni tiklash

Xatolarni qayta ishlash va eksponensial backoff qayta urinish Eksponensial backoff qayta urinish naqshi bilan chidamli ulanishni tiklash

WebSocket ulanishlari uzilib qolishi mumkin, shuning uchun to'g'ri xatolarni qayta ishlash muhim:

async function robustWatchOrderBook(exchange, symbol, maxRetries = 3) {
    let retries = 0;
    
    while (retries < maxRetries) {
        try {
            const orderbook = await exchange.watchOrderBook(symbol);
            retries = 0; // reset counter on success
            return orderbook;
        } catch (error) {
            retries++;
            console.error(`Subscription error (attempt ${retries}):`, error.message);
            
            if (retries >= maxRetries) {
                throw new Error(`Failed to subscribe after ${maxRetries} attempts`);
            }
            
            // Exponential backoff
            await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, retries)));
        }
    }
}

Ma'lumotlar sifatini kuzatish

Ma'lumotlar sifatini tekshirish pipelayni Tekshirish nazorat punktlaridan o'tayotgan order book ma'lumotlari: tuzilma, dolzarblik va spred mantig'i

Olingan ma'lumotlarning sifatini kuzatib borish muhim:

function validateOrderBook(orderbook) {
    // Check basic structure
    if (!orderbook.bids || !orderbook.asks) {
        throw new Error('Invalid orderbook structure');
    }
    
    // Check data freshness
    const now = Date.now();
    const dataAge = now - orderbook.timestamp;
    if (dataAge > 10000) { // older than 10 seconds
        console.warn('Stale orderbook data:', dataAge, 'ms');
    }
    
    // Check price logic
    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('Crossed spread:', { bestBid, bestAsk });
    }
}

Xulosalar va eng yaxshi amaliyotlar

CCXT bilan amaliy tajribaga asoslanib, mana asosiy tavsiyalar:

1. Faqat hujjatlarga ishonmang

Ishlab chiqarishga joriy qilishdan oldin metodlarni har doim haqiqiy ma'lumotlarda sinab ko'ring. API'da metodning mavjudligi uning funksionalligiga kafolat bermaydi.

2. Vazifa uchun to'g'ri metodni tanlang

  • Ommaviy kuzatuv: watchBidsAsks
  • Batafsil tahlil: watchOrderBook
  • Bir martalik so'rovlar: fetchOrderBookWs

3. Trafikni optimallashtiring

Ko'p sonli juftlarni kuzatish uchun watchBidsAsks watchOrderBookForSymbols ga qaraganda 1000 martagacha samaraliroq bo'lishi mumkin.

4. Nosozliklarga tayyor bo'ling

Ishonchli qayta urinish mantig'ini va ma'lumotlar sifatini kuzatishni joriy qiling.

5. Ishlab chiqarish yuklamalarida sinab ko'ring

API xatti-harakati yuklama ostida test so'rovlariga nisbatan keskin farq qilishi mumkin.

Order booklar uchun WebSocket API'larning kelajagi

WebSocket API'larning evolyutsiyasi Parchalangan birja ulanishlaridan yagona standartlashtirilgan API protokollariga qadar

Sanoat ko'proq standartlashtirilgan yondashuvlar tomon harakat qilmoqda:

  • Birjalar o'rtasida metodlarni birlashtirish
  • Haqiqiy misollar bilan yaxshilangan hujjatlar
  • Samaraliroq ma'lumotlarni siqish protokollari
  • Yaxshiroq debagging vositalari va kuzatuv

Xulosa

Order booklar uchun WebSocket API'lar kuchli vositalar hisoblanadi, lekin ular har bir birjaning o'ziga xos xususiyatlarini chuqur tushunishni talab qiladi. CCXT interfeyslarni birlashtirish orqali ishni sezilarli darajada soddalashtiradi, lekin haqiqat hali ham hujjatlarga qaraganda murakkabroq.

Muvaffaqiyatning kaliti — sinov o'tkazish, kuzatib borish va aniq vazifalar uchun to'g'ri metodlarni tanlashdir. Esda tuting: bir birjada ishlaydigan narsa boshqasida ishlamasligi mumkin, hatto API'lar bir xil ko'rinsa ham.

Muvaffaqiyatli savdo tizimi nafaqat to'g'ri algoritmlardan, balki ishonchli ma'lumotlar infratuzilmasidan ham iborat. Va CCXT WebSocket metodlari ushbu infratuzilmaning muhim qismidir.

Birjalarning WebSocket API'lari bilan sizning tajribangiz qanday? Kutilmagan muammolarga duch kelganmisiz? Fikr-mulohazalarda baham ko'ring!

Foydali havolalar

Iqtibos

@software{soloviov2025ccxtprowebsocketorderbook,
  author = {Soloviov, Eugen},
  title = {CCXT: How WebSocket Orderbook Methods Really Work},
  year = {2025},
  url = {https://marketmaker.cc/en/blog/post/ccxt-pro-websocket-orderbook-methods},
  version = {0.1.0},
  description = {Detailed breakdown of CCXT WebSocket methods for orderbooks: watchOrderBook, watchBidsAsks, watchOrderBookForSymbols. Real tests on 75+ exchanges.}
}
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

Bozordan bir qadam oldinda bo'ling

Sun'iy intellekt savdo tahlillari, bozor tahlili va platforma yangiliklari uchun bizning xabarnomaga obuna bo'ling.

Biz sizning maxfiyligingizni hurmat qilamiz. Istalgan vaqtda obunadan chiqishingiz mumkin.