Strasmore Research
การเรียนรู้ Matt Connorโดย Matt Connor · data as of August 15, 2026 · refreshed weekly

Bracket Order และ OCO Order คืออะไร อธิบายการทำงาน

ทำความเข้าใจกลไกการทำงานของ Bracket Order และความสัมพันธ์ของคำสั่ง OCO ในการกำหนดจุดทำกำไรและตัดขาดทุน พร้อมวิเคราะห์ผลลัพธ์เมื่อคำสั่งถูกจับคู่เพียงบางส่วนและการจัดการสถานะ

Bracket order คืออะไร

ลองนึกภาพเทรดเดอร์ที่ต้องการซื้อหุ้น 200 หุ้นที่ราคาใกล้ 50 ดอลลาร์ โดยต้องการปิดสถานะที่ราคาใกล้ 53 ดอลลาร์หากเป็นไปตามแผน และต้องการตัดขาดทุนที่ราคาใกล้ 48.50 ดอลลาร์หากไม่เป็นไปตามนั้น หากส่งคำสั่งแยกกันจะเป็นการส่งคำสั่ง 3 รายการและเป็นภาระที่ต้องจัดการเอง เช่น ต้องยกเลิกคำสั่ง Stop ทันทีที่คำสั่งทำกำไร (Target) ได้รับการจับคู่ มิฉะนั้นอาจเสี่ยงต่อการขายหุ้น 200 หุ้นซ้ำสองครั้ง Bracket order จึงเป็นการรวมเจตจำนงทั้งหมดไว้ในการส่งคำสั่งเพียงครั้งเดียว โดยส่วนขาเข้า (Entry) จะเป็น market order หรือ limit order ปกติ ส่วนขาออกสองรายการจะเป็นคำสั่งลูก ได้แก่ Limit order เพื่อปิดสถานะที่ราคาเป้าหมาย และ stop หรือ stop limit order เพื่อปิดสถานะที่ระดับป้องกันความเสี่ยง

คำศัพท์ที่ใช้เรียกอาจแตกต่างกันไป เช่น Bracket, attached order, OCO bracket และ OTOCO ซึ่งทั้งหมดอธิบายรูปแบบการทำงานนี้ OTOCO หรือ one triggers a one-cancels-the-other เป็นชื่อที่ตรงตัวที่สุดสำหรับลำดับการทำงานนี้ คือขาเข้าจะเป็นตัวกระตุ้นให้เกิดคู่คำสั่ง จากนั้นคู่คำสั่งจะยกเลิกกันเองจนเหลือเพียงรายการเดียว

OCO ใน Bracket order หมายถึงอะไร

OCO คือคำสั่งที่วางรอไว้สองรายการโดยมีเงื่อนไขการยกเลิกเชื่อมโยงกัน ทั้งสองรายการจะอยู่ในระบบ (live) พร้อมกัน เมื่อรายการหนึ่งได้รับการจับคู่ อีกรายการหนึ่งจะถูกดึงออก หากรายการหนึ่งได้รับการจับคู่เพียงบางส่วน อีกรายการหนึ่งจะถูกปรับลดจำนวนลงตามจำนวนที่จับคู่ไปแล้วแทนที่จะถูกยกเลิกทันที การปรับลดนี้เองที่ช่วยให้สถานะและการป้องกันความเสี่ยงสอดคล้องกันแบบหุ้นต่อหุ้น

