Трейдер ведёт канал с сигналами в Telegram, но вы не успеваете вручную открывать сделки? Бот для копирования сделок решает эту проблему: он автоматически отслеживает позиции трейдера и воспроизводит их на вашем аккаунте. В отличие от готовых решений, наша разработка позволяет гибко настраивать источники, риск-менеджмент и алгоритмы масштабирования. Задержка исполнения критична: разница в 200 мс может съесть 5% прибыли. Наши боты используют низкоуровневые API и WebSocket для минимальной latency. Также мы внедряем логирование и мониторинг через Tenderly для on-chain сделок.
Один из наших клиентов, управляющий портфелем на $2M, жаловался на проскальзывание 0.3% при копировании через Telegram. Мы перевели его на direct exchange API и снизили latency с 400 ms до 80 ms, что сэкономило около $600 в месяц на проскальзывании.
Почему задержка критична?
Latency между сигналом и исполнением напрямую влияет на доходность. Чем дольше обрабатывается сигнал, тем больше вероятность, что цена изменится не в вашу пользу. При высокочастотном копировании даже 100 ms могут означать разницу между профитом и убытком. Мы используем WebSocket и асинхронные вызовы для ускорения.
Какие источники сигналов использует бот?
Выбор источника определяет задержку и надёжность системы. Сравним три основных варианта:
| Источник | Типичная задержка | Надёжность | Сложность интеграции |
|---|---|---|---|
| Exchange API (sub-account) | 50-200 мс | Высокая | Средняя |
| Telegram webhook | 200-500 мс | Средняя | Низкая |
| On-chain мониторинг | 1-3 секунды | Низкая (зависит от сети) | Высокая |
Через Exchange API
Если источник торгует на той же бирже, самый надёжный вариант — polling его позиций через API:
class ExchangeCopyTrader:
def __init__(self, source_api_key: str, follower_api_key: str, exchange: str):
self.source_client = ExchangeClient(source_api_key)
self.follower_client = ExchangeClient(follower_api_key)
self.tracked_positions: dict = {}
async def sync_positions(self):
"""Синхронизируем позиции каждые N секунд"""
source_positions = await self.source_client.get_open_positions()
follower_positions = await self.follower_client.get_open_positions()
source_map = {p.symbol: p for p in source_positions}
follower_map = {p.symbol: p for p in follower_positions}
# Новые позиции у источника — открываем у follower
for symbol, pos in source_map.items():
if symbol not in follower_map:
await self.open_copied_position(pos)
# Позиции закрыты у источника — закрываем у follower
for symbol in follower_map:
if symbol not in source_map:
await self.close_copied_position(symbol)
# Изменился размер позиции — корректируем
for symbol in source_map:
if symbol in follower_map:
source_size = source_map[symbol].size
follower_size = follower_map[symbol].size
scaled_size = source_size * self.config.scale_factor
if abs(follower_size - scaled_size) / scaled_size > 0.05:
await self.adjust_position(symbol, scaled_size)
Через Telegram webhook
Многие трейдеры публикуют сигналы в Telegram каналах. Бот парсит сообщения:
class TelegramSignalParser:
# Паттерн для парсинга: "BUY BTCUSDT @ 50000, SL: 48000, TP: 55000"
SIGNAL_PATTERN = r'(BUY|SELL)\s+(\w+)\s+@\s+([\d.]+)(?:.*SL:\s*([\d.]+))?(?:.*TP:\s*([\d.]+))?'
def parse_message(self, text: str) -> TradeSignal | None:
import re
match = re.search(self.SIGNAL_PATTERN, text, re.IGNORECASE)
if not match:
return None
return TradeSignal(
action=match.group(1).upper(),
symbol=match.group(2).upper(),
entry_price=float(match.group(3)),
stop_loss=float(match.group(4)) if match.group(4) else None,
take_profit=float(match.group(5)) if match.group(5) else None,
source='telegram'
)
On-chain мониторинг кошельков
Для DeFi: мониторинг on-chain транзакций известного кошелька (whale tracking). Мы слушаем события Swap через WebSocket и фильтруем транзакции с суммой > $1000. Это позволяет копировать сделки крупных кошельков на Uniswap. Реализация осуществляется через web3.py и подписку на logs.
Как рассчитывается размер копируемой позиции?
Мы реализуем три режима масштабирования:
| Режим | Описание | Когда использовать |
|---|---|---|
| Пропорциональный | Копирует тот же % капитала, что и у трейдера | Когда капитал соизмерим |
| Фиксированный | Копирует указанный объём (не более 10% от баланса follower) | Когда нужен лимит на сделку |
| Fixed risk | Ограничивает риск на сделку % от баланса | При агрессивном трейдинге |
def calculate_copy_size(
source_trade: Trade,
source_balance: float,
follower_balance: float,
mode: str = 'proportional',
multiplier: float = 1.0
) -> float:
if mode == 'proportional':
# Копируем тот же % капитала
source_percent = source_trade.size_usd / source_balance
return follower_balance * source_percent * multiplier
elif mode == 'fixed':
return min(source_trade.size_usd * multiplier, follower_balance * 0.1)
elif mode == 'fixed_risk':
# Фиксированный риск на сделку (% от баланса)
if source_trade.stop_loss:
risk_percent = abs(source_trade.entry - source_trade.stop_loss) / source_trade.entry
max_loss = follower_balance * (self.config.risk_per_trade / 100)
return max_loss / risk_percent
return follower_balance * 0.02 # default 2%
Как минимизировать задержки?
Latency между сигналом и исполнением критична: пока ваш бот обрабатывает сигнал, цена движется. Копирование через API быстрее телеграм-сигналов в 2-3 раза.
class LatencyMonitor:
def __init__(self):
self.latencies = []
async def execute_with_tracking(self, signal: TradeSignal) -> Execution:
t0 = time.perf_counter()
# Исполняем ордер
order = await self.exchange.place_market_order(
symbol=signal.symbol,
side=signal.action.lower(),
amount=self.calculate_size(signal)
)
t1 = time.perf_counter()
latency_ms = (t1 - t0) * 1000
self.latencies.append(latency_ms)
logger.info(f"Copy latency: {latency_ms:.1f}ms, fill: {order.fill_price}")
# Алерт если слишком медленно
if latency_ms > 500:
await self.alert(f"High latency: {latency_ms:.0f}ms for {signal.symbol}")
return order
Типичные latency для разных источников:
- Exchange sub-account API → ~50-200ms
- Telegram webhook → ~200-500ms
- On-chain мониторинг → ~1000-3000ms (зависит от network)
Что включает риск-менеджмент для копирующего бота?
class CopyBotRiskManager:
def can_copy(self, signal: TradeSignal, account_state: AccountState) -> tuple[bool, str]:
# Общий drawdown
if account_state.drawdown_percent > self.config.max_drawdown:
return False, "max_drawdown_exceeded"
# Количество одновременных позиций
if len(account_state.open_positions) >= self.config.max_positions:
return False, "max_positions_reached"
# Уже есть позиция по этому символу
if signal.symbol in account_state.open_positions:
return False, "symbol_already_open"
# Минимальный баланс для открытия
required = self.calculate_required_margin(signal)
if account_state.free_balance < required * 1.1: # 10% буфер
return False, "insufficient_balance"
return True, "ok"
Процесс разработки бота под ключ
- Анализ требований — определяем источники сигналов, режимы копирования, риск-параметры.
- Проектирование архитектуры — выбираем стек (Python/Go, биржевые API, брокер сообщений).
- Реализация — пишем ядро бота, парсеры, риск-менеджер.
- Тестирование — на исторических данных и реальных сигналах (backtest + paper trade).
- Деплой — разворачиваем на VPS с мониторингом (Grafana, алерты).
- Обучение и документация — передаём исходники, инструкцию, настраиваем поддержку.
Базовая версия с одним источником сигналов занимает от 5 до 10 рабочих дней. Для полноценной системы с несколькими источниками и продвинутым риск-менеджментом — от 15 до 25 дней.
Готовы обсудить ваш проект? Свяжитесь с нами для бесплатной консультации. Получите демо-версию бота на ваших сигналах.
Что входит в работу
- Настройка источников сигналов (API, Telegram, ончейн).
- Реализация алгоритмов копирования (пропорциональный, фиксированный, fixed risk).
- Интеграция риск-менеджмента (drawdown, лимиты, стоп-лоссы).
- Тестирование на исторических данных и paper trade.
- Развёртывание на сервере с мониторингом.
- Документация и обучение.
- Поддержка в течение месяца после запуска.
Мы гарантируем прозрачность на каждом этапе: все исходники остаются у вас, нет скрытых комиссий. Закажите разработку бота по индивидуальному ТЗ — мы предложим решение под вашу стратегию.







