Разработка системы социального трейдинга
Социальный трейдинг позволяет менее опытным пользователям копировать сделки успешных трейдеров, а профессионалам — монетизировать свои стратегии через подписчиков. eToro сделал этот формат популярным в традиционных финансах, в крипто пространстве он реализован в Bitget Copy Trade, Bybit Copy Trading и независимых платформах.
Ключевые компоненты системы
Leader Board — рейтинг трейдеров с верифицированными результатами: P&L, Sharpe ratio, max drawdown, win rate, количество подписчиков. Данные должны быть верифицированы — нельзя полагаться на самодекларацию.
Copy Trading Engine — при получении сигнала от master-трейдера, система автоматически повторяет ордер для каждого follower с масштабированием по размеру.
Risk Management для followers — follower устанавливает лимиты: максимальный размер позиции, максимальный drawdown для auto-stop.
Compensation System — расчёт вознаграждения для master-трейдеров: fixed fee за подписку или performance fee (% от прибыли подписчика).
Copy Trading Engine
class CopyTradingEngine:
def __init__(self, order_service, follower_repo, risk_manager):
self.order_service = order_service
self.follower_repo = follower_repo
self.risk_manager = risk_manager
async def on_master_order(self, master_id: str, order: MasterOrder):
"""Вызывается при каждом новом ордере master-трейдера"""
followers = await self.follower_repo.get_active_followers(master_id)
if not followers:
return
# Параллельно обрабатываем всех followers
tasks = [
self.copy_order_for_follower(follower, order)
for follower in followers
]
results = await asyncio.gather(*tasks, return_exceptions=True)
# Логируем результаты
for follower, result in zip(followers, results):
if isinstance(result, Exception):
logger.error(f"Copy failed for {follower.id}: {result}")
else:
logger.info(f"Copied order for {follower.id}: {result.id}")
async def copy_order_for_follower(
self,
follower: FollowerConfig,
master_order: MasterOrder
) -> Order:
# Рассчитываем размер позиции с учётом настроек follower
follower_balance = await self.get_usdt_balance(follower.user_id)
scaled_quantity = self.scale_quantity(
master_order.quantity,
master_order.master_portfolio_value,
follower_balance,
follower.allocation_pct, # % капитала follower для копирования
)
# Проверяем риск-лимиты follower
risk_check = await self.risk_manager.check(
follower_id=follower.user_id,
symbol=master_order.symbol,
quantity=scaled_quantity,
side=master_order.side,
)
if not risk_check.approved:
logger.warning(f"Risk check failed for {follower.id}: {risk_check.reason}")
return None
# Выставляем ордер
return await self.order_service.place_order(
user_id=follower.user_id,
exchange=follower.exchange,
symbol=master_order.symbol,
side=master_order.side,
order_type='MARKET', # копируем как market для гарантии исполнения
quantity=scaled_quantity,
copy_reference=master_order.id,
)
def scale_quantity(
self,
master_qty: Decimal,
master_portfolio: Decimal,
follower_balance: Decimal,
allocation_pct: float,
) -> Decimal:
"""Масштабирует позицию relative to portfolio size"""
master_position_pct = master_qty / master_portfolio
follower_allocation = follower_balance * Decimal(str(allocation_pct / 100))
return follower_allocation * master_position_pct
Верификация торговой истории
Критически важно: результаты master-трейдеров должны быть верифицированы через реальные биржевые данные, а не самодекларированы.
class TradeHistoryVerifier:
async def verify_master_account(self, user_id: str, exchange_api_key: str) -> VerificationResult:
"""Верифицирует торговую историю через read-only API ключ"""
# Подключаемся к бирже с read-only ключом пользователя
exchange = ExchangeClient(exchange_api_key, permissions=['READ_ONLY'])
# Загружаем историю ордеров за последние 90 дней
orders = await exchange.get_order_history(days=90)
trades = await exchange.get_trade_history(days=90)
# Рассчитываем верифицированные метрики
metrics = calculate_performance_metrics(orders, trades)
# Сохраняем с флагом "verified"
await self.performance_repo.save(
user_id=user_id,
metrics=metrics,
verified=True,
verification_time=datetime.utcnow(),
)
return VerificationResult(verified=True, metrics=metrics)
Performance Metrics
def calculate_performance_metrics(orders: list, trades: list) -> PerformanceMetrics:
daily_returns = compute_daily_returns(trades)
return PerformanceMetrics(
total_pnl=sum(t.pnl for t in trades),
total_pnl_pct=...,
win_rate=len([t for t in trades if t.pnl > 0]) / len(trades),
sharpe_ratio=sharpe(daily_returns),
sortino_ratio=sortino(daily_returns),
max_drawdown=max_drawdown(daily_returns),
profit_factor=sum(t.pnl for t in trades if t.pnl > 0) / abs(sum(t.pnl for t in trades if t.pnl < 0)),
total_trades=len(trades),
avg_trade_duration=avg_duration(trades),
roi_30d=roi_for_period(trades, 30),
roi_90d=roi_for_period(trades, 90),
)
Fee структура
Компенсация master-трейдерам — ключевой элемент экономики платформы:
Performance Fee (20%) — master получает 20% от прибыли, которую заработал follower. Расчёт через high-water mark: fee берётся только с новых прибылей, превышающих предыдущий пик.
Management Fee — фиксированная ежемесячная плата с follower (например, $10-50/месяц).
Платформенная комиссия — платформа удерживает 30-40% от fee master-трейдера.
High-water mark важен для честного расчёта: если follower потерял 10% и потом восстановил — performance fee берётся только когда портфель превысит предыдущий максимум.
Risk Controls для followers
Обязательные защитные механизмы:
- Max drawdown stop — автоматически прекращать копирование при просадке > N%
- Max position size — не более X% капитала в одну позицию
- Whitelist символов — копировать только определённые активы
- Pause/Resume — ручное управление копированием без отвязки от master
- Emergency close — закрыть все открытые копированные позиции одной кнопкой
Пользователь должен всегда иметь контроль над своим капиталом — это не опция, а требование любой серьёзной платформы.







