Ми розробляємо системи копітрейдингу для криптобірж — від MVP до high-load платформи з тисячами підписників. Це не просто копіювання ордерів: потрібно забезпечити чесний рейтинг лідерів, захист від маніпуляцій та управління ризиками для follower-ів. Використовуємо Kafka-шину для розподілу сигналів, Redis для кешування балансів і PostgreSQL для зберігання історії. Один з наших проєктів обробляв 50 000 сигналів на день з latency менше 10 мс — розповімо, як це влаштовано. Типові проблеми: slippage через затримки, front-running ліквідності, маніпуляції через wash-trading. Розберемо, як інженерні рішення їх вирішують.
Копітрейдинг: як побудувати систему з низькою затримкою?
Сигнал-процесор і розподіл — розробка системи копітрейдингу
Leader Trading Account │ trade events ▼ Signal Processor ──── Position Normalizer │ ▼ Distribution Engine ──── Risk Filter │ ├──► Follower 1 Order ──► Exchange OMS ├──► Follower 2 Order ──► Exchange OMS └──► Follower N Order ──► Exchange OMS Сигнал-процесор перехоплює торгові події лідера через event bus (для внутрішніх трейдерів) або WebSocket (для зовнішніх бірж). Нормалізатор позицій перетворює дію в абстрактний сигнал: «відкрити long BTC на 5% портфеля з плечем 2x». Розподільник розсилає сигнали всім follower-ам через Kafka. Фільтр ризиків перевіряє баланс, ліміти та налаштування кожного підписника перед виконанням. Як зазначено в документації Kafka, правильно налаштовані кластери можуть досягати latency в одиниці мілісекунд для доставки повідомлень.
Режими копіювання
| Режим | Опис | Приклад |
|---|---|---|
| Fixed amount | Кожна угода копіюється на фіксовану суму | $100 на угоду |
| Proportional | Розмір пропорційний балансу підписника | 10% від капіталу |
| Multiplier | Пропорційно з коефіцієнтом | 0.5x, 2x |
| Fixed ratio | Фіксоване плече відносно лідера | 1:1 leverage |
Пропорційний режим — стандарт індустрії. Реалізація розрахунку розміру ордера:
def calculate_follower_order_size( leader_trade: Trade, follower: FollowerSettings, leader_portfolio_value: float ) -> float: leader_position_percent = leader_trade.notional_value / leader_portfolio_value if follower.copy_mode == 'proportional': raw_size = follower.allocated_amount * leader_position_percent * follower.multiplier elif follower.copy_mode == 'fixed': raw_size = follower.fixed_amount_per_trade else: raw_size = leader_trade.quantity # пряме копіювання # Обмеження ризику max_allowed = follower.allocated_amount * (follower.max_position_percent / 100) raw_size = min(raw_size, max_allowed) # Мінімальний ордер біржі min_order = get_min_order_size(leader_trade.symbol) if raw_size < min_order: return 0 # не копіюємо занадто малий ордер return raw_size Чому latency критична в системі копітрейдингу і як її знижують?
Копітрейдинг — гонка за виконанням. Якщо лідер відкрив позицію, а follower-и отримують ордер через 500 мс, ціна вже пішла. При волатильності 5% за хвилину це перетворюється на гарантований slippage. Event bus швидший за polling в 50 разів при 10 000 підписників.
Ми використовуємо event bus замість polling: сигнал → Kafka topic → consumer group. Для 10 000 підписників latency розподілу менше 10 мс. Для топ-лідерів резервуємо capacity в matching engine. Агрегація market-ордерів в один batch знижує навантаження на систему.
Порівняння підходів:
| Параметр | Event bus (Kafka) | Polling (REST) |
|---|---|---|
| Latency на 10k підписників | <10 мс | ~500 мс |
| Пропускна здатність | 100k+ msg/s | ~1k msg/s |
| Складність інфраструктури | Середня | Низька |
from aiokafka import AIOKafkaProducer, AIOKafkaConsumer import asyncio class CopyTradingDistributor: async def distribute_signal(self, signal: TradeSignal): """Розподіляємо сигнал через Kafka""" producer = AIOKafkaProducer(bootstrap_servers='localhost:9092') # Партиціонуємо по leader_id — всі follower-и лідера в одній партиції await producer.send( topic='copy_signals', key=signal.leader_id.encode(), value=signal.to_json().encode() ) async def process_signals(self, partition_id: int): """Кожен consumer обробляє свій набір follower-ів""" consumer = AIOKafkaConsumer( 'copy_signals', bootstrap_servers='localhost:9092', group_id=f'copy_processor_{partition_id}' ) async for msg in consumer: signal = TradeSignal.from_json(msg.value) followers = await self.db.get_followers(signal.leader_id) # Паралельне створення ордерів tasks = [ self.create_follower_order(follower, signal) for follower in followers ] await asyncio.gather(*tasks, return_exceptions=True) Як захистити follower-ів від MEV і маніпуляцій?
При тисячі копіювальників сумарний обсяг може рухати ринок. Використовуємо TWAP/VWAP-алгоритми та slippage cap (якщо прослизання перевищує 0.5%, ордер відхиляється). Економія для follower-ів досягає 30% на комісіях slippage. Наприклад, при депозиті 10 000 USDT follower може обмежити максимальний збиток на угоду до 200 USDT (2%), а денний ліміт до 500 USDT (5%). Для захисту від front-running застосовуємо commit-reveal схеми та приватні мемпули.
Рейтинг лідерів без маніпуляцій
Метрики лідера — вітрина продукту. Ми розраховуємо ROI, win rate, profit factor, максимальну просадку, Sharpe та Calmar. Захист від маніпуляцій:
- Враховуємо unrealized PnL для відкритих позицій старших 30 днів.
- Лідерська історія публікується з моменту реєстрації, періоди приховати не можна.
- Для отримання статусу лідера потрібен мінімальний реальний обсяг торгів (наприклад, 10 000 USDT).
Детальні метрики рейтингу лідерів
- ROI за останні 30 днів
- Sharpe ratio
- Максимальна просадка
- Win rate
- Profit factor
Налаштування копіювання для follower
- Вибрати лідера з рейтингу.
- Встановити параметри копіювання (режим, суму, ліміти).
- Підтвердити та активувати.
Ризик-менеджмент для follower-ів
Кожен підписник налаштовує ліміти через датаклас:
@dataclass class FollowerRiskSettings: max_loss_per_trade_percent: float = 2.0 daily_loss_limit_percent: float = 5.0 total_loss_limit_percent: float = 20.0 max_position_size_percent: float = 30.0 allowed_symbols: list = field(default_factory=list) max_leverage: int = 10 stop_if_leader_drawdown_percent: float = 15.0 При порушенні будь-якого ліміту копіювання зупиняється автоматично, follower отримує сповіщення.
Моделі монетизації
Підтримуємо три моделі комісій: Performance fee (5–30% від прибутку, з High Water Mark), management fee (щомісячна підписка) та гібридна. High Water Mark запобігає подвійній комісії при відновленні після збитків.
def calculate_performance_fee( follower_id: str, leader_id: str, fee_rate: float = 0.15 ) -> float: account = self.db.get_copy_account(follower_id, leader_id) current_value = account.current_value hwm = account.high_water_mark if current_value <= hwm: return 0.0 new_profit = current_value - hwm fee = new_profit * fee_rate self.db.update_hwm(follower_id, leader_id, current_value) return fee Що входить в роботу?
- Архітектурна документація (HLD, LLD)
- Вихідний код з коментарями
- CI/CD пайплайн (GitHub Actions + Docker)
- Інтеграція з біржею (REST/WebSocket)
- Юніт- та інтеграційні тести (покриття >70%)
- Навчання команди (до 5 годин)
- Гарантійна підтримка 30 днів після запуску
Процес: аналітика → проєктування → MVP (4–6 тижнів) → ітеративне покращення. Строк — від 4 до 12 тижнів залежно від складності. Оцінимо ваш проєкт безкоштовно за 1 день — просто пишіть. Наша команда має 7+ років досвіду в блокчейн-розробці та реалізувала понад 15 проєктів у сфері DeFi та копітрейдингу. Зв'яжіться з нами для оцінки вашого проєкту. Отримайте консультацію з архітектури копітрейдингу.







