Расчёт объёма позиции: от стопа, а не от баланса
Самая полезная привычка в автоматической торговле — считать объём от расстояния до стопа. И это же то, что большинство ботов делает почти правильно, а потом отдаёт комиссиям.
Инженеры Vizanix · об авторе
- РАЗДЕЛ
- Архитектура ботов
- ОПУБЛИКОВАНО
- 2026-08-28
- ГЛАВ
- 6
- ЧИТАТЬ ДАЛЬШЕ
- 3
- ЯЗЫК
- написано на русском
Решить, каким должен быть объём позиции, можно двумя способами. Можно выбрать номинал — «торговать на 5% счёта» — или выбрать убыток — «рисковать 1% при срабатывании стопа» — и вывести номинал из того, где стоит стоп. Постоянный риск между инструментами даёт только второй.
Базовая формула
Риск в деньгах, делённый на расстояние до стопа, даёт количество:
risk_usd = equity * risk_pct / 100
distance = abs(entry - stop)
qty = risk_usd / distance
notional = qty * entryУзкий стоп даёт большую позицию, широкий — маленькую. Эта инверсия и есть весь смысл: волатильный инструмент и спокойный несут одинаковые деньги под риском. Наш калькулятор размера позиции делает ровно это, а калькулятор стопа по ATR показывает вариант с масштабированием по волатильности.
Дальше комиссии съедают предпосылку
Формула выше утверждает, что при срабатывании стопа вы теряете ровно risk_usd. Не теряете. Вы ещё платите комиссию на входе и на выходе, а стоп — это обычно taker-выход.
Поправка мала в процентах и велика в сумме. Заложите комиссию в расстояние, а не обнаруживайте её в P&L:
# Фактический убыток при выбитом стопе = ход цены + комиссия входа + комиссия выхода.
fee_in = maker_rate if entry_is_limit else taker_rate
fee_out = taker_rate # стоп — это taker-выход
cost_pct = (fee_in + fee_out) / 100
effective_distance = distance + entry * cost_pct
qty = risk_usd / effective_distanceЧем уже стоп, тем сильнее влияет комиссия. При расстоянии до стопа в 0,3% на площадке с taker-комиссией 0,055% комиссии составляют треть задуманного риска. Именно поэтому скальпинговые стратегии, прибыльные в бэктесте, так часто прибыльными не оказываются — см. калькулятор безубытка.
Маржа тоже резервируется с комиссиями
На площадке с плечом есть вторая поправка. Биржа держит начальную маржу плюс комиссию по номиналу, поэтому максимальная позиция, которую выдерживает баланс, — примерно свободные / (1 + плечо × ставка), а не свободные × плечо.
На 10× этот потолок около 99% свободных средств, на 50× ближе к 96%. Бот, считающий ровно на 100%, получает отказ именно на тех ордерах, которые его больше всего интересовали.
Потом биржа вас округляет
Какое бы количество вы ни посчитали, площадка примет только кратное qtyStep, не ниже minOrderQty и не ниже minNotionalValue. Порядок операций важен:
- Округлить количество вниз до
qtyStep. Округление вверх может пробить маржу. - Проверить
minOrderQtyпосле округления. - Проверить
minNotionalValueпосле округления — округление вниз может увести под него. - Если результат ниже минимума — отказаться от сделки. Не округлять вверх ради прохождения: это молча берёт больше риска, чем разрешала стратегия.
А потом баланс всё равно уезжает
Даже когда всё вышеперечисленное сделано верно, площадка может ответить 110004 недостаточно средств. Другая позиция сдвинулась. Рассчитался фандинг. Второй процесс забрал маржу. Баланс, прочитанный мгновение назад, — уже история.
Наш исполнитель обрабатывает это лестницей повторов, а не отказом: прочитать свежий остаток, ужать объём, переставить — до пяти попыток, останавливаясь на минимальном лоте биржи. Отклонённый сигнал превращается в позицию поменьше, а это почти всегда то, что выбрал бы оператор.
Что выводить наружу
Какой бы ни была логика расчёта, сделайте её входные данные видимыми в журнале аудита: использованное эквити, процент риска, расстояние до стопа, допущение по комиссии, количество до округления, после округления и все повторы. Когда позиция окажется не того размера, которого ждали, — а она окажется, — эта запись есть разница между ответом за пять минут и потраченным днём.
Статья описывает инженерную практику. Это не инвестиционная рекомендация. Vizanix разрабатывает программное обеспечение и не обещает торговую доходность.