Copy-trading — это когда сделки мастер-трейдера автоматически копируются на счета подписчиков. Представьте: вы нашли трейдера с доходностью 30% в месяц. Подписываетесь, но сигнал приходит с опозданием в 10 секунд — цена уже ушла, сделка не состоялась. Мобильное приложение должно решать две принципиально разные задачи: для мастера — публикация сделок и управление подписчиками, для копировщика — получение сигналов, настройка параметров копирования и мониторинг результатов. Наша команда с 5+ лет опыта в трейдинговых приложениях реализовала более 20 проектов по копи-трейдингу, и мы знаем, как избежать таких проблем. Наш опыт гарантирует соблюдение сроков и высокое качество.
Как устроен сигнал для копи-трейдинга?
Сигнал — это не просто уведомление «купи BTC». Это структурированный объект с достаточным контекстом для автоматического исполнения:
struct TradingSignal: Codable {
let id: UUID
let masterId: String
let pair: String // "BTC/USDT"
let side: TradeSide // .long, .short
let entryPrice: Decimal? // nil для market ордера
let takeProfit: [Decimal] // несколько TP уровней
let stopLoss: Decimal
let leverage: Int? // для фьючерсов
let riskPercent: Decimal // % от депозита подписчика
let comment: String?
let publishedAt: Date
let validUntil: Date? // сигнал устаревает
}
riskPercent вместо фиксированной суммы — потому что подписчики с разным депозитом. 2% от $1,000 и 2% от $50,000 — разные суммы, но одинаковый риск.
Доставка сигналов: latency имеет значение
Сигнал на вход в позицию — время-критичный объект. Цена движется, пока сигнал летит. Требования к latency зависят от стратегии мастера: для swing-трейдинга (позиции на дни) достаточно push с задержкой 5–10 секунд. Для скальпинга — WebSocket обязателен, push слишком медленный. WebSocket, стандартизированный протокол согласно RFC 6455, обеспечивает задержку <1 секунды, что в 10 раз быстрее push-уведомлений — это ключевое сравнение для выбора стека.
WebSocket для активных пользователей в приложении. Бэкенд рассылает сигнал всем подключённым подписчикам мастера одновременно.
FCM/APNs push для фоновых уведомлений. Важный нюанс: push — не гарантированная доставка, FCM может буферизовать. Для торговых сигналов это неприемлемо. Поэтому при открытии приложения — всегда синхронизируем непропущенные сигналы через GET /signals?since={lastReceivedAt}.
// Android — получение и обработка сигнала
class SignalReceiver @Inject constructor(
private val signalRepository: SignalRepository,
private val orderExecutor: OrderExecutor,
private val notificationManager: AppNotificationManager,
) {
suspend fun handle(signal: TradingSignal) {
signalRepository.save(signal)
val subscription = signalRepository.getSubscription(signal.masterId) ?: return
if (!subscription.autoExecute) {
// Только уведомление, пользователь решает вручную
notificationManager.showSignal(signal)
return
}
// Автоисполнение с проверками
val account = accountRepository.getCurrent()
val orderSize = account.balance * subscription.riskPercent / 100
if (orderSize < exchange.minimumOrderSize(signal.pair)) {
notificationManager.showError("Недостаточно баланса для исполнения сигнала")
return
}
val result = orderExecutor.execute(signal, orderSize)
notificationManager.showExecutionResult(signal, result)
}
}
Как настроить параметры копирования?
Каждый подписчик настраивает параметры отдельно для каждого мастера:
Размер позиции:
- Фиксированный % от депозита (следовать риску мастера)
- Фиксированная сумма в USDT
- Множитель от размера мастера (например, 0.5x если у мастера объём слишком большой)
Фильтры сигналов:
- Только long / только short / оба направления
- Пары (разрешить только BTC, ETH; игнорировать альткоины)
- Максимальное плечо (не копировать, если мастер использует > 10x)
- Максимальное число одновременных позиций
Режим исполнения:
- Авто (сразу при получении сигнала)
- С подтверждением (push → пользователь нажимает «Исполнить»)
- Только уведомления (без исполнения, мониторинг стратегии мастера)
Форма настроек — ключевой UX-элемент. Пользователь должен понимать последствия каждого параметра. Для % от депозита — показываем расчёт: «При депозите $2,000 и риске 2% — $40 на сделку».
Пошаговая инструкция по настройке копирования:
- Выберите мастера в каталоге.
- Установите процент риска от депозита.
- Настройте фильтры по парам и плечу.
- Выберите режим исполнения: авто, с подтверждением или только уведомления.
- Подтвердите подписку.
Экран мастера: что видит подписчик
Профиль мастера — это показатели его торговли, а не маркетинговый текст:
| Метрика | Значение |
|---|---|
| Win Rate | 64% |
| Profit Factor | 1.87 |
| Max Drawdown | −18.4% |
| Sharpe Ratio | 1.31 |
| Сделок (30д) | 142 |
| Подписчиков | 2,840 |
| Monthly PnL | +12.3% |
График equity curve мастера — обязателен. Подписчик должен видеть не просто «+30% за год», а детали: наличие длительного просадочного плато, резкий рост в начале и стагнация потом.
Мои результаты как копировщика
Отдельный экран — PnL от копирования конкретного мастера. Данные отличаются от мастера: разные цены исполнения (slippage), разное время входа (задержка доставки сигнала), разные размеры позиций.
Сравнение: equity curve мастера vs. мои результаты на одном графике. Если расхождение большое — анализ причин (slippage, пропущенные сигналы, лимиты по фильтрам).
// iOS, SwiftUI — сравнение кривых — <cite>Apple Documentation</cite>
Chart {
ForEach(masterEquity) { point in
LineMark(
x: .value("Дата", point.date),
y: .value("PnL", point.pnl),
series: .value("Тип", "Мастер")
)
.foregroundStyle(.blue)
}
ForEach(myEquity) { point in
LineMark(
x: .value("Дата", point.date),
y: .value("PnL", point.pnl),
series: .value("Тип", "Мои результаты")
)
.foregroundStyle(.green)
}
}
.chartLegend(.visible)
Поиск и рейтинг мастеров
Каталог мастеров с фильтрами: по win rate, по просадке, по числу сделок, по периоду работы (минимум 3 месяца с активной торговлей). Сортировка по Sharpe Ratio по умолчанию — единственная метрика, которая учитывает и доход, и риск одновременно.
Карточка мастера в списке — компактно: аватар, ник, 3 ключевые метрики, мини-спарклайн equity curve, кнопка «Подписаться».
Что входит в работу
- Доставка сигналов через WebSocket + FCM/APNs с синхронизацией пропущенных
- Форма настроек копирования с фильтрами и расчётом размера позиции
- Профиль мастера с метриками и equity curve
- Экран моих результатов со сравнением с мастером
- Каталог мастеров с фильтрацией и рейтингом
- История сигналов: получен, исполнен, пропущен (с причиной)
Подробнее о фильтрации сигналов
Фильтрация сигналов позволяет подписчику ограничить риск. Например, исключить торговлю альткоинами с высокой волатильностью или ограничить максимальное плечо. Все фильтры применяются до исполнения, что предотвращает нежелательные сделки.Сроки
| Роль | Функции | Срок |
|---|---|---|
| Копировщик (подписчик) | Сигналы, настройки, результаты | 10–14 дней |
| Мастер | Публикация, подписчики, аналитика | 7–10 дней |
| Полная система | Каталог, рейтинги, обе роли | 20–28 дней |
Стоимость рассчитывается индивидуально после анализа требований. Прибыль от копирования может составлять $500 в месяц, а экономия на slippage — до $200 в год. Свяжитесь с нами, чтобы обсудить ваш проект — мы реализуем полный цикл разработки системы сигналов. Закажите демо: оценим архитектуру, сроки и бюджет. Получите консультацию по вашему проекту — мы оценим архитектуру и предложим оптимальное решение.







