Sửa lệnh có làm mất ưu tiên hàng đợi?
Đổi giá limit order sẽ mất ưu tiên và giảm xác suất khớp. Tìm hiểu chi phí của việc sửa lệnh và khoảng cách re-price hòa vốn cho bot.
Việc sửa lệnh và duy trì ưu tiên trong hàng đợi thường mâu thuẫn với nhau. Trên các sổ lệnh cổ phiếu Mỹ và phần lớn các sàn futures, thay đổi giá của một limit order đang chờ sẽ đưa lệnh xuống cuối hàng tại mức giá mới. Tăng khối lượng hiển thị cũng có tác động tương tự. Giảm khối lượng vẫn giữ nguyên vị trí của lệnh. Hủy lệnh rồi gửi một lệnh mới được xem là lệnh đến sau, với timestamp mới, bất kể nút trên nền tảng của bạn được gọi là gì.
Sửa lệnh có làm mất ưu tiên trong hàng đợi không?
Bốn quy tắc dưới đây áp dụng cho gần như mọi venue mà nhà đầu tư tự giao dịch sẽ sử dụng.
- Thay đổi giá sẽ làm mất ưu tiên. Lệnh được đưa vào mức giá mới như một lệnh mới, đứng sau tất cả lệnh đã nằm chờ tại đó.
- Tăng khối lượng hiển thị sẽ làm mất ưu tiên. Một số venue chỉ xếp lại phần khối lượng tăng thêm và giữ nguyên phần ban đầu, trong khi các venue khác tính lại thời gian cho toàn bộ lệnh. Trong cả hai trường hợp, số cổ phiếu bổ sung không thể giữ vị trí cũ.
- Giảm khối lượng hiển thị vẫn giữ ưu tiên. Venue xem đây là thao tác hủy một phần lệnh, nên việc rút bớt khối lượng không làm mất vị trí trong hàng.
- Hủy rồi gửi lại lệnh luôn làm mất ưu tiên. Giữa hai thao tác này có một khoảng thời gian không có lệnh nào của bạn đang hoạt động.
Sự bất đối xứng này có cơ sở. Ưu tiên theo thời gian là phần lợi ích mà sổ lệnh dành cho việc bạn duy trì lệnh ở một mức giá trong khi những người khác phải chờ. Tăng khối lượng hoặc di chuyển giá đồng nghĩa với việc chấp nhận rủi ro mới, và rủi ro mới luôn bắt đầu ở cuối hàng. Giảm khối lượng là rút bớt rủi ro, nên không có chi phí nào về vị trí trong hàng. Trên sổ lệnh phân bổ pro rata, cách tính sẽ khác vì việc phân bổ dựa trên khối lượng bạn hiển thị thay vì thời điểm bạn tham gia. Ưu tiên theo giá và thời gian so với phân bổ pro rata trình bày cả hai cơ chế.
Sửa lệnh tại chỗ hay hủy rồi đặt lệnh thay thế?
Tại các venue, đây là hai chỉ thị khác nhau. Sửa lệnh — trên nền tảng của bạn có thể được gọi là modify hoặc replace — là một thông điệp nêu rõ lệnh hiện hữu và nội dung thay đổi. Thao tác này có tính nguyên tử: thay đổi được áp dụng, hoặc lệnh vẫn giữ nguyên. Hủy lệnh rồi đặt lệnh mới là hai sự kiện có một khoảng trống ở giữa. Trong khoảng trống đó, bạn hoàn toàn không còn vị trí trong sổ lệnh. Nếu thị trường khớp vượt qua mức giá của bạn trong thời gian này, lệnh của bạn không có mặt để được khớp.
Một số venue xử lý sửa lệnh nội bộ như hủy lệnh và đặt lệnh mới. Một số broker cũng chuyển yêu cầu sửa lệnh thành hủy và thay thế khi gửi ra ngoài, ngay cả khi venue hỗ trợ thay đổi thực sự tại chỗ. Kết quả là như nhau: bạn mất thứ tự ưu tiên. Nếu yêu cầu sửa lệnh bị từ chối, lệnh ban đầu vẫn tiếp tục nằm chờ. Ngược lại, nếu yêu cầu hủy được thực hiện trước khi lệnh mới bị từ chối, bạn sẽ không còn lệnh nào đang hoạt động. Ngay cả khi việc sửa lệnh vẫn bảo toàn thứ tự ưu tiên, hệ thống thường trả về một mã nhận diện lệnh mới. Vì vậy, hồ sơ nội bộ của bạn hiển thị một lệnh mới, trong khi sổ lệnh vẫn xem đó là lệnh cũ.
Chi phí của việc sửa lệnh
Vị trí trong hàng chờ chỉ có giá trị tương ứng với thanh khoản mà thị trường có thể cung cấp. Các cổ phiếu đang xếp trước bạn phải được khớp trước, và tốc độ khớp của chúng biến động mạnh trong phiên.
Câu lệnh SQL chính xác đằng sau mỗi con số
SELECT
formatDateTime(toStartOfFifteenMinutes(et), '%H:%i') AS et_time,
round(toFloat64(avg(volume)) / 1000, 1) AS avg_k_shares_per_min,
round(quantileDeterministic(0.5)(toFloat64(volume),
toUInt64(toUnixTimestamp(et))) / 1000, 1) AS median_k_shares_per_min
FROM
(
SELECT
toTimeZone(window_start, 'America/New_York') AS et,
volume
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'AAPL'
AND window_start >= '2026-06-01'
AND window_start < '2026-07-01'
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
)
GROUP BY et_time
ORDER BY et_timeTrong tháng 6 năm 2026, khoảng 15 phút bắt đầu lúc 09:30 ET có trung vị 182.8 nghìn cổ phiếu AAPL được giao dịch mỗi phút, so với 62 nghìn trong khung bắt đầu lúc 12:00. Cùng một lệnh, cùng một mức giá. Thời gian chờ phía trước lệnh khác hẳn lúc mở cửa so với giữa phiên.
Xác suất khớp lệnh trước và sau khi sửa lệnh
Các sửa đổi được định giá theo xác suất. Bảng bên dưới thống kê trong một tháng giao dịch thông thường số lần mỗi phút có khối lượng khớp lệnh tối thiểu bằng một số lượng cổ phiếu nhất định. Hãy hiểu đây là xác suất một hàng đợi có quy mô như vậy ở phía trước bạn được xử lý hết trong vòng một phút.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH minute_volume AS
(
SELECT
ticker,
toStartOfMinute(toTimeZone(window_start, 'America/New_York')) AS et_minute,
sum(volume) AS shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('AAPL', 'KO')
AND window_start >= '2026-06-01'
AND window_start < '2026-07-01'
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY ticker, et_minute
)
SELECT
q.ahead AS shares_ahead,
round(100 * countIf(mv.ticker = 'AAPL' AND mv.shares >= q.ahead) / countIf(mv.ticker = 'AAPL'), 1) AS aapl_pct_of_minutes,
round(100 * countIf(mv.ticker = 'KO' AND mv.shares >= q.ahead) / countIf(mv.ticker = 'KO'), 1) AS ko_pct_of_minutes
FROM minute_volume AS mv
CROSS JOIN
(
SELECT arrayJoin([500, 1000, 2000, 4000, 8000, 16000, 32000, 64000, 128000]) AS ahead
) AS q
GROUP BY q.ahead
ORDER BY q.aheadVới 500 cổ phiếu ở phía trước, 100 phần trăm số phút của AAPL có đủ khối lượng, so với 100 phần trăm số phút của KO. Ở mức 8000 cổ phiếu, tỷ lệ của AAPL là 100 phần trăm; còn tại mức 128000 cổ phiếu, tỷ lệ này giảm xuống 22.2 phần trăm. Đường cong chỉ dốc theo một hướng. Việc mất thứ tự ưu tiên chỉ đơn giản là dịch sang bên phải trên đường cong đó.
Hãy xem đường này là mức trần lạc quan. Khối lượng giao dịch trong một phút được khớp ở nhiều mức giá và trên cả hai phía của thị trường. Chỉ một phần khối lượng đến mức giá của bạn, nên một hàng đợi thực tế sẽ được xử lý hết chậm hơn. Các phút không có giao dịch khớp nào không được tính. Ước tính vị trí của bạn trong hàng đợi giúp đánh giá chính xác hơn bằng cách bổ sung độ sâu thị trường và tỷ lệ hủy lệnh.
Khoảng cách tái định giá hòa vốn
Bây giờ, hãy định lượng chi phí của việc sửa lệnh. Giả sử có một lệnh mua đang chờ, với 8.000 cổ phiếu xếp trước lệnh đó và xác suất được khớp trong phút tiếp theo là 60%. Nâng giá bid thêm một cent sẽ đưa lệnh lên mức giá tốt nhất mới, không còn lệnh nào đứng trước. Khi đó, giả sử xác suất được khớp là 99%. Việc cải thiện này tiêu tốn một cent trên mỗi cổ phiếu trong mọi lần khớp.
Gọi V là giá trị trên mỗi cổ phiếu của một lần khớp, gồm lợi thế giao dịch và mọi khoản rebate. Gọi t là khoảng cách tái định giá. Việc sửa lệnh hòa vốn khi xác suất được khớp sau cải thiện nhân với khoản thu nhập bị giảm bằng xác suất cũ nhân với toàn bộ khoản thu nhập. Công thức rút gọn thành:
t = V x (1 - p0 / p1)
Với giá trị mỗi lần khớp là 3 cent/cổ phiếu và xác suất tăng từ 60% lên 99%, khoảng cách hòa vốn vào khoảng 1,2 cent. Nâng giá 1 cent tự bù đắp được chi phí. Đuổi giá 2 cent thì không.
Hãy áp dụng công thức tương tự cho một bot chỉ có lợi thế từ maker rebate. Theo biểu phí công bố vào giữa năm 2026, maker rebate ở nhóm cao nhất tại các sở giao dịch cổ phiếu lớn của Mỹ vào khoảng 0,20–0,30 cent/cổ phiếu, nên có thể lấy mức 0,25 cent. Công thức cho khoảng cách hòa vốn gần 0,1 cent, trong khi thay đổi giá nhỏ nhất mà bất kỳ venue nào tại Mỹ chấp nhận là tròn 1 cent, tức lớn hơn khoảng mười lần. Một bot tái định giá để bảo toàn rebate phải trả một tick để đuổi theo một phần tư cent.
Rebate chỉ được trả khi lệnh được khớp, không phải khi nhà giao dịch chỉ đặt lệnh. Một lệnh có vị trí tuyệt đẹp trong hàng chờ nhưng không bao giờ được giao dịch sẽ không tạo ra khoản thu nào. Khoản rebate không bao giờ thu được cũng không phải là một khoản tiết kiệm. Phí và rebate maker-taker trình bày cách các biểu phí này chi trả.
Khi không còn dư địa cải thiện giá
Cải thiện giá chỉ khả thi khi giữa giá bid và giá offer còn một khoảng chênh lệch. Với các mã vốn hóa lớn, phần lớn thời gian không có khoảng trống này.
Câu lệnh SQL chính xác đằng sau mỗi con số
SELECT
ticker AS symbol,
round(avg(toFloat64(ask_price) - toFloat64(bid_price)) * 100, 2) AS avg_spread_cents,
round(100 * countIf(toFloat64(ask_price) - toFloat64(bid_price) <= 0.0105) / count(), 1) AS one_tick_wide_pct
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'KO', 'SPY', 'NVDA', 'COST', 'NFLX')
AND sip_timestamp >= '2026-06-10 13:30:00'
AND sip_timestamp < '2026-06-10 20:00:00'
AND bid_price > 0
AND ask_price > bid_price
AND toFloat64(ask_price) - toFloat64(bid_price) < 5
GROUP BY ticker
ORDER BY one_tick_wide_pct DESCNFLX báo giá với spread một cent trong 81.4 phần trăm số lần cập nhật báo giá vào ngày 10 tháng 6 năm 2026, với độ rộng bình quân là 1.3 cent. Ở đầu kia của bảng, COST có độ rộng bình quân 77.53 cent. Trong thị trường chỉ có một bước giá, không tồn tại mức giá nào nằm giữa bid và offer để bạn chuyển lệnh tới. Cách duy nhất để vượt lên trước hàng đợi là crossing spread. Khi đó, bạn trở thành taker: phải trả taker fee thay vì nhận rebate, đồng thời từ bỏ toàn bộ spread thay vì chỉ mất một tick.
Tần suất bot định giá lại phải đưa ra lựa chọn
Bot bám sát thị trường không thực hiện giao dịch này chỉ một lần. Bot thực hiện mỗi khi mức giá đầu sổ lệnh dịch chuyển khỏi lệnh của mình.
Câu lệnh SQL chính xác đằng sau mỗi con số
SELECT
formatDateTime(toStartOfFifteenMinutes(et), '%H:%i') AS et_time,
uniqExactIf(bid_price, ticker = 'AAPL') AS aapl_distinct_bids,
uniqExactIf(bid_price, ticker = 'KO') AS ko_distinct_bids
FROM
(
SELECT
toTimeZone(sip_timestamp, 'America/New_York') AS et,
ticker,
bid_price
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'KO')
AND sip_timestamp >= '2026-06-10 13:30:00'
AND sip_timestamp < '2026-06-10 20:00:00'
AND bid_price > 0
)
GROUP BY et_time
ORDER BY et_timeGiá bid tốt nhất của AAPL xuất hiện tại 359 mức giá riêng biệt trong khoảng 15 phút bắt đầu từ 09:30 ET ngày 10 tháng 6 năm 2026, và 152 mức giá trong khoảng 15 phút bắt đầu từ 15:45. Giá bid tốt nhất của KO xuất hiện tại 78 mức giá trong khoảng thời gian mở cửa đó. Mỗi lần dịch chuyển như vậy là một lần sửa lệnh mà bot định giá lại có thể gửi, và mỗi lần sửa lệnh đều khởi động lại thời gian chờ. Bot grid trading chọn phương án ngược lại bằng cách đặt một chuỗi lệnh ở các mức giá cố định: các mức giá trở nên lỗi thời, nhưng thứ tự ưu tiên vẫn được duy trì.
Iceberg và cơ chế ngăn tự khớp lệnh
Có hai hiệu ứng bậc hai thường khiến nhà đầu tư mắc sai lầm.
Lệnh dự trữ, thường được gọi là lệnh iceberg, chỉ hiển thị một phần và giữ phần còn lại ở trạng thái ẩn. Trên hầu hết sổ lệnh, mỗi lần làm mới phần hiển thị sẽ đưa lệnh xuống cuối hàng chờ tại mức giá đó. Vì vậy, một lệnh iceberg lớn hoạt động như một chuỗi lệnh nhỏ liên tục phải nhường vị trí cho khối lượng được hiển thị đầy đủ. Việc điều chỉnh khối lượng hiển thị sẽ khởi động lại chu kỳ tương tự.
Cơ chế ngăn tự khớp lệnh là yếu tố còn lại. Các venue không cho phép lệnh của một thành viên khớp với lệnh đang chờ của chính thành viên đó. Biện pháp xử lý thông thường là hủy một trong hai lệnh, hoặc tại một số venue là hủy cả hai. Một bot điều chỉnh giá trên sổ lệnh có spread hẹp có thể làm mất chính báo giá của mình ở phía đối diện. Khi đó, một lần điều chỉnh lệnh khiến lệnh mất hai vị trí trong hàng chờ. Thông thường, lệnh được điều chỉnh vẫn giữ nguyên hiệu lực theo thời gian của lệnh ban đầu, trong khi thao tác hủy và đặt lại sẽ đặt lại thứ tự thời gian. Chi tiết này được đề cập trong thời hạn hiệu lực của lệnh.
Câu hỏi thường gặp
Việc thay đổi giá của lệnh giới hạn có làm mất vị trí trong hàng đợi không?
Có. Trên sổ lệnh cổ phiếu Mỹ và tại hầu hết các sàn futures, lệnh được xem là lệnh mới ở mức giá mới và đứng sau toàn bộ khối lượng đã chờ khớp tại đó. Thay đổi duy nhất vẫn giữ được thứ tự ưu tiên là giảm khối lượng tại cùng một mức giá.
Hủy và thay thế có giống với sửa lệnh không?
Hai thao tác này khác nhau tùy sàn. Sửa lệnh là một thông điệp duy nhất và có thể giữ thứ tự ưu tiên nếu chỉ giảm khối lượng. Hủy và thay thế là hai sự kiện, giữa chúng có một khoảng thời gian không có lệnh nào của bạn nằm trên sổ lệnh; lệnh thay thế luôn phải đứng cuối hàng đợi.
Giảm khối lượng lệnh có giữ được thứ tự ưu tiên trong hàng đợi không?
Có, nếu vẫn ở cùng một mức giá. Các sàn xem việc giảm khối lượng là hủy một phần, còn số cổ phiếu còn lại vẫn giữ timestamp ban đầu. Tăng khối lượng không được xử lý theo cách tương tự.
Vị trí trong hàng đợi thực sự có giá trị bao nhiêu?
Đó là xác suất được khớp nhân với giá trị mà một giao dịch khớp lệnh mang lại cho bạn. Có thể đo lường cả hai yếu tố này: các biểu đồ ở trên cho thấy khối lượng được khớp mỗi phút, còn lợi thế giao dịch của bạn cùng với mọi khoản rebate sẽ xác định giá trị của một lần khớp lệnh.
Mỗi biểu đồ tại đây đều kèm theo câu lệnh SQL đã tạo ra biểu đồ đó. Hãy thay ticker hoặc khoảng thời gian, rồi đặt cùng câu hỏi cho bất kỳ mã nào trên terminal Strasmore.