Strasmore Research
學習 Matt Connor作者: Matt Connor · data as of August 15, 2026 · refreshed weekly

Bracket Order 與 OCO Order:進場、停利與停損如何連動

了解 bracket order 如何同時設定進場、獲利目標與保護性 stop,OCO 如何互相取消,以及部分成交時部位與避險單如何調整。

一個 bracket order 是一項同時送出三筆訂單的指令,三者之間具有固定關係:一筆進場單,加上一組分別位於進場價兩側、彼此連動的出場單。這組出場單就是 OCO,亦即 one cancels the other。獲利目標限價單掛在進場價上方,保護性 stop 掛在進場價下方;其中一邊成交後,另一邊會自動取消。Bracket order 本質上是一個小型狀態機,多數意外都發生在狀態切換之間。

什麼是 bracket order?

想像一名交易人想在接近 50 美元時買進 200股;若交易如預期發展,則在接近 53美元時平倉;若情況不利,則在接近 48.50美元時出場。若分開下單,這會是三筆訂單,還需要人工處理:目標價成交時立即取消 stop,否則可能把 200股賣出兩次。Bracket order 將相同意圖包裝成一次提交。進場單是一般的 市價單或限價單。兩筆出場單則是其子單:一筆是在目標價平倉的限價單,另一筆是在保護價位平倉的 stop 或 stop limit order

不同平台的用語不盡相同。Bracket、attached order、OCO bracket 及 OTOCO 都是在描述這種結構。OTOCO,即 one triggers a one-cancels-the-other,是最直接描述該流程的名稱:進場單啟動這組配對單,之後配對單會彼此取消,只留下其中一筆。

Bracket order 中的 OCO 是什麼意思?

OCO 是兩筆彼此具有取消連結的掛單。兩筆訂單會同時在委託簿中保持有效。其中一筆成交後,另一筆會被撤銷。若其中一筆部分成交,另一筆會按已成交數量縮減,而不是直接撤銷;這項縮減能讓持倉與避險部位逐股維持一致。

一個 200股的多頭 bracket order,其完整流程如下。

  1. 進場單單獨生效。目標單與 stop 存在於券商系統中,但尚未成為有效委託,因此進場單尚未成交時,即使市場成交價穿越目標價,也完全不會發生任何事。
  2. 進場單成交 200股。兩筆子單都轉為有效,每筆數量均為 200股。
  3. 市場觸及 stop 價格。Stop 轉換為有效的賣出委託,並進入委託簿撮合。
  4. 市場反向移動前,stop 成交 120股。目標限價單由 200股縮減至 80股,與剩餘持倉相符。
  5. 當日稍後,最後 80股在目標價成交。Stop 剩餘的 80股被取消,整個 bracket order 完成。

進場單部分成交時,各平台的處理差異最大。有些券商會立即按已成交數量啟動子單,並隨進場單其餘部分成交而增加子單數量。另一些券商則會等到進場單全部成交後才啟動子單,使持倉在這段期間沒有保護。不同券商的規則差異並非表面上的小事,包括子單是否會在進場單部分成交時啟動,以及修改其中一筆子單是否會破壞另一筆子單的取消連結。

兩筆出場單應相距多遠?

兩筆出場單都必須避開標的在普通交易日的雜訊,同時位於標的實際可能走出的距離之內。日內區間是第一個粗略衡量指標。下方面板檢視六個常見大型股在過去一年的表現:以開盤價百分比計算的最高價至最低價區間中位數,以及開盤至收盤絕對變動的中位數。

查詢各 ticker:典型日內波動區間與開盤至收盤變動(近一年)
每個數據背後的精確 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 DESC
Run this yourself

NVDA 的典型交易時段區間在六個標的中最寬,為 2.72%;SPY 最窄,為 0.86%。注意每一列的第二欄都遠低於第一欄。標的在一個交易時段內的典型波動,通常遠大於開盤至收盤的淨變動,而 bracket order 的兩筆出場單都位於這段波動之內。目標價與 stop 價格可能在同一個普通交易日內都被觸及。

Bracket order 的其中一筆出場單多常會被觸及?

進場價與出場價的距離,是交易人真正能控制的參數。下一個面板將問題固定在 SPY 三個完整年度的交易時段,並針對一組相對開盤成交價的距離,計算當日曾下跌至該距離的交易時段比例,以及曾上漲至該距離的交易時段比例。

查詢SPY 觸及距開盤特定幅度的交易日占比(2023年8月至2026年7月)
每個數據背後的精確 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
Run this yourself

當距離為開盤價的四分之一個百分點時,62.3% 的交易時段曾在某個時間點下跌至該距離,64.7% 則曾上漲至該距離。將距離擴大至 3% 後,下跌比例降至 0.5%。兩條曲線同步衰減,這正是 bracket order 設定的核心取捨。緊密的 stop,代表即使在毫不起眼的交易日也可能被觸發。遙遠的目標價,則多數時候會在未成交的情況下到期。

Stop loss 是否一定會在 stop 價格成交?

