Strasmore Research
Học tập Matt ConnorBởi Matt Connor · data as of August 15, 2026 · refreshed weekly

Bracket order và OCO order là gì? Hướng dẫn chi tiết

Tìm hiểu cách thức hoạt động của bracket order cùng cơ chế OCO khi đặt lệnh chốt lời và dừng lỗ. Bài viết giải thích chi tiết về khớp lệnh từng phần và quản lý vị thế.

Bracket order là một lệnh bao gồm ba chỉ dẫn được gửi đi trong một mối quan hệ cố định: một lệnh vào vị thế (entry), cộng với một cặp lệnh thoát (exit) liên kết nằm ở hai phía của lệnh vào. Cặp lệnh này chính là OCO, viết tắt của "one cancels the other" (lệnh này hủy lệnh kia). Một lệnh giới hạn chốt lời (profit-target limit) nằm phía trên giá vào và một lệnh dừng lỗ bảo vệ (protective stop) nằm phía dưới; việc khớp một trong hai lệnh này sẽ tự động hủy lệnh còn lại. Bracket thực chất là một máy trạng thái nhỏ, và hầu hết các tình huống bất ngờ đều xảy ra trong khoảng thời gian giữa các trạng thái của nó.

Bracket order là gì?

Hãy hình dung một nhà giao dịch muốn mua 200 cổ phiếu quanh mức giá 50 đô la, đóng vị thế quanh mức 53 đô la nếu giao dịch thuận lợi, và thoát vị thế quanh mức 48,50 đô la nếu không. Nếu viết thành các lệnh riêng lẻ, đây sẽ là ba lệnh và là một công việc thủ công: phải hủy lệnh dừng lỗ ngay khi lệnh chốt lời khớp, nếu không sẽ đối mặt với rủi ro bán 200 cổ phiếu hai lần. Bracket đóng gói cùng một ý định đó vào một lần gửi lệnh duy nhất. Lệnh vào là một lệnh thị trường hoặc lệnh giới hạn thông thường. Hai lệnh thoát là các lệnh con: một lệnh giới hạn để đóng vị thế tại mục tiêu và một lệnh dừng hoặc lệnh dừng giới hạn để đóng tại mức bảo vệ.

Thuật ngữ có thể thay đổi. Bracket, attached order, OCO bracket, và OTOCO đều mô tả cấu trúc này. OTOCO, viết tắt của "one triggers a one-cancels-the-other" (một lệnh kích hoạt cặp lệnh hủy lẫn nhau), là tên gọi chính xác nhất cho trình tự này: lệnh vào kích hoạt cặp lệnh thoát, sau đó cặp lệnh này tự hủy cho đến khi chỉ còn một lệnh.

OCO trong bracket order nghĩa là gì?

OCO là hai lệnh đang chờ khớp với một liên kết hủy giữa chúng. Cả hai đều nằm trong sổ lệnh cùng một lúc. Khi một lệnh khớp, lệnh kia sẽ bị rút. Khi một lệnh khớp một phần, lệnh kia sẽ bị giảm khối lượng tương ứng thay vì bị hủy hoàn toàn, và việc giảm khối lượng này giúp duy trì sự khớp lệnh giữa vị thế và mức bảo vệ theo từng cổ phiếu.

Trình tự đầy đủ cho một bracket vị thế mua 200 cổ phiếu diễn ra như sau:

  1. Lệnh vào hoạt động độc lập. Lệnh chốt lời và lệnh dừng lỗ tồn tại trong hệ thống của nhà môi giới nhưng chưa phải là lệnh đang hoạt động, vì vậy nếu giá thị trường chạm mức chốt lời trong khi lệnh vào chưa khớp thì sẽ không có gì xảy ra.
  2. Lệnh vào khớp 200 cổ phiếu. Cả hai lệnh con đều được kích hoạt, mỗi lệnh cho 200 cổ phiếu.
  3. Giá thị trường chạm mức dừng lỗ. Lệnh dừng lỗ chuyển thành lệnh bán đang hoạt động và đi vào sổ lệnh.
  4. Lệnh dừng lỗ khớp 120 cổ phiếu trước khi thị trường đảo chiều. Lệnh giới hạn chốt lời được giảm từ 200 xuống còn 80, khớp với vị thế còn lại.
  5. 80 cổ phiếu cuối cùng khớp tại mức giá chốt lời sau đó trong phiên. 80 cổ phiếu còn lại của lệnh dừng lỗ bị hủy và bracket đóng lại.

