Strasmore Research
Formazione Matt ConnorDi Matt Connor · data as of August 15, 2026 · refreshed weekly

Bracket order e OCO: guida a stop e profit target

Cos’è un bracket order? Come profit target e stop protettivo si collegano in OCO, cosa accade con un partial fill e dove risiede il collegamento.

Un bracket order è un’unica istruzione che invia tre ordini in un rapporto prestabilito: un ordine di entrata e una coppia di ordini di uscita collegati, posizionati ai due lati dell’entrata. La coppia è l’OCO, abbreviazione di one cancels the other. Un ordine limit per l’obiettivo di profitto è collocato sopra il prezzo di entrata, mentre uno stop protettivo è collocato sotto. L’esecuzione di una delle due gambe cancella automaticamente l’altra. Un bracket è, in sostanza, una piccola macchina a stati, e la maggior parte delle sorprese si verifica nei passaggi tra uno stato e l’altro.

Che cos’è un bracket order?

Immaginiamo un trader che voglia acquistare 200 azioni intorno a 50 dollari, chiudere la posizione vicino a 53 dollari se l’operazione va bene e uscire vicino a 48,50 dollari se va male. Inseriti come ticket separati, sono tre ordini e un’attività manuale: cancellare lo stop nel momento in cui viene eseguito l’obiettivo, altrimenti si rischia di vendere 200 azioni due volte. Un bracket riunisce la stessa intenzione in un’unica disposizione. L’entrata è un normale ordine market o ordine limit. Le due uscite sono i suoi ordini figli: un limit per chiudere al target e uno stop o stop limit per chiudere al livello protettivo.

La terminologia varia. Bracket, attached order, OCO bracket e OTOCO descrivono tutti questa struttura. OTOCO, one triggers a one-cancels-the-other, è il nome più letterale per la sequenza: l’entrata attiva la coppia, poi la coppia si riduce automaticamente a un solo ordine.

Che cosa significa OCO in un bracket order?

Un OCO è costituito da due ordini pendenti collegati da una regola di cancellazione. Entrambi restano attivi nel book nello stesso momento. Quando uno viene eseguito, l’altro viene ritirato. Se uno viene eseguito parzialmente, l’altro viene ridotto della quantità eseguita anziché essere cancellato del tutto. Questa riduzione mantiene allineati, azione per azione, la posizione e il relativo ordine di protezione.

La sequenza completa per un bracket long da 200 azioni è la seguente.

  1. L’entrata opera da sola. Il target e lo stop esistono nel sistema del broker, ma non sono ordini attivi. Pertanto, se il prezzo attraversa il target mentre l’entrata non è stata eseguita, non accade nulla.
  2. L’entrata viene eseguita per 200 azioni. Entrambi gli ordini figli diventano attivi, ciascuno per 200 azioni.
  3. Il mercato raggiunge il prezzo dello stop. Lo stop si trasforma in un ordine sell attivo e viene inserito nel book.
  4. Lo stop viene eseguito per 120 azioni prima che il mercato si allontani. Il limit sul target viene ridotto da 200 a 80 azioni, in linea con la posizione residua.
  5. Le ultime 80 azioni vengono eseguite successivamente al target. Le 80 azioni residue dello stop vengono cancellate e il bracket si chiude.

Le esecuzioni parziali dell’entrata sono il punto in cui le piattaforme mostrano le differenze maggiori. Alcuni broker attivano subito gli ordini figli per la quantità eseguita e li aumentano man mano che l’entrata viene completata. Altri attendono l’esecuzione integrale dell’entrata, lasciando la posizione priva di protezione nel frattempo. Le regole cambiano da broker a broker in modi sostanziali: occorre verificare se gli ordini figli si attivano dopo un’esecuzione parziale dell’entrata e se la modifica di un figlio interrompe il collegamento di cancellazione con l’altro.

Quanto devono essere distanti le due gambe?

Entrambe le gambe devono essere oltre il rumore che un titolo produce in una giornata ordinaria, ma entro la distanza che il titolo è effettivamente in grado di percorrere. Il range giornaliero è la prima misura, ancora approssimativa. Il pannello seguente analizza sei nomi molto seguiti nell’ultimo anno: la mediana del range massimo-minimo in percentuale dell’apertura, accanto alla mediana dello spostamento assoluto dall’apertura alla chiusura.

