Development системы лимитов (max position, max daily loss) для бота
Система лимитов — это guardrails торгового бота. Без лимитов единственная ошибка в коде стратегии или неожиданное рыночное движение могут обнулить счёт. Лимиты превращают потенциально катастрофическое событие в контролируемый убыток.
Типология лимитов
Позиционные лимиты
Max position size per instrument: максимальный размер позиции по одному инструменту. Абсолютное значение (например, 0.5 BTC) или процент от портфеля (5%).
Max total exposure: суммарная экспозиция по всем открытым позициям. Ограничивает общий leverage.
Max positions count: количество одновременно открытых позиций. Защита от стратегии, которая начала открывать позиции во всех инструментах сразу.
Concentration limit: максимальная доля капитала в одном активе. Если 3 разных позиции все коррелируют с BTC — их суммарный вес не должен превышать X%.
Потери и P&L лимиты
Max daily loss: максимальный убыток за торговый день. При достижении — остановка до следующего дня. Стандарт для профессиональных трейдеров: 2-5% от счёта.
Max weekly/monthly loss: аналогично для более длинных периодов.
Max drawdown: максимальная просадка от исторического пика. При достижении — пауза и ревью стратегии.
Per-trade max loss: максимальный убыток по одной сделке. Если стоп-лосс не сработал и позиция ушла дальше — принудительное закрытие.
Операционные лимиты
Max orders per minute: защита от случайного flood биржевого API.
Max order size: максимальный размер одного ордера (защита от ошибки в расчёте размера позиции).
Реализация: pre-trade checks
Проверки лимитов должны выполняться до отправки ордера, а не после:
def validate_order(order, portfolio_state, limits):
# Check position size
current_pos = portfolio_state.get_position(order.symbol)
new_pos_size = current_pos.size + order.quantity
if new_pos_size > limits.max_position_size[order.symbol]:
raise LimitViolation("MAX_POSITION_SIZE", ...)
# Check daily loss
if portfolio_state.daily_pnl < -limits.max_daily_loss:
raise LimitViolation("DAILY_LOSS_LIMIT", ...)
# Check total exposure
new_exposure = portfolio_state.total_exposure + order.notional_value
if new_exposure > limits.max_total_exposure:
raise LimitViolation("MAX_EXPOSURE", ...)
return True
Pre-trade validation — синхронная, быстрая (< 1ms), происходит в том же потоке что и генерация сигнала.
Динамические лимиты
Статические лимиты — хорошо, но рынок меняется. Динамические лимиты адаптируются к условиям:
Volatility-adjusted position sizing: при высоком VIX или ATR — уменьшать размер позиций автоматически. Такой же expected dollar risk при разной волатильности.
Time-of-day limits: снижать лимиты в часы низкой ликвидности (ночь по Asian session для European markets).
Drawdown-adjusted: по мере роста просадки — постепенно снижать лимиты. Это Kelly-inspired подход: чем меньше капитал, тем меньше абсолютные ставки.
Мониторинг и алертинг по лимитам
Оператор должен видеть текущую «загрузку» лимитов в реальном времени:
| Лимит | Максимум | Текущее | % использования |
|---|---|---|---|
| Daily loss | $5,000 | $1,230 | 24.6% |
| Max exposure | $50,000 | $31,500 | 63.0% |
| BTC position | 1.0 BTC | 0.45 BTC | 45.0% |
При достижении 80% лимита — предупреждение. При достижении 100% — действие (пауза/остановка) + алерт.
Система лимитов — относительно простой компонент в реализации (2-4 недели), но с высочайшей ценностью для risk management.







