> Что значит исключить проскальзывание цены и как это реализовать (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Автомакон

Стек: Go

> Пример ответа

Короткий ответ

Исключить проскальзывание цены - значит гарантировать, что сделка исполнится ровно по той цене, которую ожидал пользователь, без отклонений в худшую сторону. В контексте backend это обычно реализуется через механизм лимитных ордеров, проверку актуальности цены на момент исполнения, блокировку средств и атомарные операции в БД. Полностью исключить проскальзывание невозможно на волатильном рынке, но можно минимизировать через фиксацию цены на короткий интервал и отмену сделки при превышении допустимого отклонения.

Подробное объяснение

Проскальзывание (slippage) возникает, когда между моментом запроса цены и фактическим исполнением сделки рыночная цена меняется. Для backend-системы это означает, что пользователь видит одну цену, а ордер исполняется по другой. Исключить проскальзывание можно двумя подходами:

  1. Лимитные ордера - сделка исполняется только по указанной цене или лучше. Если рынок ушёл, ордер не исполняется вовсе. Это жёсткое исключение, но может привести к неисполнению.

  2. Протекция от проскальзывания - разрешено исполнение в пределах заданного процента или абсолютной величины от ожидаемой цены. Если отклонение превышает порог, сделка отменяется. Это гибкий подход, который используют биржи и DeFi-протоколы.

Реализация на backend включает:

  • фиксацию цены на момент создания ордера (snapshot или ссылка на последний тик);
  • проверку текущей цены в момент исполнения через торговый движок или внешний источник;
  • атомарность - блокировка средств и исполнение должны быть в одной транзакции, чтобы не было гонок;
  • таймауты - если цена не подтверждается за N миллисекунд, ордер отклоняется.

В Go это часто делается через паттерн "check-then-act" с использованием мьютексов или атомарных операций, а также через очереди сообщений для сериализации ордеров.

На практике

В реальной системе процесс выглядит так:

  1. Пользователь отправляет запрос на покупку по цене X.
  2. Backend проверяет текущую цену из кэша или торгового движка.
  3. Если цена отличается от X более чем на допустимый порог (например, 0.5%), запрос отклоняется.
  4. Если цена в пределах порога, средства блокируются, и ордер ставится в очередь исполнения.
  5. Исполнение происходит через атомарную операцию: списание средств и зачисление актива в одной транзакции БД.
  6. Если за время обработки цена ушла за порог, ордер отменяется, средства разблокируются.

Для высоконагруженных систем важно использовать in-memory кэш цен с коротким TTL и распределённую блокировку, чтобы избежать двойного исполнения.

Пример кода

GO
type Order struct {
ID string
Price float64
Slippage float64 // допустимое отклонение в процентах
Amount float64
}
func ExecuteOrder(ctx context.Context, order Order, currentPrice float64) error {
maxPrice := order.Price * (1 + order.Slippage/100)
minPrice := order.Price * (1 - order.Slippage/100)
if currentPrice > maxPrice || currentPrice < minPrice {
return ErrSlippageExceeded
}
// атомарная операция в БД
return db.WithTx(ctx, func(tx *sql.Tx) error {
// блокировка средств
if err := lockFunds(tx, order); err != nil {
return err
}
// исполнение сделки
return executeTrade(tx, order, currentPrice)
})
}

Как отвечать на собеседовании

Начни с чёткого определения проскальзывания и его причин. Затем раздели подходы: лимитные ордера и протекция с порогом. Подчеркни, что полное исключение невозможно, но можно гарантировать отмену при отклонении. Обязательно упомяни атомарность и гонки данных - это ключевой момент для backend. Если спросят про Go, расскажи про мьютексы, атомарные операции и транзакции. Приведи пример с порогом проскальзывания, как в коде выше. Не углубляйся в финансовую теорию, фокусируйся на инженерной стороне.

Что проверяет интервьюер

Интервьюер оценивает:

  • понимание проблемы проскальзывания и её причин;
  • умение различать лимитные ордера и протекцию;
  • знание конкурентных паттернов в Go (атомарность, блокировки);
  • способность проектировать надёжные операции с деньгами;
  • понимание trade-off между гарантией цены и вероятностью исполнения.

Типичные ошибки

  • Утверждение, что проскальзывание можно исключить полностью - это неверно, можно только ограничить.
  • Игнорирование гонок данных при проверке цены и исполнении.
  • Отсутствие упоминания атомарности транзакций.
  • Смешивание понятий "лимитный ордер" и "протекция от проскальзывания".
  • Предложение использовать только рыночные ордера без защиты - это прямой путь к проскальзыванию.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью