Uitleg over bracket orders en OCO orders
Wat is een bracket order? Ontdek hoe de profit target en de protective stop als OCO samenwerken, wat de gevolgen zijn bij een partial fill en waar de koppeling plaatsvindt.
Een bracket order is één instructie die drie orders in een vaste onderlinge verhouding verstuurt: een entry, plus een gekoppeld exit-paar aan weerszijden daarvan. Dit paar is de OCO, een afkorting voor one cancels the other. Een profit-target limit bevindt zich boven de entry-prijs en een protective stop eronder; een uitvoering op een van beide poten annuleert automatisch de andere. Een bracket is in feite een kleine toestandsmachine, waarbij de meeste verrassingen zich voordoen in de momenten tussen de verschillende toestanden.
Wat is een bracket order?
Stelt u zich een trader voor die 200 aandelen wil kopen rond de $50, de positie wil sluiten rond de $53 als het plan slaagt, en wil uitstappen rond de $48,50 als dat niet zo is. Als losse tickets geschreven, zijn dit drie orders en een handmatige klus: annuleer de stop op het moment dat de target wordt uitgevoerd, anders riskeert u 200 aandelen dubbel te verkopen. Een bracket verpakt hetzelfde voornemen in één indiening. De entry is een gewone market order of limit order. De twee exits zijn de 'kinderen': een limit om te sluiten op de target, en een stop of stop limit order om te sluiten op het beschermende niveau.
De terminologie varieert. Bracket, attached order, OCO bracket en OTOCO beschrijven allemaal deze vorm. OTOCO, one triggers a one-cancels-the-other, is de meest letterlijke naam voor de reeks: de entry activeert het paar, waarna het paar zichzelf reduceert tot één order.
Wat betekent OCO in een bracket order?
Een OCO bestaat uit twee rustende orders met een annuleringskoppeling ertussen. Beide staan tegelijkertijd in het orderboek. Wanneer de ene wordt uitgevoerd, wordt de andere ingetrokken. Wanneer de ene gedeeltelijk wordt uitgevoerd, wordt de andere met de uitgevoerde hoeveelheid verminderd in plaats van direct ingetrokken; die vermindering zorgt ervoor dat de positie en de bescherming aandeel voor aandeel in balans blijven.
De volledige reeks voor een long bracket van 200 aandelen verloopt als volgt:
- De entry staat alleen open. De target en de stop bevinden zich in het systeem van de broker, maar zijn geen actieve orders; een print door de target-prijs terwijl de entry niet is uitgevoerd, doet dus niets.
- De entry wordt uitgevoerd voor 200 aandelen. Beide kinderen worden actief, elk voor 200 aandelen.
- De koers bereikt de stop-prijs. De stop wordt omgezet in een actieve verkooporder en komt in het orderboek terecht.
- De stop voert 120 aandelen uit voordat de markt weer beweegt. De target limit wordt verlaagd van 200 naar 80, passend bij de resterende positie.
- Die laatste 80 aandelen worden later in de sessie uitgevoerd op de target. De resterende 80 van de stop worden geannuleerd en de bracket wordt gesloten.
Bij gedeeltelijke uitvoeringen op de entry lopen platforms het meest uiteen. Sommige brokers activeren de kinderen direct voor de uitgevoerde hoeveelheid en schalen deze op naarmate de rest van de entry wordt voltooid. Andere wachten tot de entry volledig is uitgevoerd, wat de positie in de tussentijd onbeschermd laat. De semantiek verschilt per broker op manieren die niet louter cosmetisch zijn: of kinderen activeren bij een gedeeltelijke entry-uitvoering, en of het bewerken van het ene kind de annuleringskoppeling met het andere verbreekt.
Hoe ver liggen de twee poten uit elkaar?
Beide poten moeten buiten de ruis vallen die een aandeel op een normale dag vertoont, maar binnen de afstand die het daadwerkelijk kan afleggen. De dagelijkse range is de eerste ruwe maatstaf daarvoor. Het onderstaande paneel toont zes bekende namen over het afgelopen jaar: de mediane high-to-low range als percentage van de opening, naast de mediane absolute beweging van opening naar slot.
De exacte SQL achter elk getal
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 heeft de breedste typische sessie van de zes met 2.72%, en SPY de smalste met 0.86%. Merk op hoe ver de tweede kolom in elke rij onder de eerste ligt. Een typisch aandeel legt tijdens een sessie een stuk meer afstand af dan het netto resultaat van opening naar slot, en beide bracket-poten bevinden zich binnen die beweging. Een target en een stop kunnen op dezelfde normale dag beide bereikbaar zijn.
Hoe vaak wordt een bracket-poot aangeraakt?
De afstand tot de entry is de knop waar een trader daadwerkelijk controle over heeft. Het volgende paneel koppelt de vraag aan drie vaste jaren van SPY-sessies en vraagt, voor een reeks afstanden vanaf de openingsprint, welk deel van de sessies op enig moment die dag zo ver naar beneden en zo ver naar boven handelde.
De exacte SQL achter elk getal
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.distOp een kwart procent vanaf de opening handelde 62.3% van de sessies op enig moment zo ver naar beneden en 64.7% zo ver naar boven. Vergroot de afstand naar 3% en het neerwaartse cijfer daalt naar 0.5%. De twee curven vervallen samen, wat de kern vormt van de spanning bij het bepalen van de bracket-grootte. Een krappe stop wordt op onopvallende dagen geraakt. Een verre target wordt meestal niet uitgevoerd.
Wordt een stop loss altijd uitgevoerd op de stop-prijs?
Nee. Een stop is een instructie om een order te versturen zodra een trigger-prijs wordt geprint. Een gewone stop verstuurt een market order, en de uitvoering vindt plaats op de prijs die op dat moment in het orderboek staat. Een stop limit verstuurt een limit order tegen een door u ingestelde prijs; dit verdedigt de prijs, maar accepteert het risico dat er helemaal geen uitvoering plaatsvindt. Die afweging is het onderwerp van stop order versus stop limit order.
De overnight gap is het duidelijkste voorbeeld. Een protective stop rust gedurende uren dat de beurs gesloten is, en de openingsprint kan ver voorbij de trigger liggen. Tien voorbeelden van AAPL over drie en een half jaar:
De exacte SQL achter elk getal
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 10De grootste daarvan bedroeg -9.45% op Aug 5, 2024, en de tiende op de lijst bedroeg nog steeds -2.96%. Een protective stop die ergens binnen die gaps rustte, werd omgezet tegen de openingsprint, niet tegen de trigger-prijs. Het bepalen van de bracket-grootte op basis van alleen de intraday range laat die afstand ongemodelleerd.
Waar bevindt de OCO-koppeling zich daadwerkelijk?
Bijna nooit op de beurs. De annuleringskoppeling tussen twee kinderen wordt vastgehouden in het orderbeheersysteem van de broker, of een laag daarbuiten in een handelsplatform dat op uw eigen machine draait. De beurs ziet twee gewone, ongerelateerde orders.
Die plaatsing bepaalt wat een storing overleeft. Een bracket aan de kant van de broker blijft werken als de laptop wordt afgesloten, aangezien de servers van de broker beide poten en de annuleringslogica vasthouden. Een bracket aan de kant van het platform, zoals sommige grafiekapplicaties lokaal implementeren, vereist dat de applicatie draait en verbonden is. Sommige platforms houden een gesimuleerde stop aan die alleen in het lokale geheugen bestaat totdat de trigger-prijs wordt geprint. Sluit de laptop en die stop wordt nooit verstuurd.
Dezelfde vraag geldt voor uw eigen code. Een stop die alleen in een draaiend proces leeft, laat niets achter in het orderboek zodra het proces stopt. Circuit breakers voor trading bots behandelt het patroon voor geautomatiseerde systemen: ga ervan uit dat het proces op het slechtst mogelijke moment sterft en vraag vervolgens wat er nog actief is bij de broker.
Time in force geldt voor elke poot
Elke poot draagt zijn eigen time in force-instelling. Een day-entry gecombineerd met GTC-kinderen is een veelvoorkomende en onhandige combinatie: de entry verloopt bij het slot terwijl de kinderen nooit activeren, wat een bracket achterlaat die de volgende ochtend stilletjes niets doet. De omgekeerde combinatie laat bescherming achter die om 16:00 uur ET verloopt op een positie die overnacht wordt aangehouden.
Buiten de reguliere uren verandert het karakter van het orderboek zelf. Het onderstaande paneel groepeert SPY-minuutbars per ET-kloktijd over de hele dag en leest twee zaken per half uur: de gemiddelde grootte van een beweging van één minuut, in basis points (één basis point is een honderdste van een procent), en het mediane volume per minuut.
De exacte SQL achter elk getal
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_timeHet paneel toont 32 halfuur-buckets, van 04:00 tot 19:30 ET. Lees het van links naar rechts en de vorm vertelt het verhaal. Beide reeksen bevinden zich tijdens de premarket-uren nabij hun bodem, klimmen steil naar de opening van 09:30 uur en dalen weer na 16:00 uur. Een GTC-stop die om 05:00 uur rust, bevindt zich in het dunne deel van die curve, en een stop-market uitvoering in een orderboek dat zo dun is, kan ver van de trigger landen.
Veelgestelde vragen
Wat is het verschil tussen een bracket order en een OCO order?
Een OCO is het paar zelf: twee rustende orders met een annuleringskoppeling, waarbij een uitvoering op de ene de andere verwijdert. Een bracket is een entry-order met een OCO-paar eraan gekoppeld, waarbij het paar pas actief wordt zodra de entry wordt uitgevoerd. Elke bracket bevat een OCO. Veel OCO-paren worden op zichzelf gebruikt.
Werkt een bracket order nog als mijn computer uitstaat?
Dat hangt af van waar de koppeling zich bevindt. Een bracket aan de kant van de broker rust op de servers van de broker en blijft werken met het platform gesloten. Een bracket aan de kant van het platform of een gesimuleerde bracket vereist dat de applicatie draait en verbonden is, en de kinderorders bereiken de markt mogelijk nooit zonder die verbinding.
Wat gebeurt er met de stop als de profit target gedeeltelijk wordt uitgevoerd?
De stop wordt verminderd met de uitgevoerde hoeveelheid in plaats van geannuleerd. Als een target van 200 aandelen voor 60 aandelen wordt uitgevoerd, daalt de stop naar 140 aandelen, passend bij de positie die nog openstaat. De annulering vindt pas plaats wanneer het laatste deel van de positie is gesloten.
Kan ik een bracket order gebruiken in de premarket of after-hours handel?
Het gedrag varieert per broker, en velen routeren bracket-kinderen alleen tijdens reguliere uren. Met name stop orders worden vaak geweigerd of vastgehouden buiten 09:30 tot 16:00 uur ET voor Amerikaanse aandelen. De time-in-force instelling op elke poot bepaalt of die poot überhaupt in aanmerking komt voor de uitgebreide sessie.
Weten beurzen dat mijn twee orders gekoppeld zijn?
Nee. Bij Amerikaanse aandelen wordt de annuleringskoppeling vastgehouden door de broker of het platform, en de beurs ontvangt twee onafhankelijke orders. Het annuleringsbericht voor de overblijvende poot wordt verstuurd door het systeem dat de koppeling vasthoudt, nadat de andere poot zijn uitvoering rapporteert.
Elk paneel hier wordt geleverd met de exacte SQL eronder. Om de range en het gap-risico te meten van een aandeel dat u volgt, stelt u de vraag in begrijpelijke taal op de Strasmore-terminal.