Потоковые данные AsterDEX с WebSocket и Node.js

Узнайте, как получать рыночные данные в реальном времени с биржи AsterDEX, используя WebSocket API и Node.js. Это ключ к созданию быстрых и отзывчивых торговых приложений.

REST против WebSocket: Почему важен Real-Time?

В нашем предыдущем руководстве мы использовали REST API. Это "pull" модель: вы отправляете запрос и получаете ответ. Для получения обновлений нужно постоянно опрашивать сервер, что медленно и неэффективно.

WebSocket — это "push" модель. Вы устанавливаете одно постоянное соединение, и сервер сам присылает вам данные, как только они появляются. Это критически важно для отслеживания быстрых движений рынка, арбитража и других стратегий, где задержка в доли секунды имеет значение.

Необходимые условия:

  • Установленный Node.js и npm.
  • Базовое понимание JavaScript и асинхронности (async/await, Promises).

Шаг 1: Настройка проекта

Создайте новую папку для вашего проекта, инициализируйте npm и установите библиотеку `ws` — популярный WebSocket клиент для Node.js.

mkdir asterdex-websocket
cd asterdex-websocket
npm init -y
npm install ws

Теперь создайте файл `app.js` — это будет наш основной файл.

Шаг 2: Установка соединения с WebSocket

Импортируем библиотеку `ws` и создаем нового клиента, указывая WebSocket URL биржи AsterDEX.

const WebSocket = require('ws');

// WebSocket эндпоинт AsterDEX
const WS_URL = 'wss://fstream.asterdex.com/ws';

console.log('Подключение к WebSocket...');
const ws = new WebSocket(WS_URL);

// Обработчик открытия соединения
ws.on('open', () => {
    console.log('Соединение с WebSocket успешно установлено!');
    // Здесь мы будем подписываться на потоки
});

// Обработчик входящих сообщений
ws.on('message', (data) => {
    const message = JSON.parse(data);
    console.log('Получено сообщение:', message);
});

// Обработчик ошибок
ws.on('error', (error) => {
    console.error('Ошибка WebSocket:', error);
});

// Обработчик закрытия соединения
ws.on('close', () => {
    console.log('Соединение с WebSocket закрыто.');
});

Шаг 3: Подписка на потоки данных

После установки соединения биржа не будет ничего присылать, пока мы не подпишемся на интересующие нас "потоки" (streams). Подписка происходит путем отправки JSON-сообщения определенного формата.

Давайте подпишемся на поток агрегированных сделок (`aggTrade`) для пары `BTCUSDT`.

// Поместите этот код внутрь обработчика ws.on('open', ...)

// Параметры для подписки
const subscriptionParams = {
  method: "SUBSCRIBE",
  params: [
    "btcusdt@aggTrade" // Поток агрегированных сделок для BTC/USDT
  ],
  id: 1 // Уникальный идентификатор запроса
};

// Отправляем запрос на подписку
ws.send(JSON.stringify(subscriptionParams));
console.log('Отправлен запрос на подписку:', JSON.stringify(subscriptionParams));

Теперь, если вы запустите код (`node app.js`), после установки соединения вы начнете получать в консоли сообщения о каждой новой сделке по паре BTC/USDT в реальном времени!

Шаг 4: Подписка на несколько потоков и обработка данных

Вы можете подписаться на несколько потоков одновременно. Давайте добавим поток данных из стакана ордеров (`depth5`), который показывает 5 лучших уровней цен на покупку и продажу.

// Внутри ws.on('open', ...)

const multiStreamParams = {
  method: "SUBSCRIBE",
  params: [
    "btcusdt@aggTrade",     // Сделки
    "btcusdt@depth5@100ms"  // Стакан (5 уровней) с обновлением каждые 100мс
  ],
  id: 2
};

ws.send(JSON.stringify(multiStreamParams));
console.log('Отправлен запрос на подписку на несколько потоков...');

Теперь нужно научиться различать сообщения из разных потоков. Для этого в `ws.on('message', ...)` будем проверять структуру объекта.

// Внутри ws.on('message', ...)

const message = JSON.parse(data);

if (message.stream) {
    if (message.stream.endsWith('@aggTrade')) {
        const trade = message.data;
        console.log(`Новая сделка по ${trade.s}: Цена=${trade.p}, Кол-во=${trade.q}`);
    } else if (message.stream.endsWith('@depth5@100ms')) {
        const depth = message.data;
        console.log(`Обновление стакана ${message.stream.split('@')[0]}: Лучший Ask=${depth.asks[0][0]}, Лучший Bid=${depth.bids[0][0]}`);
    }
} else if (message.result === null) {
    console.log('Подписка успешно подтверждена!');
} else {
    console.log('Системное сообщение:', message);
}

Заключение и что дальше?

Вы научились подключаться к WebSocket API AsterDEX и получать данные в реальном времени. Это основа для создания быстрых торговых ботов, дашбордов и аналитических инструментов.

Следующие шаги:

  • Надежность соединения: Реализуйте логику автоматического переподключения при обрыве связи.
  • Управление подписками: Добавьте функции для динамической подписки и отписки от потоков без перезапуска приложения.
  • Аутентифицированные эндпоинты: Для получения данных о балансе или статусе ордеров через WebSocket требуется аутентификация. Изучите документацию для этого.
  • Интеграция с логикой: Соедините полученные данные с торговой логикой, которая будет принимать решения и отправлять ордера через REST API.

Для получения полного списка доступных потоков и их форматов обратитесь к официальной документации API AsterDEX.