ลำดับการทำงานเต็มรูปแบบสำหรับ Bracket ฝั่งซื้อ (Long) จำนวน 200 หุ้น มีดังนี้

  1. ขาเข้าทำงานเพียงลำพัง ส่วน Target และ Stop จะอยู่ในระบบของโบรกเกอร์แต่ยังไม่ถือเป็นคำสั่งที่ทำงานจริง ดังนั้นหากราคาตลาดวิ่งผ่านราคา Target ในขณะที่ขาเข้ายังไม่ได้รับการจับคู่ จะไม่มีผลใดๆ เกิดขึ้น
  2. ขาเข้าได้รับการจับคู่ครบ 200 หุ้น คำสั่งลูกทั้งสองรายการจะเริ่มทำงานทันที โดยมีจำนวนรายการละ 200 หุ้น
  3. ราคาตลาดเคลื่อนที่ไปถึงราคา Stop คำสั่ง Stop จะเปลี่ยนเป็นคำสั่งขายจริงและเข้าสู่ระบบการซื้อขาย
  4. คำสั่ง Stop ได้รับการจับคู่ไป 120 หุ้นก่อนที่ราคาตลาดจะเคลื่อนที่ออกไป คำสั่ง Limit ที่ราคาเป้าหมายจะถูกปรับลดจาก 200 เหลือ 80 หุ้น เพื่อให้สอดคล้องกับสถานะที่เหลืออยู่
  5. หุ้น 80 หุ้นสุดท้ายได้รับการจับคู่ที่ราคาเป้าหมายในเวลาต่อมา คำสั่ง Stop ส่วนที่เหลืออีก 80 หุ้นจะถูกยกเลิกและ Bracket จะปิดสถานะลง

การจับคู่บางส่วน (Partial fills) ในขาเข้าเป็นจุดที่แต่ละแพลตฟอร์มมีความแตกต่างกันมากที่สุด โบรกเกอร์บางแห่งจะเปิดใช้งานคำสั่งลูกตามจำนวนที่จับคู่ได้ทันทีและเพิ่มจำนวนขึ้นเมื่อขาเข้าได้รับการจับคู่จนครบ ส่วนโบรกเกอร์อื่นอาจรอให้ขาเข้าจับคู่จนครบถ้วน ซึ่งจะทำให้สถานะไม่มีการป้องกันความเสี่ยงในช่วงเวลาดังกล่าว ความแตกต่างในเชิงเทคนิคของแต่ละโบรกเกอร์ไม่ใช่เรื่องเล็กน้อย ทั้งในแง่ของการเปิดใช้งานคำสั่งลูกเมื่อขาเข้าจับคู่บางส่วน และการที่การแก้ไขคำสั่งลูกรายการหนึ่งอาจทำให้เงื่อนไขการยกเลิกอีกรายการหนึ่งเสียไป

ขาของคำสั่งทั้งสองควรห่างกันแค่ไหน

ขาของคำสั่งทั้งสองต้องวางอยู่นอกเหนือความผันผวนปกติของหุ้นในแต่ละวัน แต่ต้องอยู่ภายในระยะที่ราคาหุ้นสามารถเคลื่อนที่ไปถึงได้จริง ช่วงราคาต่อวัน (Daily range) เป็นตัวชี้วัดเบื้องต้นที่ง่ายที่สุด ตารางด้านล่างแสดงข้อมูลหุ้น 6 ตัวในช่วงปีที่ผ่านมา โดยเปรียบเทียบค่ามัธยฐานของส่วนต่างระหว่างราคาสูงสุดและต่ำสุดเทียบกับราคาเปิด และค่ามัธยฐานของการเคลื่อนที่สัมบูรณ์จากราคาเปิดถึงราคาปิด

คำสั่งดึงข้อมูลช่วงราคาเฉลี่ยรายวันและการเปลี่ยนแปลงจากราคาเปิดถึงราคาปิด ย้อนหลัง 1 ปี
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 มีช่วงการเคลื่อนที่ในระหว่างวันกว้างที่สุดในบรรดาหุ้นทั้ง 6 ตัวที่ 2.72% และ SPY มีช่วงแคบที่สุดที่ 0.86% สังเกตว่าคอลัมน์ที่สองมีค่าต่ำกว่าคอลัมน์แรกในทุกแถว หุ้นทั่วไปมักเคลื่อนที่ได้ไกลกว่าช่วงราคาจากราคาเปิดถึงราคาปิดมาก และขาของ Bracket ทั้งสองข้างก็อยู่ภายในระยะการเคลื่อนที่นั้น ดังนั้นทั้งราคาเป้าหมายและจุดตัดขาดทุนจึงมีโอกาสถูกแตะถึงได้ในวันซื้อขายปกติวันเดียวกัน

ขาของ Bracket มีโอกาสถูกแตะถึงบ่อยแค่ไหน

