Разработка криптобота

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1 услугВсе 1306 услуг
Разработка криптобота
Средняя
~1-2 недели
Часто задаваемые вопросы
Направления блокчейн-разработки
Этапы блокчейн-разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1258
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1170
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    873
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1092
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    830

Разработка криптобота

Крипто-бот — это не магия и не гарантированный профит. Это автоматизированная система исполнения торговой стратегии. Хорошая стратегия + плохая реализация = деньги потеряны. Плохая стратегия + хорошая реализация = деньги потеряны медленно. Разберём как строится 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, интеграцию с биржей и настройку мониторинга.