آموزش سفارش براکت و OCO در معاملات بورسی
سفارش براکت چیست و چگونه با استفاده از OCO حد سود و حد ضرر را مدیریت میکند. بررسی نحوه عملکرد این دستورات در زمان پر شدن بخشی از سفارش و مدیریت ریسک در معاملات.
سفارش براکت (Bracket Order) چیست؟
سفارش براکت دستوری است که سه سفارش را در یک رابطه ثابت ارسال میکند: یک سفارش ورود، به همراه یک جفت سفارش خروج مرتبط که در دو طرف آن قرار میگیرند. این جفت، یک OCO یا «یکی دیگری را لغو میکند» (One Cancels the Other) است. یک سفارش حد سود (Limit) بالاتر از قیمت ورود و یک سفارش حد ضرر (Stop) پایینتر از آن قرار میگیرد و اجرای هر یک از این دو، دیگری را بهطور خودکار لغو میکند. براکت در واقع یک ماشین وضعیت کوچک است و بیشتر غافلگیریها در لحظات بین تغییر وضعیتهای آن رخ میدهد.
تصور کنید معاملهگری میخواهد 200 سهم را در نزدیکی قیمت 50 دلار بخرد، اگر معامله موفق بود در نزدیکی 53 دلار خارج شود و اگر ناموفق بود در نزدیکی 48.50 دلار از موقعیت خارج شود. اگر اینها به صورت سفارشهای جداگانه ثبت شوند، سه سفارش مجزا و یک کار دستی طاقتفرسا خواهند بود: باید لحظهای که حد سود پر شد، سفارش حد ضرر را لغو کنید، وگرنه ریسک فروش دوبرابری 200 سهم را میپذیرید. براکت همین قصد را در قالب یک ثبت سفارش واحد بستهبندی میکند. سفارش ورود یک سفارش بازار یا سفارش لیمیت عادی است. دو سفارش خروج، فرزندان آن هستند: یک سفارش لیمیت برای بستن موقعیت در حد سود، و یک سفارش استاپ یا استاپ لیمیت برای بستن موقعیت در سطح حفاظتی.
واژگان در این زمینه متفاوت است. براکت، سفارش پیوست (Attached Order)، براکت OCO و OTOCO همگی این ساختار را توصیف میکنند. OTOCO که مخفف «یکی، یک جفتِ لغوکننده را فعال میکند» (One Triggers a One-Cancels-the-Other) است، دقیقترین نام برای این توالی است: ورود، جفت سفارش را فعال میکند و سپس آن جفت، خود را به یکی کاهش میدهد.
معنی OCO در سفارش براکت چیست؟
OCO دو سفارش در انتظار است که یک پیوند لغو بین آنها وجود دارد. هر دو همزمان در دفتر سفارشات (Order Book) فعال هستند. وقتی یکی پر شود، دیگری حذف میشود. وقتی یکی بهصورت جزئی پر شود، سفارش دیگر بهجای حذف کامل، به اندازه مقدار پرشده کاهش مییابد؛ این کاهش همان چیزی است که باعث میشود موقعیت و محافظت آن، سهمبهسهم با هم مطابقت داشته باشند.
توالی کامل برای یک براکت خرید 200 سهمی به این صورت است:
- سفارش ورود بهتنهایی کار میکند. حد سود و حد ضرر در سیستم کارگزار وجود دارند اما سفارشهای فعال نیستند، بنابراین اگر در حالی که ورود پر نشده است، قیمتی در حد سود ثبت شود، هیچ اتفاقی نمیافتد.
- سفارش ورود برای 200 سهم پر میشود. هر دو سفارش فرزند فعال میشوند، هر کدام برای 200 سهم.
- معاملات به قیمت حد ضرر میرسند. حد ضرر به یک سفارش فروش فعال تبدیل شده و در دفتر سفارشات قرار میگیرد.
- حد ضرر 120 سهم را قبل از حرکت بازار پر میکند. سفارش حد سود از 200 به 80 کاهش مییابد تا با موقعیت باقیمانده مطابقت داشته باشد.
- آن 80 سهم آخر در ادامه جلسه معاملاتی در حد سود پر میشوند. 80 سهم باقیمانده از حد ضرر لغو شده و براکت بسته میشود.
پر شدن جزئی در سفارش ورود، جایی است که پلتفرمها بیشترین تفاوت را با هم دارند. برخی کارگزاران سفارشهای فرزند را بلافاصله برای مقدار پرشده فعال میکنند و با تکمیل بقیه ورود، آنها را افزایش میدهند. برخی دیگر منتظر میمانند تا ورود بهطور کامل پر شود که این کار باعث میشود موقعیت در آن فاصله بدون محافظت باقی بماند. تفاوتهای معنایی بین کارگزاران صرفاً ظاهری نیست: اینکه آیا فرزندان در پر شدن جزئی ورود فعال میشوند یا خیر، و اینکه آیا ویرایش یکی از فرزندان، پیوند لغو با دیگری را از بین میبرد یا نه.
دو بازوی سفارش چقدر از هم فاصله دارند؟
هر دو بازو باید خارج از نویزِ معمولِ یک نماد در یک روز عادی و داخل محدودهای باشند که قیمت واقعاً میتواند به آن برسد. دامنه روزانه (Daily Range) اولین معیار خام برای این موضوع است. جدول زیر شش نماد پرکاربرد را در طول سال گذشته نشان میدهد: میانه دامنه سقف تا کف به عنوان درصدی از قیمت بازگشایی، در کنار میانه حرکت مطلق از بازگشایی تا بسته شدن.
کد دقیق 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 DESCNVDA گستردهترین جلسه معاملاتی معمول را در میان این شش نماد با 2.72% دارد و SPY باریکترین را با 0.86%. توجه کنید که ستون دوم در هر ردیف چقدر پایینتر از اولی قرار دارد. یک نماد معمولی در طول یک جلسه معاملاتی بسیار بیشتر از خالص حرکت از بازگشایی تا بسته شدن حرکت میکند و هر دو بازوی براکت در داخل آن حرکت قرار میگیرند. حد سود و حد ضرر هر دو میتوانند در یک روز عادی قابل دستیابی باشند.
هر چند وقت یکبار یک بازوی براکت لمس میشود؟
فاصله از قیمت ورود، اهرمی است که معاملهگر واقعاً آن را کنترل میکند. جدول بعدی این پرسش را به سه سال ثابت از جلسات SPY محدود میکند و میپرسد برای مجموعهای از فواصل از قیمت بازگشایی، چه سهمی از جلسات در مقطعی از روز به آن حد پایین و چه سهمی به آن حد بالا رسیدهاند.
کد دقیق 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در فاصله یکچهارم درصد از بازگشایی، 62.3% از جلسات در مقطعی تا آن حد پایین معامله شدهاند و 64.7% تا آن حد بالا. اگر فاصله را به 3% افزایش دهیم، رقم سمت پایین به 0.5% کاهش مییابد. این دو منحنی با هم افت میکنند که همان تنش اصلی در تعیین اندازه براکت است. حد ضررِ تنگ، حد ضرری است که در روزهای معمولی فعال میشود. حد سودِ دور، حد سودی است که بیشتر اوقات بدون پر شدن منقضی میشود.
آیا حد ضرر همیشه در قیمت تعیینشده پر میشود؟
خیر. حد ضرر دستوری برای ارسال سفارش پس از ثبت قیمت ماشه (Trigger) است. یک حد ضرر ساده، یک سفارش بازار ارسال میکند و پر شدن در هر قیمتی که در آن لحظه در دفتر سفارشات موجود باشد، انجام میشود. یک استاپ لیمیت، یک سفارش لیمیت در قیمتی که شما تعیین کردهاید ارسال میکند که از قیمت دفاع کرده و ریسک پر نشدن را میپذیرد. این بدهبستان موضوع سفارش استاپ در مقابل استاپ لیمیت است.
شکاف شبانه (Overnight Gap) واضحترین مورد است. یک حد ضرر حفاظتی در ساعاتی که بازار بسته است باقی میماند و قیمت بازگشایی میتواند بسیار فراتر از قیمت ماشه باشد. ده نمونه از AAPL در طول سه سال و نیم:
کد دقیق 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بزرگترین آنها -9.45% در Aug 5, 2024 بود و دهمین مورد در لیست همچنان -2.96% بود. یک حد ضرر حفاظتی که در هر جای این شکافها قرار داشت، در قیمت بازگشایی تبدیل شد، نه در قیمت ماشه. تعیین اندازه براکت صرفاً بر اساس دامنه درونروزی، این فاصله را مدلسازینشده باقی میگذارد.
پیوند OCO واقعاً کجا قرار دارد؟
تقریباً هرگز در بورس (Exchange) نیست. پیوند لغو بین دو فرزند در سیستم مدیریت سفارشات کارگزار یا یک لایه فراتر در پلتفرم معاملاتی که روی دستگاه شما اجرا میشود، نگهداری میشود. بورس دو سفارش عادی و نامرتبط را میبیند.
این محل قرارگیری تعیین میکند که چه چیزی از قطعی سیستم جان سالم به در میبرد. براکتِ سمت کارگزار (Broker-side) هنگام بستن لپتاپ به کار خود ادامه میدهد، زیرا سرورهای کارگزار هر دو بازو و منطق لغو را نگه میدارند. براکتِ سمت پلتفرم، که برخی برنامههای نموداری بهصورت محلی پیادهسازی میکنند، نیاز دارد که برنامه در حال اجرا و متصل باشد. برخی پلتفرمها یک حد ضرر شبیهسازیشده دارند که فقط در حافظه محلی وجود دارد تا زمانی که قیمت ماشه ثبت شود. لپتاپ را ببندید و آن حد ضرر هرگز ارسال نمیشود.
همین سوال در مورد کد خودتان نیز صدق میکند. حد ضرری که فقط در یک فرآیند در حال اجرا وجود دارد، پس از توقف فرآیند، هیچ سفارشی را در دفتر سفارشات باقی نمیگذارد. مدارهای قطعکننده برای رباتهای معاملاتی الگوی سیستمهای خودکار را پوشش میدهد: فرض کنید فرآیند در بدترین لحظه ممکن از کار میافتد، سپس بپرسید چه چیزی در کارگزار همچنان فعال است.
مدت اعتبار (Time in Force) برای هر بازو اعمال میشود
هر بازو تنظیمات مدت اعتبار خاص خود را دارد. یک سفارش ورود روزانه (Day) که با فرزندان GTC (معتبر تا زمان لغو) جفت شده باشد، ترکیبی رایج و در عین حال نامناسب است: ورود در پایان روز منقضی میشود در حالی که فرزندان هرگز فعال نمیشوند و براکتی باقی میماند که صبح روز بعد بیسروصدا هیچ کاری انجام نمیدهد. جفتسازی معکوس، محافظتی را باقی میگذارد که در ساعت 4:00 بعدازظهر به وقت شرقی برای موقعیتی که شبانه حمل شده، منقضی میشود.
خارج از ساعات عادی، خودِ دفتر سفارشات تغییر ماهیت میدهد. جدول زیر میلههای یکدقیقهای SPY را بر اساس زمان ساعت به وقت شرقی در طول کل روز دستهبندی میکند و دو مورد را در هر نیمساعت میخواند: میانگین اندازه حرکت یکدقیقهای، بر حسب واحد پایه (هر واحد پایه یکصدم درصد است) و میانه حجم ثبتشده در یک دقیقه.
کد دقیق 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این جدول 32 سطل نیمساعته را از 04:00 تا 19:30 به وقت شرقی برمیگرداند. آن را از چپ به راست بخوانید تا شکل آن آموزشدهنده باشد. هر دو سری در ساعات پیشازبازگشایی نزدیک به کف خود هستند، با شیب تند به سمت بازگشایی 09:30 صعود میکنند و پس از 16:00 دوباره سقوط میکنند. یک حد ضرر GTC که ساعت 5 صبح قرار دارد، در بخش نازک آن منحنی قرار دارد و پر شدن استاپ-مارکت در دفتری به آن نازکی میتواند بسیار دورتر از قیمت ماشه انجام شود.
پرسشهای متداول
تفاوت بین سفارش براکت و سفارش OCO چیست؟
OCO خودِ جفت است: دو سفارش در انتظار با یک پیوند لغو، که در آن پر شدن یکی، دیگری را حذف میکند. براکت یک سفارش ورود با یک جفت OCO پیوست است و آن جفت تنها زمانی فعال میشود که ورود پر شود. هر براکت شامل یک OCO است. بسیاری از جفتهای OCO بهتنهایی استفاده میشوند.
آیا اگر کامپیوترم خاموش باشد، سفارش براکت همچنان کار میکند؟
بستگی به این دارد که پیوند کجا قرار داشته باشد. براکتِ سمت کارگزار روی سرورهای کارگزار قرار دارد و با بسته بودن پلتفرم همچنان کار میکند. براکتِ سمت پلتفرم یا شبیهسازیشده نیاز دارد که برنامه در حال اجرا و متصل باشد و سفارشهای فرزند ممکن است بدون آن هرگز به بازار نرسند.
اگر حد سود بهصورت جزئی پر شود، چه اتفاقی برای حد ضرر میافتد؟
حد ضرر بهجای لغو شدن، به اندازه مقدار پرشده کاهش مییابد. اگر حد سود 200 سهمی، 60 سهم را پر کند، حد ضرر به 140 سهم کاهش مییابد تا با موقعیت بازِ باقیمانده مطابقت داشته باشد. لغو تنها زمانی انجام میشود که آخرین بخش موقعیت بسته شود.
آیا میتوانم از سفارش براکت در معاملات پیشازبازگشایی یا پسازبسته شدن استفاده کنم؟
رفتار کارگزاران متفاوت است و بسیاری از آنها فرزندان براکت را فقط در ساعات عادی هدایت میکنند. بهویژه سفارشهای استاپ اغلب خارج از ساعت 9:30 صبح تا 4:00 بعدازظهر به وقت شرقی برای سهام ایالات متحده رد میشوند یا نگه داشته میشوند. تنظیمات مدت اعتبار روی هر بازو تعیین میکند که آیا آن بازو اصلاً برای جلسه معاملاتی تمدیدشده واجد شرایط است یا خیر.
آیا بورسها میدانند که دو سفارش من به هم مرتبط هستند؟
خیر. در سهام ایالات متحده، پیوند لغو توسط کارگزار یا پلتفرم نگهداری میشود و بورس دو سفارش مستقل دریافت میکند. پیام لغو برای بازوی باقیمانده توسط هر سیستمی که پیوند را نگه میدارد، پس از گزارش پر شدن بازوی دیگر، ارسال میشود.
هر جدول در اینجا با کد SQL دقیق زیر آن ارائه شده است. برای اندازهگیری دامنه و ریسک شکاف در نمادی که دنبال میکنید، سوال را به زبان ساده در ترمینال Strasmore بپرسید.