ระยะห่างจากราคาเข้าคือสิ่งที่เทรดเดอร์ควบคุมได้จริง ตารางถัดไปวิเคราะห์ข้อมูลย้อนหลัง 3 ปีของ SPY โดยกำหนดระยะห่างจากราคาเปิด เพื่อดูว่าในแต่ละวันราคาเคลื่อนที่ไปถึงระดับนั้นๆ บ่อยเพียงใด

คำสั่งดึงข้อมูลสัดส่วนของช่วงการซื้อขาย SPY ที่แตะระดับราคาตามระยะห่างจากราคาเปิด (สิงหาคม 2023 ถึง กรกฎาคม 2026)
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

ที่ระยะห่างร้อยละ 0.25 จากราคาเปิด 62.3% ของวันซื้อขายมีการเคลื่อนที่ลงไปถึงระดับนั้น และ 64.7% มีการเคลื่อนที่ขึ้นไปถึงระดับนั้น หากขยายระยะห่างออกไปเป็น 3% ตัวเลขฝั่งขาลงจะลดลงเหลือ 0.5% เส้นกราฟทั้งสองเส้นลดลงไปพร้อมกัน ซึ่งเป็นหัวใจสำคัญของความสมดุลในการกำหนดขนาด Bracket จุดตัดขาดทุนที่แคบเกินไปมักจะถูกชนในวันที่ตลาดไม่มีความผันผวนผิดปกติ ส่วนราคาเป้าหมายที่ไกลเกินไปมักจะหมดอายุโดยไม่มีการจับคู่

Stop loss จะได้รับการจับคู่ที่ราคา Stop เสมอไปหรือไม่

ไม่เสมอไป Stop คือคำสั่งให้ส่งคำสั่งซื้อขายเมื่อราคาตลาดแตะระดับที่กำหนดไว้ (Trigger price) คำสั่ง Stop ปกติจะส่งเป็น Market order ซึ่งจะได้ราคาตามสภาพตลาดในขณะนั้น ส่วน Stop limit จะส่งเป็น Limit order ที่ราคาที่คุณกำหนด ซึ่งเป็นการป้องกันราคาแต่ต้องยอมรับความเสี่ยงว่าอาจไม่มีการจับคู่เกิดขึ้น การแลกเปลี่ยนระหว่างสองทางเลือกนี้เป็นหัวข้อของ stop order versus stop limit order

ช่องว่างราคาข้ามคืน (Overnight gap) เป็นกรณีที่ชัดเจนที่สุด คำสั่ง Stop จะค้างอยู่ในระบบในช่วงที่ตลาดปิด และราคาเปิดตลาดอาจกระโดดข้ามระดับ Trigger ไปไกล ตัวอย่าง 10 รายการจาก AAPL ในช่วง 3 ปีครึ่ง:

คำสั่งดึงข้อมูล10 อันดับการปรับตัวลดลงข้ามคืนที่มากที่สุดของ AAPL (มกราคม 2023 ถึง มิถุนายน 2026)
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 และรายการที่ 10 ในรายการยังวัดได้ถึง -2.96% คำสั่ง Stop ที่วางไว้ภายในช่องว่างเหล่านั้นจะถูกเปลี่ยนเป็นคำสั่งซื้อขายที่ราคาเปิดตลาด ไม่ใช่ที่ราคา Trigger การกำหนดขนาด Bracket โดยดูจากช่วงราคาในระหว่างวันเพียงอย่างเดียวจึงไม่ได้คำนึงถึงความเสี่ยงนี้

เงื่อนไข OCO เชื่อมโยงกันที่ไหน

แทบจะไม่เคยเชื่อมโยงกันที่ตลาดหลักทรัพย์ เงื่อนไขการยกเลิกคำสั่งลูกทั้งสองรายการจะถูกเก็บไว้ในระบบจัดการคำสั่งของโบรกเกอร์ หรือในระดับที่ไกลออกไปอีกคือในแพลตฟอร์มการซื้อขายที่ทำงานบนเครื่องของคุณเอง ตลาดหลักทรัพย์จะมองเห็นเป็นคำสั่งปกติสองรายการที่ไม่เกี่ยวข้องกัน

