Что такое bracket-ордер и как работают OCO-заявки
Узнайте, как устроены bracket-ордера и механизм OCO. Разбираем принципы работы лимитных заявок на фиксацию прибыли и защитных стоп-ордеров при частичном исполнении сделок.
Bracket-ордер — это единая инструкция, которая отправляет три связанных ордера: ордер на вход и пару связанных ордеров на выход. Эта пара представляет собой OCO (one cancels the other — «один отменяет другой»). Лимитный ордер на фиксацию прибыли размещается выше цены входа, а защитный стоп-ордер — ниже; исполнение любого из них автоматически отменяет другой. По сути, bracket-ордер — это небольшая машина состояний, и большинство неожиданностей происходит в моменты перехода между этими состояниями.
Что такое bracket-ордер?
Представьте трейдера, который хочет купить 200 акций по цене около $50, закрыть позицию около $53 в случае успеха и выйти около $48,50, если сделка не пойдет по плану. Если оформлять это отдельными заявками, получится три ордера и рутинная работа: нужно отменить стоп-ордер в момент исполнения цели, иначе возникнет риск продать 200 акций дважды. Bracket-ордер объединяет эти намерения в одну заявку. Вход осуществляется обычным рыночным или лимитным ордером. Два ордера на выход являются его «потомками»: лимитный ордер для закрытия по цели и стоп-ордер или стоп-лимит для закрытия на уровне защиты.
Терминология может различаться. Bracket, привязанный ордер (attached order), OCO-bracket и OTOCO — все эти термины описывают одну и ту же структуру. OTOCO (one triggers a one-cancels-the-other — «один активирует пару, где один отменяет другой») — наиболее точное название последовательности: вход активирует пару, а затем пара отменяет сама себя до одного ордера.
Что означает OCO в bracket-ордере?
OCO — это два активных ордера, связанных условием отмены. Оба находятся в книге заявок одновременно. Когда один исполняется, другой снимается. Если один исполняется частично, объем другого уменьшается на величину исполненного количества, а не снимается полностью; именно это позволяет поддерживать соответствие позиции и защиты акция к акции.
Полная последовательность для bracket-ордера на покупку 200 акций выглядит так:
- Ордер на вход работает самостоятельно. Цель и стоп существуют в системе брокера, но не являются активными ордерами, поэтому сделка по цене цели при неисполненном входе ничего не меняет.
- Вход исполняется на 200 акций. Оба «потомка» активируются, каждый на 200 акций.
- Торги достигают стоп-цены. Стоп превращается в активный ордер на продажу и поступает в книгу заявок.
- Стоп исполняется на 120 акций, прежде чем рынок уходит в другую сторону. Лимитный ордер на цель уменьшается с 200 до 80, соответствуя оставшейся позиции.
- Оставшиеся 80 акций исполняются по цене цели позднее в ходе сессии. Оставшиеся 80 акций стоп-ордера отменяются, и bracket-ордер закрывается.
Частичное исполнение входа — это момент, где подходы платформ наиболее сильно расходятся. Некоторые брокеры сразу активируют «потомков» на исполненный объем и увеличивают их по мере завершения входа. Другие ждут полного исполнения входа, что оставляет позицию без защиты в этот промежуток времени. Семантика у разных брокеров различается не только косметически: важно, активируются ли «потомки» при частичном исполнении входа и не нарушает ли редактирование одного из них связь отмены с другим.
На каком расстоянии друг от друга находятся уровни?
Оба уровня должны находиться за пределами рыночного шума конкретного актива в обычный день, но внутри диапазона, который он реально может пройти. Дневной диапазон — это первый грубый показатель. В таблице ниже приведены шесть известных компаний за последний год: медианный диапазон от максимума до минимума в процентах от цены открытия и медианное абсолютное изменение от открытия до закрытия.
Точный SQL-код для каждого числа
SELECT
ticker,
round(quantileDeterministic(0.5)(
(toFloat64(high) - toFloat64(low)) / toFloat64(open) * 100,
toUInt32(date)), 2) AS median_range_pct,
round(quantileDeterministic(0.5)(
abs(toFloat64(close) - toFloat64(open)) / toFloat64(open) * 100,
toUInt32(date)), 2) AS median_open_to_close_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'JNJ')
AND date >= today() - 370
AND date < today() - 2
GROUP BY ticker
ORDER BY median_range_pct DESCNVDA имеет самый широкий типичный диапазон сессии из шести представленных — 2.72%, а SPY — самый узкий, 0.86%. Обратите внимание, насколько второй столбец меньше первого в каждой строке. Типичный актив проходит за сессию значительно больше, чем составляет чистая разница между открытием и закрытием, и оба уровня bracket-ордера находятся внутри этого движения. Цель и стоп могут быть достижимы в один и тот же обычный день.
Как часто срабатывают уровни bracket-ордера?
Расстояние от входа — это параметр, который трейдер контролирует напрямую. В следующей таблице вопрос рассматривается на примере трех лет сессий SPY: для заданных расстояний от цены открытия показано, какая доля сессий достигала этого уровня вниз и какая — вверх в какой-либо момент дня.
Точный SQL-код для каждого числа
SELECT
concat(toString(d.dist), '%') AS distance_from_open,
round(100 * countIf(
(toFloat64(a.open) - toFloat64(a.low)) / toFloat64(a.open) * 100 >= d.dist
) / count(), 1) AS reached_below_pct,
round(100 * countIf(
(toFloat64(a.high) - toFloat64(a.open)) / toFloat64(a.open) * 100 >= d.dist
) / count(), 1) AS reached_above_pct
FROM global_markets.stocks_daily_aggs AS a
CROSS JOIN
(
SELECT arrayJoin([0.25, 0.5, 1.0, 1.5, 2.0, 3.0]) AS dist
) AS d
WHERE a.ticker = 'SPY'
AND a.date >= '2023-08-01'
AND a.date < '2026-08-01'
GROUP BY d.dist
ORDER BY d.distНа расстоянии четверти процента от открытия 62.3% сессий торговались настолько низко в какой-то момент, и 64.7% торговались настолько высоко. При увеличении расстояния до 3% показатель для нижней границы падает до 0.5%. Обе кривые снижаются синхронно, что и создает основное напряжение при выборе размеров bracket-ордера. Слишком близкий стоп выбивает на незначительных колебаниях. Слишком далекая цель почти всегда остается неисполненной.
Всегда ли стоп-лосс исполняется по стоп-цене?
Нет. Стоп — это инструкция отправить ордер, как только будет зафиксирована цена триггера. Обычный стоп отправляет рыночный ордер, и исполнение происходит по той цене, которая есть в книге заявок в этот момент. Стоп-лимит отправляет лимитный ордер по заданной вами цене, что защищает цену, но несет риск отсутствия исполнения. Этот компромисс — тема статьи стоп-ордер против стоп-лимита.
Ночной гэп — самый наглядный пример. Защитный стоп остается активным в часы, когда биржа закрыта, и цена открытия может оказаться далеко за пределами триггера. Десять примеров по AAPL за три с половиной года:
Точный SQL-код для каждого числа
SELECT
formatDateTime(session_date, '%b %e, %Y') AS gap_label,
round((day_open / prev_close - 1) * 100, 2) AS overnight_gap_pct
FROM
(
SELECT
session_date,
day_open,
lagInFrame(day_close) OVER (
ORDER BY session_date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
) AS prev_close
FROM
(
SELECT
date AS session_date,
toFloat64(any(open)) AS day_open,
toFloat64(any(close)) AS day_close
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'AAPL'
AND date >= '2023-01-01'
AND date < '2026-07-01'
GROUP BY date
)
)
WHERE prev_close > 0
ORDER BY overnight_gap_pct ASC
LIMIT 10Самый большой из них составил -9.45% на Aug 5, 2024, а десятый в списке — -2.96%. Защитный стоп, размещенный внутри этих гэпов, конвертировался по цене открытия, а не по цене триггера. Расчет параметров bracket-ордера только на основе внутридневного диапазона оставляет этот риск неучтенным.
Где физически находится связь OCO?
Почти никогда на бирже. Связь отмены между двумя «потомками» хранится в системе управления ордерами брокера или на уровень выше — в торговой платформе, запущенной на вашем компьютере. Биржа видит два обычных, никак не связанных ордера.
От места размещения зависит, что произойдет при сбое. Bracket-ордер на стороне брокера продолжает работать, когда ноутбук выключен, так как серверы брокера удерживают оба уровня и логику отмены. Bracket-ордер на стороне платформы (реализованный в некоторых приложениях для графиков локально) требует, чтобы приложение было запущено и подключено. Некоторые платформы удерживают симулированный стоп, который существует только в локальной памяти до срабатывания триггера. Закроете ноутбук — и стоп не будет отправлен.
Тот же вопрос касается вашего собственного кода. Стоп, который живет только внутри запущенного процесса, не оставляет ничего в книге заявок после остановки процесса. Автоматические выключатели для торговых ботов описывают паттерн для автоматизированных систем: исходите из того, что процесс может завершиться в самый неподходящий момент, и проверяйте, что остается активным у брокера.
Время действия (time in force) применяется к каждому уровню
Каждый уровень имеет свою настройку времени действия. Вход с параметром «день» (day) в паре с «потомками» GTC (good till cancelled — до отмены) — распространенная и неудобная комбинация: вход истекает при закрытии, а «потомки» так и не активируются, оставляя bracket-ордер, который на следующее утро просто бездействует. Обратная комбинация оставляет защиту, которая истекает в 16:00 по восточному времени для позиции, перенесенной через ночь.
В нерабочие часы характер книги заявок меняется. В таблице ниже минутные бары SPY сгруппированы по времени (ET) в течение дня, и для каждого получаса указаны две величины: средний размер минутного движения в базисных пунктах (один базисный пункт — сотая доля процента) и медианный объем за минуту.
Точный SQL-код для каждого числа
SELECT
formatDateTime(
toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
'%H:%i') AS et_time,
round(avg(abs(toFloat64(close) - toFloat64(open)) / toFloat64(open) * 10000), 1) AS avg_move_bps,
round(quantileDeterministic(0.5)(toFloat64(volume), toUInt64(window_start)), 0) AS median_volume
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= today() - 120
AND window_start < today() - 2
GROUP BY et_time
ORDER BY et_timeТаблица содержит 32 получасовых интервалов, от 04:00 до 19:30 ET. Читая слева направо, можно увидеть динамику. Обе серии находятся около минимумов в предторговые часы, резко растут к открытию в 09:30 и падают после 16:00. GTC-стоп, размещенный в 5 утра, находится в «тонкой» части кривой, и исполнение рыночного стопа в такой книге может произойти далеко от цены триггера.
Часто задаваемые вопросы
В чем разница между bracket-ордером и OCO-ордером?
OCO — это сама пара: два ордера с условием отмены, где исполнение одного удаляет другой. Bracket — это ордер на вход с привязанной парой OCO, причем пара активируется только после исполнения входа. Каждый bracket содержит OCO. Многие используют пары OCO отдельно.
Работает ли bracket-ордер, если мой компьютер выключен?
Зависит от того, где находится связь. Bracket-ордер на стороне брокера хранится на серверах брокера и продолжает работать при выключенной платформе. Bracket-ордер на стороне платформы или симулированный ордер требует запущенного и подключенного приложения; без него «потомки» могут не попасть на рынок.
Что произойдет со стопом, если цель по прибыли исполнится частично?
Стоп уменьшается на исполненное количество, а не отменяется. Если цель на 200 акций исполнена на 60, стоп уменьшается до 140 акций, соответствуя открытой позиции. Отмена происходит только тогда, когда закрывается последняя часть позиции.
Можно ли использовать bracket-ордер на премаркете или после закрытия торгов?
Поведение зависит от брокера; многие маршрутизируют «потомков» bracket-ордера только в основные торговые часы. Стоп-ордера часто отклоняются или удерживаются вне интервала с 09:30 до 16:00 ET для акций США. Настройка времени действия на каждом уровне определяет, доступен ли этот уровень для расширенной сессии.
Знают ли биржи, что мои два ордера связаны?
Нет. В акциях США связь отмены удерживается брокером или платформой, а биржа получает два независимых ордера. Сообщение об отмене для выжившего ордера отправляется той системой, которая удерживает связь, после того как другой ордер сообщает об исполнении.
Каждая таблица здесь сопровождается точным SQL-запросом. Чтобы измерить диапазон и риск гэпа для интересующего вас актива, задайте вопрос на обычном английском языке в терминале Strasmore.