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.
- 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.
- L’entrata viene eseguita per 200 azioni. Entrambi gli ordini figli diventano attivi, ciascuno per 200 azioni.
- Il mercato raggiunge il prezzo dello stop. Lo stop si trasforma in un ordine sell attivo e viene inserito nel book.
- 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.
- 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.
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 DESCNVDA 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.
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.distA 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:
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 10Il 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.
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_timeIl 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.