ตำแหน่งที่เก็บเงื่อนไขนี้เป็นตัวกำหนดว่าคำสั่งจะยังคงอยู่หรือไม่หากระบบขัดข้อง Bracket ที่ฝั่งโบรกเกอร์จะยังคงทำงานต่อไปแม้คุณจะปิดคอมพิวเตอร์ เนื่องจากเซิร์ฟเวอร์ของโบรกเกอร์เป็นผู้เก็บทั้งสองขาและตรรกะการยกเลิกไว้ ส่วน Bracket ฝั่งแพลตฟอร์ม ซึ่งเป็นแบบที่แอปพลิเคชันกราฟบางตัวใช้ จะต้องเปิดแอปพลิเคชันและเชื่อมต่ออยู่ตลอดเวลา แพลตฟอร์มบางแห่งใช้การจำลอง Stop ซึ่งอยู่ในหน่วยความจำเครื่องเท่านั้นจนกว่าราคา Trigger จะถูกแตะ หากปิดคอมพิวเตอร์ คำสั่ง Stop นั้นก็จะไม่ถูกส่งออกไป

คำถามเดียวกันนี้ใช้กับโค้ดของคุณเองด้วย คำสั่ง Stop ที่อยู่ในกระบวนการที่กำลังทำงานอยู่เท่านั้นจะไม่เหลือคำสั่งค้างในระบบหากกระบวนการนั้นหยุดทำงาน Circuit breakers for trading bots ครอบคลุมรูปแบบสำหรับระบบอัตโนมัติ: ให้สมมติว่ากระบวนการหยุดทำงานในจังหวะที่เลวร้ายที่สุด แล้วตรวจสอบว่ายังมีคำสั่งใดทำงานอยู่ที่โบรกเกอร์บ้าง

Time in force มีผลกับแต่ละขาของคำสั่ง

แต่ละขาของคำสั่งจะมีค่า time in force ของตัวเอง การจับคู่ขาเข้าแบบ Day กับคำสั่งลูกแบบ GTC เป็นการผสมผสานที่พบบ่อยและอาจเกิดปัญหาได้: ขาเข้าจะหมดอายุเมื่อปิดตลาดในขณะที่คำสั่งลูกไม่เคยเปิดใช้งาน ทำให้ Bracket กลายเป็นคำสั่งที่ไม่มีผลใดๆ ในเช้าวันถัดไป ในทางกลับกัน การตั้งค่าแบบย้อนกลับอาจทำให้การป้องกันความเสี่ยงหมดอายุลงที่เวลา 16:00 น. ET สำหรับสถานะที่ถือข้ามคืน

นอกเวลาทำการปกติ สภาพคล่องของตลาดจะเปลี่ยนไป ตารางด้านล่างแบ่งแท่งราคา 1 นาทีของ SPY ตามเวลา ET ตลอดทั้งวัน และแสดงข้อมูลสองอย่างต่อครึ่งชั่วโมง: ขนาดเฉลี่ยของการเคลื่อนที่ใน 1 นาที (หน่วยเป็น basis points โดย 1 basis point เท่ากับร้อยละ 0.01) และปริมาณการซื้อขายมัธยฐานใน 1 นาที

คำสั่งดึงข้อมูลการเคลื่อนไหวของราคาและปริมาณการซื้อขายรายนาทีของ SPY ตามเวลา ET
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:00 ถึง 19:30 ET เมื่ออ่านจากซ้ายไปขวาจะเห็นรูปแบบที่ชัดเจน ทั้งสองชุดข้อมูลจะอยู่ใกล้ระดับต่ำสุดในช่วงก่อนตลาดเปิด (premarket) เพิ่มขึ้นอย่างรวดเร็วในช่วงเปิดตลาดเวลา 09:30 น. และลดลงหลังจาก 16:00 น. คำสั่ง GTC Stop ที่วางไว้ตอนตี 5 จะอยู่ในช่วงที่สภาพคล่องเบาบาง และการจับคู่ Stop-market ในสภาวะที่สภาพคล่องต่ำเช่นนั้นอาจทำให้ได้ราคาที่ห่างจากราคา Trigger มาก