QueryIntervallo giornaliero tipico e variazione apertura-chiusura, anno mobile
L'esatto SQL dietro ogni numero
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 presenta la sessione tipica più ampia dei sei, pari a 2.72%, mentre SPY presenta quella più stretta, pari a 0.86%. Si noti quanto la seconda colonna sia inferiore alla prima in ogni riga. In una sessione tipica, un titolo percorre una distanza molto maggiore rispetto a quella risultante tra apertura e chiusura, e entrambe le gambe del bracket si collocano all’interno di questo movimento. Un target e uno stop possono quindi essere entrambi raggiunti nella stessa giornata ordinaria.

Con quale frequenza viene raggiunta una gamba del bracket?

La distanza dall’entrata è la variabile che il trader controlla direttamente. Il pannello successivo fissa l’analisi su tre anni completi di sessioni SPY e, per una serie di distanze dal prezzo di apertura, indica la quota di sessioni in cui il mercato è sceso almeno fino a quel livello e la quota in cui è salito almeno fino a quel livello durante la giornata.

QueryQuota delle sessioni SPY che raggiungono una determinata distanza dall’apertura (ago 2023–lug 2026)
L'esatto SQL dietro ogni numero
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

A un quarto di punto percentuale dall’apertura, 62.3% delle sessioni ha raggiunto almeno quel livello al ribasso e 64.7% lo ha raggiunto al rialzo. Aumentando la distanza a 3%, il dato relativo al ribasso scende a 0.5%. Le due curve decrescono insieme, ed è qui che emerge il compromesso nella scelta delle dimensioni del bracket. Uno stop stretto è uno stop che viene colpito in giornate ordinarie. Un target distante è un target che nella maggior parte dei casi scade senza essere eseguito.

Uno stop loss viene sempre eseguito al prezzo dello stop?

No. Uno stop è un’istruzione che invia un ordine quando viene registrato un prezzo trigger. Uno stop semplice invia un ordine market, e l’esecuzione avviene al livello disponibile nel book in quel momento. Uno stop limit invia invece un ordine limit al prezzo impostato dal trader: protegge il prezzo, ma comporta il rischio di non essere eseguito. Questo compromesso è illustrato nel confronto ordine stop e ordine stop limit.

Il gap overnight è il caso più evidente. Uno stop protettivo resta pendente durante le ore di chiusura dell’exchange, mentre il prezzo di apertura può trovarsi molto oltre il trigger. Ecco dieci esempi su AAPL nell’arco di tre anni e mezzo:

QueryI dieci maggiori gap overnight al ribasso di AAPL, gen 2023–giu 2026
L'esatto SQL dietro ogni numero
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

Il più ampio ha misurato -9.45% il Aug 5, 2024, mentre il decimo della lista ha comunque misurato -2.96%. Uno stop protettivo collocato all’interno di uno di questi gap si sarebbe attivato al prezzo di apertura, non al prezzo trigger. Dimensionare un bracket basandosi soltanto sul range intraday lascia quindi questa distanza senza una stima.

Dove risiede esattamente il collegamento OCO?

Quasi mai sull’exchange. Il collegamento di cancellazione tra due ordini figli è gestito dal sistema di order management del broker oppure, a un livello ulteriore, da una trading platform che opera sul computer del trader. L’exchange vede due ordini normali e indipendenti.

Questa collocazione determina cosa resta operativo in caso di interruzione. Un bracket gestito dal broker continua a funzionare anche quando il laptop viene chiuso, perché i server del broker conservano entrambe le gambe e la logica di cancellazione. Un bracket gestito dalla piattaforma, come quelli implementati localmente da alcune applicazioni di charting, richiede che l’applicazione sia in esecuzione e connessa. Alcune piattaforme mantengono uno stop simulato che esiste solo nella memoria locale finché non viene raggiunto il prezzo trigger. Se si chiude il laptop, quello stop non viene mai inviato.

