Разработка криптобота
Крипто-бот — это не магия и не гарантированный профит. Это автоматизированная система исполнения торговой стратегии. Хорошая стратегия + плохая реализация = деньги потеряны. Плохая стратегия + хорошая реализация = деньги потеряны медленно. Разберём как строится production-ready бот, который не теряет средства по техническим причинам.
Архитектура торгового бота
Основные компоненты
Любой бот состоит из нескольких независимых слоёв:
Data layer — получение рыночных данных. REST для исторических данных, WebSocket для реалтайм. Нормализация данных из разных бирж в единый формат.
Strategy layer — вычисление сигналов. Принимает свечи/стакан/данные, возвращает: BUY / SELL / HOLD с объёмом.
Execution layer — размещение ордеров. Получает сигнал, размещает ордер через биржевой API, отслеживает исполнение.
Risk management layer — ограничения на уровне системы: максимальный drawdown, максимальная позиция, stop-loss на уровне портфеля.
Persistence layer — сохранение состояния, сделок, P&L.
interface TradingBot {
dataFeed: DataFeed;
strategy: Strategy;
executor: OrderExecutor;
riskManager: RiskManager;
state: BotState;
}
// Основной цикл
async function runBotCycle(bot: TradingBot) {
const candles = await bot.dataFeed.getLatestCandles(bot.config.pair, bot.config.timeframe);
const signal = bot.strategy.calculate(candles);
if (!bot.riskManager.allowsSignal(signal, bot.state)) {
return; // риск-контроль заблокировал
}
if (signal.action !== 'HOLD') {
await bot.executor.execute(signal, bot.state);
}
}
Подключение к бирже через CCXT
CCXT (CryptoCurrency eXchange Trading Library) — стандартная библиотека для подключения к 100+ биржам с единым API. Python, JavaScript, PHP.
import ccxt
import asyncio
exchange = ccxt.binance({
'apiKey': API_KEY,
'secret': API_SECRET,
'options': {
'defaultType': 'spot', # spot / future / margin
},
'enableRateLimit': True, # встроенный rate limiter
})
async def fetch_ohlcv(symbol: str, timeframe: str, limit: int = 200):
ohlcv = await exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
# [[timestamp, open, high, low, close, volume], ...]
return pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
CCXT обрабатывает rate limits, нормализует форматы ответов, маппит коды ошибок. Для multibиржевых стратегий — переключение биржи одной строкой.
Типы стратегий и их реализация
Трендовые стратегии
Следуют за трендом: покупают при восходящем тренде, продают при нисходящем. Примеры: пересечение скользящих средних (EMA crossover), ADX + DI.
import pandas_ta as ta
def ema_crossover_signal(df: pd.DataFrame, fast: int = 9, slow: int = 21) -> str:
df['ema_fast'] = ta.ema(df['close'], length=fast)
df['ema_slow'] = ta.ema(df['close'], length=slow)
prev_diff = df['ema_fast'].iloc[-2] - df['ema_slow'].iloc[-2]
curr_diff = df['ema_fast'].iloc[-1] - df['ema_slow'].iloc[-1]
if prev_diff < 0 and curr_diff > 0:
return 'BUY' # golden cross
elif prev_diff > 0 and curr_diff < 0:
return 'SELL' # death cross
return 'HOLD'
Mean-reversion стратегии
Предполагают возврат цены к среднему: продают при перекупленности, покупают при перепроданности. RSI, Bollinger Bands. Работают в боковике, теряют на трендах.
Статистический арбитраж
Поиск коинтегрированных пар (BTC/ETH исторически коинтегрированы). При расхождении спреда сверх порога — long отстающего, short обгоняющего. Требует постоянного мониторинга коинтеграции (она нестабильна).
Risk management
Это важнее самой стратегии. Без риск-менеджмента любая стратегия рано или поздно обнуляет депозит.
class RiskManager:
def __init__(self, config: RiskConfig):
self.max_position_pct = config.max_position_pct # % от депозита
self.max_daily_loss_pct = config.max_daily_loss_pct
self.max_drawdown_pct = config.max_drawdown_pct
self.daily_pnl = 0
self.peak_balance = None
def calculate_position_size(self, balance: float, price: float, stop_price: float) -> float:
# Kelly criterion / fixed fractional
risk_per_trade = balance * (self.max_position_pct / 100)
price_risk = abs(price - stop_price) / price
if price_risk == 0:
return 0
position_value = risk_per_trade / price_risk
return min(position_value, balance * 0.3) # не более 30% в одной позиции
def check_circuit_breaker(self, current_balance: float) -> bool:
if self.peak_balance is None:
self.peak_balance = current_balance
drawdown = (self.peak_balance - current_balance) / self.peak_balance * 100
daily_loss = self.daily_pnl / self.peak_balance * 100
if drawdown > self.max_drawdown_pct:
return False # стоп торговле — превышен max drawdown
if daily_loss < -self.max_daily_loss_pct:
return False # стоп торговле — превышен дневной лимит потерь
return True
Обязательные параметры риск-менеджера:
- Max позиция: % от депозита на одну сделку
- Daily loss limit: бот останавливается при X% потерях за день
- Max drawdown: глобальная остановка при падении от пика
- Stop-loss: на каждую сделку
Backtesting
Бот без backtesting — это гемблинг. Backtrader (Python) или backtesting.py для простого старта, Vectorbt для быстрого векторизованного тестирования.
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
import backtesting.lib as lib
class EMAStrategy(Strategy):
fast = 9
slow = 21
def init(self):
close = self.data.Close
self.ema_fast = self.I(lib.EMA, close, self.fast)
self.ema_slow = self.I(lib.EMA, close, self.slow)
def next(self):
if crossover(self.ema_fast, self.ema_slow):
self.buy(size=0.95)
elif crossover(self.ema_slow, self.ema_fast):
self.position.close()
bt = Backtest(data, EMAStrategy, cash=10000, commission=0.001)
stats = bt.run()
print(stats[['Return [%]', 'Sharpe Ratio', 'Max. Drawdown [%]', 'Win Rate [%]']])
Ключевые метрики backtesting:
- Sharpe Ratio > 1.5 — приемлемый результат
- Max Drawdown — сколько бот мог потерять от пика
- Win Rate — % прибыльных сделок (не главная метрика)
- Profit Factor = gross profit / gross loss (> 1.5 хорошо)
Предупреждение об overfitting: стратегия с 20+ параметрами, оптимизированная на 2 годах данных, скорее всего overfit. Проверяй на out-of-sample данных (данных, которых не было при оптимизации).
Развёртывание и мониторинг
Бот в production должен:
- Работать 24/7 на VPS/облаке (минимум 2 CPU, 4 GB RAM, SSD)
- Автоматически перезапускаться при падении (systemd, Docker + restart policy)
- Логировать все действия с timestamp
- Отправлять алерты в Telegram при ошибках или аномалиях
- Иметь web dashboard с текущим статусом, P&L, открытыми позициями
# Telegram алерт при критической ошибке
async def send_alert(message: str, level: str = 'INFO'):
bot = telegram.Bot(token=TELEGRAM_TOKEN)
prefix = {'INFO': 'ℹ', 'WARNING': '⚠️', 'ERROR': '🔴', 'CRITICAL': '🚨'}
await bot.send_message(
chat_id=CHAT_ID,
text=f"{prefix.get(level, '')} {level}\n{message}\n\nBot: {BOT_NAME}\nTime: {datetime.utcnow()}"
)
| Компонент | Технология |
|---|---|
| Язык | Python 3.11+ / TypeScript |
| Биржевое API | CCXT / прямое API |
| Индикаторы | pandas-ta / ta-lib |
| Backtesting | backtesting.py / Vectorbt |
| База данных | PostgreSQL / InfluxDB (time-series) |
| Оркестрация | Docker + systemd |
| Мониторинг | Grafana + Prometheus |
Разработка бота под конкретную стратегию — 3–6 недель включая backtesting, интеграцию с биржей и настройку мониторинга.







