Strasmore Research
Apprendre Matt ConnorPar Matt Connor · data as of August 15, 2026 · refreshed weekly

Bracket orders et OCO : fonctionnement expliqué

Qu’est-ce qu’un bracket order ? Comprenez le lien OCO entre cible de gain et stop de protection, le partial fill et le placement réel de ce lien.

Un bracket order est une instruction unique qui transmet trois ordres selon une relation définie : un ordre d’entrée, ainsi qu’une paire de sorties liées placées de part et d’autre de celui-ci. Cette paire est l’OCO, abréviation de « one cancels the other ». Un ordre limite de prise de profit est placé au-dessus du prix d’entrée et un stop de protection en dessous. L’exécution de l’un des deux annule automatiquement l’autre. Un bracket est en réalité une petite machine à états, et la plupart des surprises surviennent dans les intervalles entre ces états.

Qu’est-ce qu’un bracket order ?

Imaginez un trader qui souhaite acheter 200 actions autour de 50 $, déboucler la position autour de 53 $ si le scénario se réalise, et sortir autour de 48,50 $ dans le cas contraire. Sous la forme de tickets distincts, cela représente trois ordres et une intervention manuelle : annuler le stop dès que la cible est atteinte, faute de quoi 200 actions risquent d’être vendues deux fois. Un bracket regroupe cette intention dans une seule soumission. L’entrée est un ordre au marché ou ordre limite classique. Les deux sorties sont ses ordres enfants : une limite pour clôturer à la cible et un ordre stop ou stop limite pour clôturer au niveau de protection.

La terminologie varie. Bracket, attached order, OCO bracket et OTOCO désignent tous cette structure. OTOCO, pour one triggers a one-cancels-the-other, est le nom le plus littéral de la séquence : l’entrée active la paire, puis la paire s’annule elle-même jusqu’à ne laisser qu’un ordre.

Que signifie OCO dans un bracket order ?

Un OCO est une paire d’ordres en attente reliés par un mécanisme d’annulation. Les deux ordres sont actifs simultanément dans le carnet. Lorsque l’un est exécuté, l’autre est retiré. En cas d’exécution partielle de l’un, l’autre est réduit de la quantité exécutée au lieu d’être retiré entièrement. Cette réduction maintient la correspondance entre la position et sa protection, action pour action.

La séquence complète d’un bracket long de 200 actions se déroule ainsi.

  1. L’entrée est active seule. La cible et le stop existent dans le système du courtier, mais ne sont pas encore des ordres actifs. Un print au-delà du prix cible alors que l’entrée n’est pas exécutée ne produit donc aucun effet.
  2. L’entrée est exécutée pour 200 actions. Les deux ordres enfants deviennent actifs, chacun pour 200 actions.
  3. Le marché atteint le prix du stop. Le stop se transforme en ordre de vente au marché actif et est exécuté dans le carnet.
  4. Le stop est exécuté pour 120 actions avant que le marché ne s’éloigne. L’ordre limite cible est réduit de 200 à 80 actions, correspondant à la position restante.
  5. Les 80 dernières actions sont exécutées plus tard dans la séance au niveau de la cible. Les 80 actions restantes du stop sont annulées et le bracket est clôturé.

Les exécutions partielles de l’entrée sont le point sur lequel les plateformes divergent le plus. Certains courtiers activent immédiatement les ordres enfants pour la quantité exécutée, puis les augmentent à mesure que le reste de l’entrée est exécuté. D’autres attendent l’exécution complète de l’entrée, ce qui laisse la position sans protection pendant cet intervalle. Les modalités varient selon le courtier et ne sont pas purement cosmétiques : il faut notamment savoir si les ordres enfants sont activés lors d’une exécution partielle de l’entrée et si la modification d’un ordre enfant rompt le lien d’annulation avec l’autre.

À quelle distance les deux jambes sont-elles placées ?

Les deux jambes doivent être placées au-delà du bruit produit par une valeur lors d’une journée ordinaire, tout en restant dans la distance qu’elle peut réellement parcourir. L’amplitude quotidienne est la première mesure, certes approximative, à utiliser. Le panneau ci-dessous observe six valeurs très suivies sur l’année écoulée : l’amplitude médiane entre le plus haut et le plus bas, en pourcentage de l’ouverture, ainsi que la variation absolue médiane entre l’ouverture et la clôture.