Việc khớp lệnh một phần ở lệnh vào là nơi các nền tảng khác biệt nhất. Một số nhà môi giới kích hoạt ngay các lệnh con cho khối lượng đã khớp và tăng dần khối lượng khi phần còn lại của lệnh vào được hoàn tất. Những nền tảng khác đợi lệnh vào khớp toàn bộ, điều này khiến vị thế không được bảo vệ trong khoảng thời gian chờ đợi. Sự khác biệt về ngữ nghĩa giữa các nhà môi giới không chỉ là hình thức: nó bao gồm việc liệu các lệnh con có kích hoạt khi lệnh vào khớp một phần hay không, và liệu việc chỉnh sửa một lệnh con có làm phá vỡ liên kết hủy với lệnh còn lại hay không.

Hai lệnh thoát nên đặt cách nhau bao xa?

Cả hai lệnh phải nằm ngoài vùng nhiễu của cổ phiếu trong một ngày bình thường và nằm trong phạm vi mà cổ phiếu đó thực sự có thể di chuyển. Phạm vi biến động hàng ngày (daily range) là thước đo thô đầu tiên cho việc này. Bảng dưới đây liệt kê sáu cổ phiếu phổ biến trong năm qua: phạm vi trung vị từ cao xuống thấp tính theo phần trăm so với giá mở cửa, bên cạnh mức biến động tuyệt đối trung vị từ giá mở cửa đến giá đóng cửa.

Truy vấnBiên độ dao động hàng ngày và mức thay đổi từ mở cửa đến đóng cửa, tính theo năm
Câu lệnh SQL chính xác đằng sau mỗi con số
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 có phiên giao dịch điển hình rộng nhất trong sáu cổ phiếu ở mức 2.72%, và SPY hẹp nhất ở mức 0.86%. Hãy chú ý khoảng cách giữa cột thứ hai và cột thứ nhất ở mỗi hàng. Một cổ phiếu điển hình di chuyển xa hơn nhiều trong phiên so với mức chênh lệch từ giá mở cửa đến giá đóng cửa, và cả hai lệnh của bracket đều nằm trong phạm vi di chuyển đó. Một lệnh chốt lời và một lệnh dừng lỗ đều có thể bị chạm tới trong cùng một ngày giao dịch bình thường.

Tần suất một lệnh trong bracket bị chạm tới là bao nhiêu?

Khoảng cách từ giá vào là thông số mà nhà giao dịch thực sự kiểm soát. Bảng tiếp theo gắn câu hỏi này với ba năm dữ liệu phiên giao dịch của SPY và đặt ra câu hỏi: với một khoảng cách nhất định từ giá mở cửa, tỷ lệ phần trăm các phiên đã chạm tới mức đó ở phía dưới và phía trên trong ngày là bao nhiêu.

Truy vấnTỷ lệ các phiên SPY chạm ngưỡng khoảng cách nhất định từ giá mở cửa (Tháng 8/2023 đến Tháng 7/2026)
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Tại mức một phần tư phần trăm từ giá mở cửa, 62.3% số phiên đã giao dịch xuống mức đó tại một thời điểm nào đó và 64.7% đã giao dịch lên mức đó. Nếu mở rộng khoảng cách lên 3%, con số ở phía giảm sẽ giảm xuống 0.5%. Hai đường cong này suy giảm cùng nhau, đó chính là sự căng thẳng trong việc xác định kích thước bracket. Một lệnh dừng lỗ quá gần là lệnh dễ bị quét trong những ngày không có gì đặc biệt. Một mục tiêu quá xa là mục tiêu hầu như không bao giờ khớp.