คำถามที่พบบ่อย

Bracket order กับ OCO order ต่างกันอย่างไร

OCO คือตัวคู่คำสั่งเอง: คำสั่งสองรายการที่วางรอไว้พร้อมเงื่อนไขการยกเลิก โดยการจับคู่รายการหนึ่งจะยกเลิกอีกรายการหนึ่ง ส่วน Bracket คือคำสั่งขาเข้าที่มีคู่ OCO พ่วงอยู่ด้วย โดยคู่คำสั่งจะเริ่มทำงานก็ต่อเมื่อขาเข้าได้รับการจับคู่แล้ว Bracket ทุกรายการจะมี OCO อยู่ภายใน แต่ OCO หลายรายการก็ถูกใช้งานแยกต่างหากได้เช่นกัน

Bracket order ยังคงทำงานอยู่หรือไม่หากปิดคอมพิวเตอร์

ขึ้นอยู่กับว่าเงื่อนไขการเชื่อมโยงอยู่ที่ไหน Bracket ฝั่งโบรกเกอร์จะค้างอยู่ในเซิร์ฟเวอร์ของโบรกเกอร์และทำงานต่อไปแม้จะปิดแพลตฟอร์มแล้ว ส่วน Bracket ฝั่งแพลตฟอร์มหรือแบบจำลองจำเป็นต้องเปิดแอปพลิเคชันและเชื่อมต่ออยู่ตลอดเวลา มิฉะนั้นคำสั่งลูกอาจไม่ถูกส่งไปยังตลาด

จะเกิดอะไรขึ้นกับคำสั่ง Stop หากราคาเป้าหมายได้รับการจับคู่เพียงบางส่วน

คำสั่ง Stop จะถูกปรับลดจำนวนลงตามจำนวนที่จับคู่ไปแล้วแทนที่จะถูกยกเลิก หากเป้าหมาย 200 หุ้นจับคู่ไป 60 หุ้น คำสั่ง Stop จะลดลงเหลือ 140 หุ้น เพื่อให้สอดคล้องกับสถานะที่ยังเปิดอยู่ การยกเลิกจะเกิดขึ้นก็ต่อเมื่อสถานะทั้งหมดถูกปิดลงเท่านั้น

สามารถใช้ Bracket order ในการซื้อขายช่วงก่อนหรือหลังตลาดปิดได้หรือไม่

พฤติกรรมขึ้นอยู่กับโบรกเกอร์แต่ละแห่ง โดยหลายแห่งจะส่งคำสั่งลูกของ Bracket เฉพาะในช่วงเวลาทำการปกติเท่านั้น โดยเฉพาะคำสั่ง Stop มักจะถูกปฏิเสธหรือระงับไว้นอกช่วงเวลา 09:30 น. ถึง 16:00 น. ET สำหรับหุ้นสหรัฐฯ การตั้งค่า time in force ในแต่ละขาจะเป็นตัวกำหนดว่าขานั้นสามารถใช้งานในช่วงเวลาซื้อขายพิเศษได้หรือไม่

ตลาดหลักทรัพย์ทราบหรือไม่ว่าคำสั่งสองรายการของฉันเชื่อมโยงกัน

ไม่ทราบ ในหุ้นสหรัฐฯ เงื่อนไขการยกเลิกจะถูกเก็บไว้โดยโบรกเกอร์หรือแพลตฟอร์ม และตลาดหลักทรัพย์จะได้รับคำสั่งที่เป็นอิสระต่อกันสองรายการ ข้อความยกเลิกสำหรับขาที่เหลืออยู่จะถูกส่งโดยระบบที่เก็บเงื่อนไขการเชื่อมโยงไว้ หลังจากที่อีกขาหนึ่งรายงานการจับคู่แล้ว


ทุกตารางที่นี่มาพร้อมกับ SQL ที่ใช้ดึงข้อมูลจริง หากต้องการวัดช่วงราคาและความเสี่ยงจากช่องว่างราคาของหุ้นที่คุณติดตาม สามารถสอบถามข้อมูลเป็นภาษาอังกฤษได้ที่ Strasmore terminal

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