RequêteFourchette quotidienne typique et variation ouverture-clôture, année glissante
Le SQL exact derrière chaque chiffre
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 DESC
Run this yourself

NVDA affiche la séance typique la plus large des six, à 2.72%, et SPY la plus étroite, à 0.86%. Observez l’écart entre la deuxième colonne et la première sur chaque ligne. Une valeur typique parcourt une distance nettement supérieure au cours de la séance à sa variation nette entre l’ouverture et la clôture, et les deux jambes du bracket s’inscrivent dans cette amplitude. Une cible et un stop peuvent tous deux être atteints au cours d’une même journée ordinaire.

À quelle fréquence une jambe d’un bracket est-elle touchée ?

La distance par rapport à l’entrée est le paramètre que le trader contrôle réellement. Le panneau suivant fixe la question sur trois années de séances du SPY et demande, pour plusieurs distances par rapport au print d’ouverture, quelle proportion des séances a atteint ce niveau à la baisse et quelle proportion l’a atteint à la hausse à un moment de la journée.

RequêtePart des séances du SPY atteignant une distance donnée par rapport à l’ouverture (août 2023 à juillet 2026)
Le SQL exact derrière chaque chiffre
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
Run this yourself

À un quart de pour cent de l’ouverture, 62.3% des séances ont atteint cette distance à la baisse et 64.7% l’ont atteinte à la hausse. Lorsque la distance est élargie à 3%, la proportion à la baisse tombe à 0.5%. Les deux courbes diminuent ensemble, ce qui résume toute la difficulté du calibrage d’un bracket. Un stop serré est un stop déclenché lors de journées sans événement particulier. Une cible éloignée est une cible qui reste le plus souvent inexécutée.

Un stop loss est-il toujours exécuté au prix du stop ?

Non. Un stop est une instruction qui consiste à transmettre un ordre lorsqu’un prix de déclenchement est atteint. Un stop classique transmet un ordre au marché, et l’exécution intervient au niveau auquel le carnet se trouve à cet instant. Un stop limite transmet un ordre limite au prix que vous avez défini. Il protège le prix, mais accepte le risque de ne pas être exécuté. Cet arbitrage est traité dans ordre stop versus ordre stop limite.

Le gap d’ouverture est le cas le plus évident. Un stop de protection reste en attente lorsque la place boursière est fermée, et le print d’ouverture peut se situer largement au-delà du niveau de déclenchement. Voici dix exemples sur AAPL sur une période de trois ans et demi :

RequêteLes dix plus grands gaps baissiers overnight d’AAPL, janvier 2023 à juin 2026
Le SQL exact derrière chaque chiffre
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
Run this yourself

Le plus important mesurait -9.45% le Aug 5, 2024, et le dixième de la liste atteignait encore -2.96%. Un stop de protection placé à l’intérieur de l’un de ces gaps a été converti au print d’ouverture, et non à son prix de déclenchement. Calibrer un bracket uniquement à partir de l’amplitude intraday laisse cette distance hors modèle.

Où le lien OCO est-il réellement géré ?

Presque jamais par la place boursière. Le lien d’annulation entre deux ordres enfants est géré par le système de gestion des ordres du courtier, ou par une couche supplémentaire dans une plateforme de trading exécutée sur votre propre machine. La place boursière reçoit deux ordres classiques et indépendants.

Cette architecture détermine ce qui survit à une panne. Un bracket géré côté courtier continue de fonctionner lorsque l’ordinateur portable est fermé, puisque les serveurs du courtier détiennent les deux jambes et la logique d’annulation. Un bracket géré côté plateforme, comme ceux proposés localement par certaines applications graphiques, nécessite que l’application reste ouverte et connectée. Certaines plateformes conservent un stop simulé uniquement en mémoire locale jusqu’à ce que le prix de déclenchement soit atteint. Si vous fermez l’ordinateur portable, ce stop n’est jamais transmis.

