> Что значит исключить проскальзывание цены и как это реализовать (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Автомакон
Стек: Go
> Пример ответа
Исключить проскальзывание цены (slippage) означает гарантировать, что сделка исполнится ровно по той цене, которую ожидал пользователь, без отклонений вверх или вниз. На практике полное исключение невозможно из-за рыночной волатильности и задержек, но в контексте DeFi или биржевых API это достигается установкой жесткого лимита на цену исполнения.
В Go для реализации защиты от проскальзывания при работе с криптобиржами (например, Binance API) используется параметр price в лимитных ордерах и проверка stopPrice для стоп-лоссов. Пример для спотовой торговли:
GOtype OrderRequest struct {Symbol string `json:"symbol"`Side string `json:"side"` // BUY или SELLType string `json:"type"` // LIMITPrice float64 `json:"price"`Quantity float64 `json:"quantity"`Slippage float64 `json:"-"` // не передается в API}func PlaceLimitOrder(client *binance.Client, req OrderRequest) error {// Устанавливаем цену с учетом допустимого проскальзыванияif req.Side == "BUY" {// Для покупки: цена не выше (1 + slippage) от текущейreq.Price = math.Min(req.Price, currentPrice*(1+req.Slippage))} else {// Для продажи: цена не ниже (1 - slippage) от текущейreq.Price = math.Max(req.Price, currentPrice*(1-req.Slippage))}// Отправляем лимитный ордерorder, err := client.NewCreateOrderService().Symbol(req.Symbol).Side(binance.SideType(req.Side)).Type(binance.OrderTypeLimit).TimeInForce(binance.TimeInForceGTC).Price(fmt.Sprintf("%.8f", req.Price)).Quantity(fmt.Sprintf("%.8f", req.Quantity)).Do(context.Background())return err}
Ключевые моменты:
-
Используйте лимитные ордера вместо рыночных - они гарантируют цену, но не гарантируют исполнение.
-
Для рыночных ордеров применяйте параметр
slippageTolerance(например, в Uniswap V3 этоsqrtPriceLimitX96), который задает максимальное отклонение от текущей цены. -
В высоконагруженных системах добавляйте повторную проверку цены перед отправкой ордера через WebSocket-ленту.
Полностью исключить проскальзывание нельзя, но можно свести его к нулю для лимитных ордеров, которые исполняются строго по заданной цене.
> Похожие задачи по backend
В чем сложность работы с float в Go
За счет чего достигается параллелизм и кооперативность в Go
Почему нельзя было в момент сдачи платежки сразу прописывать текущий курс и передавать дальше
Где и как применялась Kafka
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью