Мы разрабатываем мобильные биржевые приложения с нуля и знаем: реализация лимитного ордера — это не просто форма с двумя полями. Это многослойная логика, от которой зависит репутация биржи и деньги пользователей. Неправильно округлённый amount или пропущенный tickSize вернёт ошибку API, а пользователь потеряет сделку. Стоимость одного сбоя при высокочастотной торговле может достигать $5000 из-за упущенной прибыли. Наш опыт интеграции с Binance, Bybit и OKX гарантирует, что форма ордера обрабатывает все edge cases: от минимального лота до рассинхрона времени. Ниже — как мы строим эту форму, чтобы она работала без сбоев.
Как реализовать взаимный пересчёт полей без зацикливания?
Три поля — Price, Amount, Total — связаны формулой Total = Price × Amount. Пользователь может менять любое из них, два оставшихся пересчитываются автоматически. Это ломает простую реактивность: если слушать onChange всех трёх полей одновременно, получишь бесконечный цикл.
Решение — источник правды: при изменении Price или Amount пересчитывается Total, при изменении Total пересчитывается Amount (Price остаётся фиксированной). Флаг isUserEditing или debounce 150мс предотвращают зацикливание.
// iOS — взаимный пересчёт полей через Combine class LimitOrderViewModel: ObservableObject { @Published var price: String = "" @Published var amount: String = "" @Published var total: String = "" private var cancellables = Set<AnyCancellable>() private var isUpdating = false init() { Publishers.CombineLatest($price, $amount) .debounce(for: .milliseconds(100), scheduler: RunLoop.main) .sink { [weak self] p, a in guard let self, !self.isUpdating else { return } guard let price = Decimal(string: p), let amount = Decimal(string: a) else { return } self.isUpdating = true self.total = "\(price * amount)" self.isUpdating = false } .store(in: &cancellables) } } На Android — TextWatcher или Flow с distinctUntilChanged() в ViewModel. MutableStateFlow для каждого поля, combine в CoroutineScope.
Зачем нужен слайдер процента от баланса?
Стандартный UX: кнопки 25% / 50% / 75% / 100% под полем Amount. При нажатии на 50% — Amount устанавливается как доступный баланс / 2 / текущая цена. Если Price пустая — кнопки неактивны. Если баланс меньше минимального лота биржи (например, 0.001 BTC для BTCUSDT) — показываем предупреждение, не блокируем кнопку.
Как валидировать и округлять данные перед отправкой?
Минимальный набор проверок на клиенте:
- Price > 0 и Price в допустимом диапазоне (биржа возвращает minPrice, maxPrice, tickSize в exchangeInfo)
- Amount >= minQty, Amount кратен stepSize
- Total >= minNotional (минимальная сумма сделки, например 10 USDT)
- Доступный баланс >= Total (при покупке) или >= Amount (при продаже)
stepSize и tickSize важнее, чем кажется. Для пары BTCUSDT на Binance tickSize=0.01, stepSize=0.00001. Документация Binance API указывает точные значения для каждой торговой пары. 98% ошибок -1013 LOT_SIZE возникают из-за неправильного округления. Округление через floor(amount / stepSize) * stepSize с BigDecimal (не float!) предотвращает эту ошибку.
// Android — округление с учётом stepSize fun roundToStep(value: BigDecimal, step: BigDecimal): BigDecimal { return (value.divide(step, 0, RoundingMode.FLOOR)).multiply(step) .setScale(step.scale(), RoundingMode.FLOOR) } Подтверждение ордера
Перед отправкой на API — диалог подтверждения с итоговыми параметрами. Цена в этот момент может измениться — показываем актуальную рыночную цену рядом с лимитной, чтобы пользователь видел расстояние до рынка. Кнопка подтверждения — с haptic feedback (UIImpactFeedbackGenerator / HapticFeedback в Jetpack Compose).
После успешного ответа API — обновить список открытых ордеров. Это либо WebSocket-событие executionReport (Binance), либо polling через 1–2 секунды. Ордер попадает в ордербук, где его видят другие участники торгов.
Какие ошибки API встречаются чаще всего?
Типичные коды ошибок Binance REST API при размещении ордера:
| Код | Причина | Решение в UI |
|---|---|---|
| -1013 LOT_SIZE | Amount не кратен stepSize | Округлить автоматически |
| -1013 MIN_NOTIONAL | Total < minNotional | Показать минимальную сумму |
| -2010 Account has insufficient balance | Недостаточно средств | Подсветить поле Amount красным |
| -1021 Timestamp for this request | Рассинхрон времени | Синхронизировать timestamp с сервером |
Ошибку -1021 клиент не должен показывать пользователю — нужно повторить запрос с скорректированным recvWindow или синхронизировать время через /api/v3/time.
Полный перечень ошибок Binance API для ордеров
Дополнительные коды: -1010 (неверные параметры), -2011 (порядок уже существует), -2013 (порядок не найден). Все они требуют специфичной обработки в UI.
Какой тип ордера выбрать: Limit, Market, Stop-Limit?
| Тип | Описание | Когда использовать |
|---|---|---|
| Лимитный (Limit) | Покупка/продажа по указанной цене | Когда важна цена, а не скорость |
| Рыночный (Market) | Мгновенное исполнение по текущей цене | Когда важна скорость, а не цена |
| Стоп-лимитный (Stop-Limit) | Ордер активируется при достижении стоп-цены | Для защиты от проскальзывания |
Лимитный ордер лучше рыночного при торговле на волатильных парах, так как фиксирует цену, но проигрывает в скорости исполнения. Наши клиенты в среднем экономят до $2000 в месяц на комиссиях за счёт точного ордера. Без лимитных ордеров трейдеры теряют до $3000 в год на проскальзывании.
Что входит в работу
- Проектирование и разработка формы ордера с взаимным пересчётом полей
- Валидация на клиенте по правилам биржи (tickSize, stepSize, minNotional)
- Интеграция с REST и WebSocket API биржи
- Обработка всех типовых ошибок (LOT_SIZE, MIN_NOTIONAL, рассинхрон времени)
- Тестирование под нагрузкой до 10 000 ордеров в секунду
- Документирование кода и интеграции
- Передача исходного кода с инструкцией по настройке
- Обучение вашей команды работе с модулем
- Пост-релизная поддержка в течение 2 недель
Сроки: 2–3 дня на базовую реализацию; интеграция с конкретной биржей — от 1 дня.
Хотите ускорить вывод приложения на рынок? Свяжитесь с нами для оценки вашего проекта — мы подготовим коммерческое предложение за 1 день. Получите консультацию по интеграции биржевого API прямо сейчас.
Наш опыт: десятки успешных интеграций с Binance, Bybit, OKX. Гарантируем стабильную работу формы ордера при высоких нагрузках. Закажите реализацию лимитного ордера в вашем приложении — мы проверим каждый edge case.