Lệnh dừng lỗ có luôn khớp tại mức giá dừng không?

Không. Lệnh dừng là chỉ dẫn gửi một lệnh khác khi giá kích hoạt được ghi nhận. Một lệnh dừng thông thường sẽ gửi một lệnh thị trường, và mức giá khớp sẽ là mức giá tại thời điểm đó trên sổ lệnh. Lệnh dừng giới hạn gửi một lệnh giới hạn tại mức giá bạn đặt, giúp bảo vệ giá nhưng chấp nhận rủi ro không khớp lệnh. Sự đánh đổi đó là chủ đề của lệnh dừng so với lệnh dừng giới hạn.

Khoảng trống giá qua đêm (overnight gap) là trường hợp rõ ràng nhất. Một lệnh dừng bảo vệ nằm chờ trong nhiều giờ khi thị trường đóng cửa, và giá mở cửa có thể nằm xa mức kích hoạt. Mười ví dụ từ AAPL trong hơn ba năm rưỡi:

Truy vấn10 khoảng trống giảm giá (gap down) lớn nhất của AAPL, Tháng 1/2023 đến Tháng 6/2026
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Mức lớn nhất trong số đó đo được -9.45% vào ngày Aug 5, 2024, và mức thứ mười trong danh sách vẫn đo được -2.96%. Một lệnh dừng bảo vệ nằm chờ ở bất kỳ đâu trong các khoảng trống đó đều được chuyển đổi tại giá mở cửa, không phải tại giá kích hoạt. Việc xác định kích thước bracket chỉ dựa trên phạm vi biến động trong ngày sẽ bỏ qua khoảng cách đó.

Liên kết OCO thực sự nằm ở đâu?

Hầu như không bao giờ nằm ở sở giao dịch. Liên kết hủy giữa hai lệnh con được lưu giữ trong hệ thống quản lý lệnh của nhà môi giới, hoặc xa hơn là trong nền tảng giao dịch chạy trên máy tính của bạn. Sở giao dịch chỉ nhìn thấy hai lệnh thông thường, không liên quan đến nhau.

Vị trí đặt liên kết này quyết định điều gì sẽ xảy ra khi mất kết nối. Một bracket phía nhà môi giới vẫn hoạt động khi bạn tắt máy tính, vì máy chủ của nhà môi giới giữ cả hai lệnh và logic hủy. Một bracket phía nền tảng, loại mà một số ứng dụng biểu đồ triển khai cục bộ, cần ứng dụng phải đang chạy và kết nối. Một số nền tảng giữ một lệnh dừng mô phỏng chỉ tồn tại trong bộ nhớ cục bộ cho đến khi giá kích hoạt xuất hiện. Nếu tắt máy tính, lệnh dừng đó sẽ không bao giờ được gửi đi.

Câu hỏi tương tự áp dụng cho mã nguồn của chính bạn. Một lệnh dừng chỉ tồn tại trong một tiến trình đang chạy sẽ không để lại gì trong sổ lệnh khi tiến trình đó dừng lại. Ngắt mạch cho bot giao dịch bao gồm mô hình cho các hệ thống tự động: hãy giả định tiến trình bị ngắt vào thời điểm tồi tệ nhất, sau đó kiểm tra xem lệnh nào vẫn đang hoạt động tại nhà môi giới.

Thời gian hiệu lực áp dụng cho từng lệnh

Mỗi lệnh mang theo thiết lập thời gian hiệu lực riêng. Một lệnh vào trong ngày kết hợp với các lệnh con GTC (Good Till Cancelled) là một sự kết hợp phổ biến nhưng bất tiện: lệnh vào hết hạn khi đóng cửa trong khi các lệnh con không bao giờ kích hoạt, để lại một bracket không hoạt động vào sáng hôm sau. Sự kết hợp ngược lại sẽ để lại sự bảo vệ hết hạn vào lúc 4 giờ chiều ET đối với vị thế được giữ qua đêm.

