Development системы аварийного закрытия всех позиций бота
«Закрыть всё» — самая простая функция с виду и одна из самых важных в реализации. В момент кризиса эта функция должна работать быстро и надёжно, даже если остальная система нестабильна. Промедление в 30 секунд при flash crash может стоить 5-10% портфеля.
Требования к системе
Скорость: emergency close должен завершаться за секунды, не минуты. Параллельное закрытие всех позиций одновременно, не последовательное.
Надёжность: работает даже если основной торговый цикл завис или завис UI. Это отдельный, максимально простой code path без зависимостей от основного engine.
Подтверждение: каждая позиция должна быть подтверждена как закрытая. Если ордер не исполнился — повторить. Не останавливаться, пока все позиции не закрыты или не достигнут timeout с alertom.
Идемпотентность: если кнопка нажата дважды — не отправлять двойные ордера. Проверка перед каждым ордером: позиция ещё открыта?
Алгоритм исполнения
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. Пороговый размер настраивается.
Система аварийного закрытия — это safety feature, которая нужна редко, но должна работать безотказно когда нужна. Регулярно тестируйте её в paper trading режиме.