La même question se pose pour votre propre code. Un stop qui existe uniquement dans un processus en cours d’exécution ne laisse aucun ordre en attente dans le carnet lorsque le processus s’arrête. Disjoncteurs pour robots de trading présente le schéma à appliquer aux systèmes automatisés : partez du principe que le processus s’arrête au pire moment possible, puis vérifiez ce qui fonctionne encore chez le courtier.

La durée de validité s’applique à chaque jambe

Chaque jambe possède son propre paramètre de durée de validité. Associer une entrée valable pour la séance à des ordres enfants GTC est une combinaison fréquente et peu pratique : l’entrée expire à la clôture, tandis que les ordres enfants ne sont jamais activés. Le bracket ne produit alors discrètement aucun effet le lendemain matin. La combinaison inverse laisse une protection qui expire à 16 h ET sur une position conservée pendant la nuit.

En dehors des heures régulières, le carnet change lui-même de structure. Le panneau ci-dessous regroupe les barres minute du SPY par heure ET sur l’ensemble de la journée et mesure deux éléments par demi-heure : la taille moyenne d’une variation d’une minute, en points de base (un point de base représente un centième de pour cent), et le volume médian imprimé en une minute.

RequêteVariation et volume du SPY par minute selon l’heure ET
Le SQL exact derrière chaque chiffre
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
Run this yourself

Le panneau comprend 32 tranches d’une demi-heure, de 04:00 à 19:30 ET. Lisez-le de gauche à droite : la forme du graphique suffit à comprendre le phénomène. Les deux séries restent proches de leur point bas pendant le premarket, montent fortement à l’ouverture de 9 h 30, puis refluent après 16 h. Un stop GTC laissé en attente à 5 heures du matin se trouve dans la partie peu liquide de cette courbe. Une exécution au marché d’un stop dans un carnet aussi peu liquide peut intervenir très loin du niveau de déclenchement.

FAQ

Quelle est la différence entre un bracket order et un ordre OCO ?

Un OCO est la paire elle-même : deux ordres en attente reliés par un mécanisme d’annulation, l’exécution de l’un retirant l’autre. Un bracket est un ordre d’entrée auquel est attachée une paire OCO. Cette paire ne devient active qu’une fois l’entrée exécutée. Tout bracket contient un OCO. De nombreuses paires OCO sont utilisées seules.

Un bracket order continue-t-il de fonctionner si mon ordinateur est éteint ?

Cela dépend de l’endroit où le lien est géré. Un bracket géré côté courtier reste sur les serveurs du courtier et continue de fonctionner lorsque la plateforme est fermée. Un bracket géré côté plateforme ou simulé nécessite que l’application reste ouverte et connectée. Sans elle, les ordres enfants peuvent ne jamais atteindre le marché.

Qu’advient-il du stop si la cible de profit est partiellement exécutée ?

Le stop est réduit de la quantité exécutée au lieu d’être annulé. Si une cible portant sur 200 actions est exécutée pour 60 actions, le stop est ramené à 140 actions, en cohérence avec la position encore ouverte. L’annulation n’intervient que lorsque la dernière action de la position est clôturée.

Puis-je utiliser un bracket order pendant le premarket ou l’after-hours ?

Le comportement varie selon le courtier, et beaucoup ne transmettent les ordres enfants d’un bracket que pendant les heures régulières. Les ordres stop sont notamment souvent rejetés ou conservés en attente en dehors de la plage de 9 h 30 à 16 h ET sur les actions américaines. Le paramètre de durée de validité de chaque jambe détermine si celle-ci peut être active pendant la session étendue.

Les places boursières savent-elles que mes deux ordres sont liés ?

Non. Sur les actions américaines, le lien d’annulation est géré par le courtier ou la plateforme, et la place boursière reçoit deux ordres indépendants. Le message d’annulation de la jambe restante est envoyé par le système qui détient le lien, après que l’autre jambe a signalé son exécution.


Chaque panneau de cet article est accompagné de la requête SQL exacte utilisée pour le produire. Pour mesurer l’amplitude et le risque de gap sur une valeur que vous suivez, formulez votre question en anglais courant sur le terminal Strasmore.

#order types#oco#bracket orders#stop orders#execution