Ngoài giờ giao dịch thông thường, bản chất của sổ lệnh sẽ thay đổi. Bảng dưới đây phân loại các thanh nến một phút của SPY theo thời gian ET trong suốt cả ngày và đọc hai thông tin mỗi nửa giờ: quy mô trung bình của một biến động một phút, tính bằng điểm cơ bản (một điểm cơ bản bằng một phần trăm của một phần trăm), và khối lượng trung vị được ghi nhận trong một phút.

Truy vấnBiến động giá theo phút và khối lượng giao dịch của SPY theo giờ ET
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Bảng trả về 32 nhóm nửa giờ, từ 04:00 đến 19:30 ET. Đọc từ trái sang phải, hình dạng của biểu đồ sẽ cho thấy điều đó. Cả hai chuỗi dữ liệu đều nằm gần mức thấp nhất trong giờ trước khi mở cửa, tăng mạnh vào lúc 09:30 khi mở cửa, và giảm dần sau 16:00. Một lệnh dừng GTC nằm chờ lúc 5 giờ sáng đang nằm trong phần mỏng nhất của đường cong đó, và việc khớp lệnh dừng thị trường trong một sổ lệnh mỏng như vậy có thể dẫn đến mức giá cách xa mức kích hoạt.

Câu hỏi thường gặp

Sự khác biệt giữa bracket order và OCO order là gì?

OCO là chính cặp lệnh đó: hai lệnh đang chờ với một liên kết hủy, nơi việc khớp một lệnh sẽ loại bỏ lệnh kia. Bracket là một lệnh vào vị thế với một cặp OCO đính kèm, và cặp lệnh này chỉ hoạt động khi lệnh vào khớp. Mọi bracket đều chứa một OCO. Nhiều cặp OCO được sử dụng độc lập.

Bracket order có còn hoạt động nếu máy tính của tôi bị tắt không?

Điều đó phụ thuộc vào nơi đặt liên kết. Một bracket phía nhà môi giới nằm trên máy chủ của nhà môi giới và tiếp tục hoạt động khi nền tảng đã đóng. Một bracket phía nền tảng hoặc mô phỏng cần ứng dụng phải đang chạy và kết nối, và các lệnh con có thể không bao giờ đến được thị trường nếu không có nó.

Điều gì xảy ra với lệnh dừng lỗ nếu lệnh chốt lời khớp một phần?

Lệnh dừng lỗ bị giảm theo khối lượng đã khớp thay vì bị hủy. Nếu lệnh chốt lời 200 cổ phiếu khớp 60 cổ phiếu, lệnh dừng lỗ giảm xuống còn 140 cổ phiếu, khớp với vị thế vẫn đang mở. Lệnh hủy chỉ được kích hoạt khi phần cuối cùng của vị thế được đóng lại.

Tôi có thể sử dụng bracket order trong giao dịch trước hoặc sau giờ mở cửa không?

Cách thức hoạt động tùy thuộc vào nhà môi giới, và nhiều nơi chỉ định tuyến các lệnh con của bracket trong giờ giao dịch thông thường. Đặc biệt, các lệnh dừng thường bị từ chối hoặc bị giữ lại ngoài khung giờ 9:30 sáng đến 4:00 chiều ET đối với cổ phiếu Mỹ. Thiết lập thời gian hiệu lực trên mỗi lệnh sẽ quyết định liệu lệnh đó có đủ điều kiện cho phiên giao dịch mở rộng hay không.

Các sở giao dịch có biết rằng hai lệnh của tôi được liên kết với nhau không?

Không. Đối với cổ phiếu Mỹ, liên kết hủy được giữ bởi nhà môi giới hoặc nền tảng, và sở giao dịch nhận được hai lệnh độc lập. Thông báo hủy cho lệnh còn lại được gửi bởi hệ thống giữ liên kết, sau khi lệnh kia báo cáo đã khớp.


Mọi bảng ở đây đều đi kèm với mã SQL chính xác bên dưới. Để đo lường phạm vi biến động và rủi ro khoảng trống giá trên một cổ phiếu bạn theo dõi, hãy đặt câu hỏi bằng tiếng Anh đơn giản trên thiết bị đầu cuối Strasmore.

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