Рано или поздно каждый серьёзный арбитражник приходит к одному и тому же выводу: руками масштабировать невозможно. Вы можете мониторить 5–10 пар, биржа закрывается на техобслуживание именно когда появляется хороший спред, и самое обидное — бот, который вы написали бы за выходные, сделал бы за ночь то, что вы вручную делаете месяц.
Эта статья — практическое руководство по автоматизации: от архитектуры до первого рабочего бота.
Зачем автоматизировать арбитраж
Три главных причины перейти от ручного к автоматическому арбитражу:
Скорость. Бот реагирует на появление спреда за миллисекунды. Человек — за 10–30 секунд в лучшем случае. На быстрых парах это разница между прибылью и упущенной возможностью.
Масштаб. Ручной трейдер реально мониторит 5–15 пар. Бот — 500+ пар на 10 биржах одновременно, 24 часа в сутки без усталости и ошибок концентрации.
Дисциплина. Бот никогда не нарушает свои правила: всегда соблюдает пороговый спред, всегда проверяет ликвидность, никогда не входит в сделку «потому что кажется, что сработает».
Архитектура арбитражного бота
Любой арбитражный бот состоит из четырёх основных компонентов.
Компонент 1: Сбор данных (Data Layer)
Получает цены, объёмы и состояние стаканов с бирж в реальном времени.
Два способа получения данных:
REST API (polling): бот каждые N секунд запрашивает цены у биржи.
- Просто в реализации
- Задержка зависит от частоты запросов
- Биржи ограничивают количество запросов (rate limits)
- Подходит для начала и для медленных стратегий
WebSocket (streaming): биржа сама отправляет обновления цен как только они меняются.
- Данные приходят в реальном времени (задержка 10–100 мс)
- Более сложная реализация
- Не потребляет лимиты API так же агрессивно
- Обязателен для быстрых стратегий
Пример WebSocket подключения (Python, Binance):
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
symbol = data['s'] # торговая пара
price = float(data['c']) # текущая цена
print(f"{symbol}: {price}")
ws = websocket.WebSocketApp(
"wss://stream.binance.com:9443/ws/ethusdt@ticker",
on_message=on_message
)
ws.run_forever()
Компонент 2: Логика поиска возможностей (Strategy Layer)
Анализирует данные и определяет: есть ли арбитражная возможность прямо сейчас.
Для межбиржевого арбитража:
def find_opportunity(prices: dict, threshold: float = 0.004) -> dict | None:
"""
prices = {'binance': {'ETH/USDT': {'ask': 2484.0, 'bid': 2483.5}},
'bybit': {'ETH/USDT': {'ask': 2501.0, 'bid': 2500.5}}}
threshold = минимальный чистый спред (0.4%)
"""
for pair in prices['binance']:
if pair not in prices['bybit']:
continue
buy_price = prices['binance'][pair]['ask'] # покупаем на Binance
sell_price = prices['bybit'][pair]['bid'] # продаём на Bybit
gross_spread = (sell_price - buy_price) / buy_price
net_spread = gross_spread - 0.002 # вычитаем комиссии (2 × 0.1%)
if net_spread >= threshold:
return {
'pair': pair,
'buy_exchange': 'binance',
'sell_exchange': 'bybit',
'buy_price': buy_price,
'sell_price': sell_price,
'net_spread': net_spread
}
return None
Для треугольного арбитража:
def check_triangle(prices: dict, base: str = 'USDT') -> dict | None:
"""
Проверяет маршрут: USDT → A → B → USDT
"""
fee = 0.001 # 0.1% комиссия
for coin_a in prices:
for coin_b in prices:
if coin_a == coin_b:
continue
# Проверяем наличие всех трёх пар
pair1 = f"{coin_a}/{base}" # USDT → A
pair2 = f"{coin_b}/{coin_a}" # A → B
pair3 = f"{coin_b}/{base}" # B → USDT
if not all(p in prices for p in [pair1, pair2, pair3]):
continue
# Расчёт маршрута
step1 = (1 / prices[pair1]['ask']) * (1 - fee)
step2 = step1 * prices[pair2]['bid'] * (1 - fee)
step3 = step2 * prices[pair3]['bid'] * (1 - fee)
profit = step3 - 1.0 # прибыль от $1
if profit > 0.001: # минимум 0.1% после комиссий
return {
'route': f"{base}→{coin_a}→{coin_b}→{base}",
'profit_pct': profit * 100
}
return None
Компонент 3: Исполнение ордеров (Execution Layer)
Размещает ордера на биржах.
import ccxt
class OrderExecutor:
def __init__(self):
self.exchanges = {
'binance': ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'options': {'defaultType': 'spot'}
}),
'bybit': ccxt.bybit({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET'
})
}
def execute_arbitrage(self, opportunity: dict, amount_usdt: float):
buy_ex = self.exchanges[opportunity['buy_exchange']]
sell_ex = self.exchanges[opportunity['sell_exchange']]
pair = opportunity['pair']
# Рассчитываем количество монет
amount_coins = amount_usdt / opportunity['buy_price']
try:
# Размещаем оба ордера почти одновременно
buy_order = buy_ex.create_market_buy_order(pair, amount_coins)
sell_order = sell_ex.create_market_sell_order(pair, amount_coins)
return {
'success': True,
'buy_order': buy_order,
'sell_order': sell_order
}
except Exception as e:
return {'success': False, 'error': str(e)}
Компонент 4: Управление рисками и логирование (Risk & Logging Layer)
Контролирует размер позиций, максимальные потери и записывает все действия.
class RiskManager:
def __init__(self, max_position_usdt: float = 1000,
daily_loss_limit: float = 50):
self.max_position = max_position_usdt
self.daily_loss_limit = daily_loss_limit
self.daily_pnl = 0.0
def can_trade(self, amount: float) -> tuple[bool, str]:
if amount > self.max_position:
return False, f"Превышен лимит позиции: {amount} > {self.max_position}"
if self.daily_pnl < -self.daily_loss_limit:
return False, f"Достигнут дневной лимит потерь: {self.daily_pnl}"
return True, "OK"
def update_pnl(self, profit: float):
self.daily_pnl += profit
Библиотеки и инструменты
CCXT — главная библиотека для крипто-ботов
CCXT (CryptoCurrency eXchange Trading Library) — open-source библиотека с унифицированным API для 100+ бирж. Вместо того чтобы изучать API каждой биржи отдельно — один интерфейс для всех.
pip install ccxt
Поддерживаемые биржи: Binance, Bybit, OKX, KuCoin, Gate.io, Kraken, Coinbase и 100+ других.
Основные операции:
import ccxt
exchange = ccxt.binance({'apiKey': '...', 'secret': '...'})
# Получить текущую цену
ticker = exchange.fetch_ticker('ETH/USDT')
print(ticker['ask'], ticker['bid'])
# Получить стакан
orderbook = exchange.fetch_order_book('ETH/USDT', limit=20)
print(orderbook['asks'][:5]) # топ-5 asks
# Разместить рыночный ордер
order = exchange.create_market_buy_order('ETH/USDT', 0.1) # купить 0.1 ETH
Другие полезные библиотеки (Python)
| Библиотека | Назначение |
|---|---|
ccxt |
Работа с биржами |
asyncio |
Асинхронное выполнение (несколько бирж параллельно) |
aiohttp |
Асинхронные HTTP запросы |
websockets |
WebSocket подключения |
pandas |
Анализ данных и логирование |
sqlalchemy |
Сохранение данных в БД |
python-telegram-bot |
Уведомления в Telegram |
JavaScript/TypeScript альтернатива
Node.js также популярен для торговых ботов — особенно если планируете DeFi/Web3 интеграцию.
const ccxt = require('ccxt');
const binance = new ccxt.binance({
apiKey: 'YOUR_KEY',
secret: 'YOUR_SECRET'
});
async function getSpread(pair) {
const ticker = await binance.fetchTicker(pair);
return { ask: ticker.ask, bid: ticker.bid };
}
Готовые решения vs собственная разработка
Не обязательно писать бота с нуля. Вот спектр вариантов:
Вариант 1: Готовые арбитражные боты (SaaS)
Платформы типа Cryptohopper, 3Commas, Bitsgap предлагают арбитражные стратегии без программирования.
Плюсы: быстрый старт, не нужно программировать, поддержка.
Минусы: ежемесячная плата ($30–150), ограниченная гибкость, вы не контролируете логику полностью.
Подходит для: тех, кто хочет автоматизацию без кода.
Вариант 2: Open-source боты с настройкой
Freqtrade, Hummingbot — open-source фреймворки для торговых ботов с поддержкой арбитража.
# Установка Hummingbot
pip install hummingbot
# Запуск
hummingbot
Hummingbot имеет встроенную стратегию cross_exchange_market_making и arbitrage — можно настроить без глубоких знаний кода.
Плюсы: бесплатно, большое сообщество, гибкая настройка.
Минусы: требует времени на изучение, некоторые продвинутые функции платные.
Вариант 3: Написать самостоятельно
Максимальная гибкость и контроль. Реально для тех, кто знает Python или JavaScript хотя бы на базовом уровне.
Минимальный арбитражный бот: 200–400 строк кода.
Время разработки: 1–2 выходных для базовой версии.
Пошаговый план: от нуля до рабочего бота
Шаг 1: Изучите API выбранной биржи (3–5 дней)
Начните с одной биржи. Binance и Bybit имеют отличную документацию на английском.
Что изучить:
- REST API: как получить тикеры, стакан, историю сделок
- WebSocket: как подписаться на обновления цен
- Торговый API: как размещать и отменять ордера
- Rate limits: сколько запросов можно делать в секунду
Практика: напишите скрипт который каждые 5 секунд выводит цену ETH/USDT с Binance.
Шаг 2: Мониторинг спредов (3–5 дней)
Добавьте вторую биржу. Напишите скрипт который:
- Получает цены с двух бирж одновременно (asyncio)
- Считает спред
- Выводит в консоль все пары со спредом > 0,5%
Это ещё не бот — только мониторинг. Запустите его на 2–3 дня и посмотрите как часто появляются возможности.
Шаг 3: Бумажная торговля (1 неделя)
Добавьте логику принятия решений но без реальных ордеров. Бот должен:
- Находить возможность
- Рассчитывать позицию с учётом комиссий
- Логировать «сделку» в файл или базу данных
- Считать гипотетический P&L
После недели — анализируйте журнал: насколько точны были сигналы? Сколько возможностей было за день? Какой был бы реальный результат?
Шаг 4: Реальная торговля с минимальными суммами
Подключите реальные API ключи и торгуйте с $100–200. Цель — не прибыль, а проверка работы системы в боевых условиях.
Что проверяем:
- Ордера исполняются корректно
- Балансы обновляются правильно
- Бот правильно обрабатывает ошибки (нет соединения, недостаточно баланса)
- Логирование работает
Шаг 5: Оптимизация и масштабирование
После успешных 2–4 недель реальной торговли:
- Добавляйте больше пар и бирж
- Оптимизируйте скорость (WebSocket вместо REST)
- Добавляйте дополнительные проверки риска
- Постепенно увеличивайте размер позиций
Инфраструктура: где запускать бота
Вариант 1: Локальный компьютер
Плюсы: бесплатно, легко отлаживать.
Минусы: зависит от вашего интернета и питания, нужно держать компьютер включённым 24/7.
Подходит для: разработки и тестирования.
Вариант 2: VPS (Virtual Private Server)
Облачный сервер работает 24/7 независимо от вас. Стоимость: $5–20/месяц.
Рекомендуемые провайдеры:
- DigitalOcean (Droplet от $6/мес)
- Hetzner (от €4/мес — отличное соотношение цена/качество)
- AWS/Google Cloud (мощнее, дороже)
Минимальные требования для арбитражного бота:
- 1–2 CPU
- 1–2 GB RAM
- 20 GB SSD
- Расположение сервера: желательно близко к дата-центрам бирж (Токио или Сингапур для Binance/Bybit)
Базовая настройка сервера (Ubuntu):
# Установка Python
sudo apt update && sudo apt install python3 python3-pip -y
# Установка зависимостей
pip3 install ccxt asyncio aiohttp
# Запуск бота в фоне
nohup python3 arbitrage_bot.py > bot.log 2>&1 &
# Просмотр логов
tail -f bot.log
Вариант 3: Docker контейнер
Для более профессионального деплоя — упаковка бота в Docker.
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "bot.py"]
Безопасность API ключей
Это критически важный аспект, который часто игнорируют.
Правила безопасности:
1. Никогда не давайте боту права на вывод. При создании API ключа отключите разрешение «Withdraw». Бот должен только торговать, не выводить.
2. IP-whitelist. Привяжите API ключ к IP-адресу вашего сервера. Даже если ключ украдут — он не будет работать с другого IP.
3. Не храните ключи в коде. Используйте переменные окружения:
import os
api_key = os.environ.get('BINANCE_API_KEY')
secret = os.environ.get('BINANCE_SECRET')
4. Разные ключи для разных ботов. Если один бот скомпрометирован — остальные в безопасности.
5. Мониторинг активности. Настройте уведомления о каждой сделке в Telegram — аномальная активность будет заметна сразу.
Мониторинг и уведомления
Бот должен сам сообщать вам о своей работе. Минимальный набор уведомлений:
import requests
def send_telegram(message: str, bot_token: str, chat_id: str):
url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
requests.post(url, json={
'chat_id': chat_id,
'text': message,
'parse_mode': 'HTML'
})
# Использование
send_telegram(
f"✅ Сделка: ETH Binance→Bybit\n"
f"Прибыль: +$12.40 (0.41%)\n"
f"Объём: $3,000",
bot_token="...",
chat_id="..."
)
Что уведомлять:
- Каждая исполненная сделка (с прибылью/убытком)
- Ошибки исполнения
- Достижение дневного лимита потерь
- Перезапуск бота
- Низкий баланс на бирже
Типичные ошибки при разработке арбитражного бота
Ошибка 1: Нет обработки ошибок API Биржи иногда возвращают ошибки: нет соединения, недостаточно баланса, превышен rate limit. Без обработки бот упадёт и потенциально оставит открытую позицию.
try:
order = exchange.create_market_buy_order(pair, amount)
except ccxt.InsufficientFunds:
log.error("Недостаточно баланса")
except ccxt.NetworkError:
log.error("Ошибка соединения — retry")
time.sleep(5)
# повторная попытка
Ошибка 2: Гонка данных (race condition) Данные с двух бирж могут быть несинхронны. Цена, полученная 500 мс назад, уже неактуальна. Всегда проверяйте временную метку полученных данных.
Ошибка 3: Нет лимита убытков
Бот без ограничений на дневные потери может потерять весь капитал из-за одного бага. Всегда устанавливайте daily_loss_limit.
Ошибка 4: Тестирование только на истории Бэктест на исторических данных не учитывает проскальзывание, задержки API и конкуренцию. Всегда проводите paper trading в реальном времени.
Ошибка 5: Запуск сразу с большим капиталом Начинайте с $100–200. Первые недели — отладка, не заработок.
Заключение
Автоматизация арбитража — это не сложно, если идти поэтапно. Первый рабочий бот можно написать за выходные, имея базовые знания Python. Ключевые принципы:
- Начинайте с одной стратегии на двух биржах
- Сначала мониторинг → потом бумажная торговля → потом реальные деньги
- Безопасность API ключей — приоритет с первого дня
- Лимиты убытков обязательны
- Логируйте всё
SpreadScan даёт готовые данные о спредах и ликвидности — это избавляет от необходимости самостоятельно разрабатывать слой сбора данных и позволяет сосредоточиться на логике стратегии.
Данная статья носит образовательный характер. Торговля криптовалютами сопряжена с рисками. Всегда тестируйте стратегии перед использованием реальных средств.
Часто задаваемые вопросы
Какой язык программирования лучше для арбитражного бота? Python — лучший выбор для начала: отличная библиотека ccxt, простой синтаксис, большое сообщество. JavaScript/TypeScript — хорош для DeFi/Web3 интеграции. C++ — для максимальной скорости в HFT, но это уровень профессионала.
Сколько стоит разработать арбитражного бота? Самостоятельно: только время (1–4 недели для базовой версии). Через фрилансера: $500–3 000 за базовый бот. Готовые SaaS решения: $30–150/месяц.
Нужны ли специальные серверы для арбитражного бота? Для начала — нет. VPS за $5–10/мес достаточно. Для высокочастотных стратегий со временем реакции < 10 мс нужны серверы co-location рядом с дата-центрами бирж — но это уровень профессионала.
Безопасно ли давать боту API ключи? При правильной настройке — да. Главное: отключите разрешение на вывод, привяжите ключ к IP-адресу сервера, никогда не храните ключи в открытом коде.
Что такое Hummingbot и стоит ли его использовать? Hummingbot — бесплатный open-source фреймворк для торговых ботов с поддержкой арбитража. Хороший выбор для тех, кто хочет автоматизацию без написания кода с нуля. Имеет встроенные стратегии и интерфейс настройки.