Разработка системы аварийного закрытия всех позиций торгового бота

Разработка системы аварийного закрытия всех позиций бота «Закрыть всё» — самая простая функция с виду и одна из самых важных. В момент кризиса, когда основной движок может зависнуть или UI перестать отвечать, эта кнопка должна сработать мгновенно. Промедление в 30 секунд при flash crash способно

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1004
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1011

Разработка системы аварийного закрытия всех позиций бота

«Закрыть всё» — самая простая функция с виду и одна из самых важных. В момент кризиса, когда основной движок может зависнуть или UI перестать отвечать, эта кнопка должна сработать мгновенно. Промедление в 30 секунд при flash crash способно уничтожить 5–10% портфеля. Мы проектируем такие механизмы более 5 лет и внедрили их для 15+ проектов, включая высоконагруженные DeFi-протоколы и CEX-боты с сотнями позиций.

В одном из проектов во время резкого падения ETH движок бота завис из-за ошибки в скрипте расчёта маржи. Emergency close, реализованный как отдельный сервис на asyncio, закрыл 25 позиций за 2 секунды через параллельные ордера — потери составили менее 0.5% вместо потенциальных 12%. Этот кейс показывает, почему изоляция code path критична.

Как мы строим систему аварийного закрытия?

Каждый компонент проектируется с учётом отказа. Вот ключевые требования:

Скорость: emergency close должен завершаться за секунды, не минуты. Достигается параллельным закрытием всех позиций одновременно через asyncio.gather, а не последовательным циклом.

Надёжность: работает даже если основной торговый цикл завис или UI недоступен. Это отдельный, максимально простой code path без зависимостей от основного engine — только HTTP-клиент к бирже.

Подтверждение: каждая позиция должна быть подтверждена как закрытая. Если ордер не исполнился — повтор с exponential backoff. Не останавливаться, пока все позиции не закрыты или не достигнут timeout с алертом в Telegram.

Идемпотентность: если кнопка нажата дважды — не отправляем двойные ордера. Используем Redis для хранения состояния операции: при повторном вызове проверяем, active close уже идёт, и возвращаем текущий статус.

Алгоритм исполнения

1. Получить список всех открытых позиций (REST snapshot) 2. Для каждой позиции параллельно: a. Разместить market order противоположной стороны b. Подождать confirmation fill c. Если timeout — проверить статус, повторить при необходимости 3. Через N секунд сделать reconciliation: - Запросить текущие позиции с биржи - Если что-то осталось открытым — повторить для них 4. Отправить итоговый отчёт: что закрыто, по каким ценам, итоговый P&L 

Проблема ликвидности при экстренном закрытии

Экстренное закрытие обычно происходит в моменты высокой волатильности — именно тогда ликвидность снижается. Market order на большую позицию может дать катастрофический slippage. Решение: для крупных позиций — TWAP execution даже при emergency (разбить на несколько ордеров за 30–60 секунд). Для небольших — чистый market order. Пороговый размер настраивается в конфигурации.

Сравнение TWAP и прямого Market order

Параметр TWAP execution Market order
Время закрытия крупной позиции 30–60 секунд <1 секунды
Риск slippage Минимальный (≤1%) Высокий (до 5–15%)
Надёжность при нулевой ликвидности Высокая (ордера частично исполняются) Низкая (может не исполниться)
Рекомендуемый размер позиции >$10k <$10k

Что делать, если ликвидность упала до нуля?

В таких случаях чистый market order может исполниться по худшей цене стакана. Мы добавляем fallback: если спред превышает 5%, система переключается на лимитный ордер с агрессивной ценой (лучший bid/ask) и повторяет попытку каждые 2 секунды. Это защищает от проскальзывания при сохранении шанса закрыть позицию.

Сравнение подходов к выполнению emergency close

Параметр Последовательное закрытие Параллельное закрытие
Время выполнения ~10–30 секунд ~1–3 секунды
Риск slippage Выше из-за задержек Ниже благодаря синхронности
Надёжность Зависит от последовательности Выше, каждый ордер независим
Сложность реализации Низкая Средняя (требует асинхронности)

Параллельное закрытие в 3–5 раз быстрее последовательного при 10+ позициях.

Почему важно тестировать emergency close регулярно?

Система аварийного закрытия — это safety feature, которая нужна редко, но должна работать безотказно когда нужна. Регулярно тестируйте её в paper trading режиме с симуляцией flash crash. Мы включаем в поставку автоматизированные тесты, использующие исторические данные кризисов и эмуляцию network issues. Гарантируем, что после нашего внедрения вы сможете спать спокойно.

Процесс внедрения

Этап Длительность Результат
Анализ архитектуры бота 1–2 дня Техническое задание и оценка
Проектирование code path 1 день Документ с алгоритмом и fallback
Разработка на Python (asyncio) или Solidity 3–5 дней Готовый модуль emergency close
Интеграция с биржей и настройка TWAP 1–2 дня Рабочий прототип
Тестирование на исторических данных 2 дня Отчёт с симуляциями
Деплой и двухчасовая поддержка 1 день Система в production

Что входит в работу?

  • Полная архитектура и код emergency close (отдельный сервис или integrated module)
  • Реализация parallel execution с asyncio/aiohttp или аналогичным стеком
  • Настройка TWAP execution для крупных позиций
  • Reconciliation и алерты при сбоях
  • Документация (описание алгоритма, конфигурация, инструкция по тестированию)
  • Поддержка 2 часа после деплоя

Закажите оценку проекта — мы проанализируем ваш стек и предложим оптимальное решение за один рабочий день. Свяжитесь с нами, чтобы обсудить детали.