不一定。Stop 是一項指令,要求市場出現觸發價後才送出訂單。一般 stop 會送出市價單,因此成交價取決於當下委託簿中的可成交價格。Stop limit 則會以你設定的價格送出限價單,能夠限制成交價格,但也承擔完全無法成交的風險。這項取捨詳見 stop order 與 stop limit order

隔夜跳空是最明顯的情況。保護性 stop 會在交易所休市期間持續有效,而開盤成交價可能遠遠越過觸發價。以下是 AAPL 在三年半期間的十個案例:

查詢AAPL 最大的十次隔夜跳空下跌(2023年1月至2026年6月)
每個數據背後的精確 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
Run this yourself

其中最大的一次為 -9.45%,發生於 Aug 5, 2024;榜單上的第十次仍達到 -2.96%。在這些跳空區間內任何位置掛出的保護性 stop,都會在開盤成交價出現時轉換,而不是在觸發價成交。若只根據日內區間設定 bracket order,就沒有納入這段距離的風險。

OCO 連結實際上位於哪裡?

幾乎從不在交易所。兩筆子單之間的取消連結,是由券商的訂單管理系統保存;也可能再往外一層,由你自己電腦上執行的交易平台保存。交易所看到的是兩筆普通且彼此無關的訂單。

這個位置決定了系統故障時哪些功能仍會運作。券商端的 bracket order 會在筆電關閉後繼續運作,因為券商伺服器保存兩筆出場單及取消邏輯。平台端的 bracket order,例如某些圖表應用程式在本機執行的功能,則需要應用程式持續開啟並保持連線。有些平台會保存模擬 stop;在觸發價出現前,它只存在於本機記憶體中。關閉筆電後,這筆 stop 就永遠不會送出。

同樣的問題也適用於你自行撰寫的程式。若 stop 只存在於執行中的程序內,程序停止後,委託簿中就不會留下任何有效委託。交易機器人的斷路器說明自動化系統的處理模式:假設程序在最糟糕的時刻停止,然後確認券商端仍有哪些委託在運作。

每一筆出場單都有自己的有效期限設定

每一筆出場單都有各自的 time in force 設定。進場單採當日有效、子單採 GTC,是常見但不理想的組合:進場單在收市時到期,但子單從未啟動,導致 bracket order 隔天早上無聲無息地失效。反向搭配則會讓保護性訂單在持倉過夜時,於美東時間下午4:00到期。

在正常交易時段以外,委託簿本身的特性也會改變。下方面板依美東時間將全天 SPY 分鐘線分組,每半小時計算兩項數據:一分鐘變動的平均幅度,以基點表示(一個基點是百分之一個百分點);以及每分鐘成交量的中位數。

查詢SPY 依美東時間分的分鐘K線走勢與成交量
每個數據背後的精確 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
Run this yourself

面板共分為 32 個半小時區間,涵蓋美東時間 04:0019:30。從左至右閱讀即可看出其形狀。兩項數據在盤前時段都接近低點,接近美東時間09:30開盤時快速上升,並在16:00後再次回落。凌晨5點仍有效的 GTC stop,正處於這條曲線流動性較薄的部分;在如此稀薄的委託簿中,stop-market 的成交價可能遠離觸發價。

常見問題

Bracket order 與 OCO order 有何不同?

OCO 本身就是那組配對單:兩筆具有取消連結的掛單,其中一筆成交後會移除另一筆。Bracket order 則是附有 OCO 配對單的進場單,只有進場單成交後,這組配對單才會生效。每個 bracket order 都包含一組 OCO,但許多 OCO 配對單也會獨立使用。

我的電腦關機後,bracket order 還會運作嗎?

這取決於連結位於何處。券商端的 bracket order 由券商伺服器保存,即使平台關閉仍會繼續運作。平台端或模擬 bracket order 則需要應用程式持續開啟並保持連線;若沒有應用程式,子單可能根本不會送達市場。

若獲利目標部分成交,stop 會發生什麼事?

Stop 會按已成交數量縮減,而不是取消。若 200股的目標單成交 60股,stop 會降至 140股,與仍未平倉的持倉相符。只有在持倉最後一股平倉後,取消指令才會發出。

我可以在盤前或盤後交易時段使用 bracket order 嗎?

各券商的作法不同,許多券商只會在正常交易時段路由 bracket order 的子單。尤其是 stop order,在美股市場美東時間上午9:30至下午4:00以外,經常會被拒絕或暫存。每一筆出場單的 time-in-force 設定,決定該筆訂單是否具備延長交易時段的資格。

交易所知道我的兩筆訂單彼此有連結嗎?

不知道。在美股市場,取消連結由券商或平台保存,交易所收到的是兩筆彼此獨立的訂單。當其中一筆回報成交後,保存連結的系統會向仍有效的另一筆出場單發送取消訊息。


本頁每個面板下方都附有完整且精確的 SQL。若要衡量你所追蹤標的的區間與跳空風險,請在 Strasmore terminal 以自然語言提出問題。

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