La stessa domanda vale per il proprio codice. Uno stop che esiste soltanto all’interno di un processo in esecuzione non lascia alcun ordine pendente nel book quando il processo si arresta. Circuit breaker per trading bot descrive il modello da adottare nei sistemi automatizzati: occorre assumere che il processo si interrompa nel momento peggiore possibile e poi verificare cosa rimane attivo presso il broker.

Il time in force si applica a ciascuna gamba

Ogni gamba ha una propria impostazione di time in force. Un’entrata day abbinata a ordini figli GTC è una combinazione comune ma poco efficace: l’entrata scade alla chiusura, mentre gli ordini figli non si attivano mai. Il mattino successivo rimane così un bracket che non fa nulla senza attirare l’attenzione. L’abbinamento inverso lascia invece una protezione che scade alle 16:00 ET su una posizione mantenuta overnight.

Al di fuori dell’orario regolare cambia anche la struttura del book. Il pannello seguente raggruppa le barre a un minuto di SPY in base all’orario ET nell’intera giornata e analizza due elementi per ogni mezz’ora: l’ampiezza media del movimento di un minuto, in basis point (un basis point equivale a un centesimo di punto percentuale), e la mediana dei volumi stampati in un minuto.

QueryMovimento e volume delle barre a 1 minuto di SPY per orario ET
L'esatto SQL dietro ogni numero
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

Il pannello restituisce 32 intervalli di mezz’ora, da 04:00 a 19:30 ET. Letto da sinistra a destra, il grafico mostra chiaramente l’andamento. Entrambe le serie restano vicine ai minimi durante le ore di premarket, aumentano rapidamente verso l’apertura delle 09:30 e tornano a diminuire dopo le 16:00. Uno stop GTC pendente alle 5:00 si trova nella parte sottile di questa curva, e un’esecuzione stop-market in un book così poco liquido può avvenire molto lontano dal trigger.

FAQ

Qual è la differenza tra un bracket order e un ordine OCO?

Un OCO è la coppia in sé: due ordini pendenti collegati da una regola di cancellazione, per cui l’esecuzione di uno rimuove l’altro. Un bracket è un ordine di entrata con una coppia OCO collegata; la coppia diventa attiva solo quando l’entrata viene eseguita. Ogni bracket contiene un OCO, ma molti OCO vengono utilizzati autonomamente.

Un bracket order continua a funzionare se il computer è spento?

Dipende dal punto in cui risiede il collegamento. Un bracket gestito dal broker resta sui server del broker e continua a funzionare con la piattaforma chiusa. Un bracket gestito dalla piattaforma o simulato richiede che l’applicazione sia in esecuzione e connessa; senza di essa, gli ordini figli potrebbero non raggiungere mai il mercato.

Che cosa succede allo stop se il profit target viene eseguito parzialmente?

Lo stop viene ridotto della quantità eseguita, anziché essere cancellato. Se un target da 200 azioni viene eseguito per 60 azioni, lo stop scende a 140 azioni, in linea con la posizione ancora aperta. La cancellazione avviene soltanto quando viene chiusa l’ultima parte della posizione.

Posso usare un bracket order nel premarket o nell’after-hours?

Il comportamento varia in base al broker e molti broker instradano gli ordini figli del bracket soltanto durante l’orario regolare. Gli ordini stop, in particolare, vengono spesso rifiutati o mantenuti in attesa al di fuori dell’intervallo tra le 09:30 e le 16:00 ET sulle azioni statunitensi. L’impostazione time in force di ciascuna gamba determina se quella gamba è idonea all’extended session.

Gli exchange sanno che i miei due ordini sono collegati?

No. Sulle azioni statunitensi il collegamento di cancellazione è gestito dal broker o dalla piattaforma, mentre l’exchange riceve due ordini indipendenti. Il messaggio di cancellazione relativo alla gamba ancora attiva viene inviato dal sistema che gestisce il collegamento, dopo che l’altra gamba ha comunicato la propria esecuzione.


Ogni pannello qui riportato include il relativo codice SQL completo. Per misurare il range e il rischio di gap di un titolo che segui, poni la domanda in inglese semplice sul terminale Strasmore.

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