Bracket اور OCO Orders کی وضاحت
Bracket order کیا ہے؟ profit target اور protective stop بطور OCO کیسے منسلک ہوتے ہیں، partial fill پر کیا ہوتا ہے، اور یہ linkage حقیقت میں کہاں موجود رہتی ہے۔
ایک bracket order ایک ایسی instruction ہے جو تین orders کو ایک مقررہ تعلق کے ساتھ بھیجتی ہے: ایک entry، اور اس کے ساتھ منسلک exit کا جوڑا جو entry کے دونوں طرف رکھا جاتا ہے۔ یہ جوڑا OCO ہے، یعنی one cancels the other۔ profit-target limit، entry price سے اوپر رکھی جاتی ہے، جبکہ protective stop اس سے نیچے ہوتا ہے۔ کسی ایک leg کے fill ہوتے ہی دوسرا خودکار طور پر cancel ہو جاتا ہے۔ حقیقت میں bracket ایک چھوٹی state machine ہے، اور زیادہ تر غیر متوقع نتائج اس کی states کے درمیان منتقلی کے دوران سامنے آتے ہیں۔
Bracket order کیا ہے؟
فرض کریں ایک trader $50 کے قریب 200 shares خریدنا چاہتا ہے۔ اگر trade توقع کے مطابق چلے تو وہ position کو تقریباً $53 پر بند کرنا چاہتا ہے، اور اگر توقع کے خلاف جائے تو تقریباً $48.50 پر نکلنا چاہتا ہے۔ الگ الگ tickets کی صورت میں یہ تین orders اور ایک manual کام بنتا ہے: target fill ہوتے ہی stop کو cancel کرنا، ورنہ 200 shares دو مرتبہ فروخت ہونے کا خطرہ رہتا ہے۔ Bracket اسی ارادے کو ایک submission میں پیکج کرتا ہے۔ Entry ایک عام market order یا limit order ہوتی ہے۔ دونوں exits اس کی children ہوتی ہیں: target پر close کرنے کے لیے ایک limit، اور protective level پر close کرنے کے لیے ایک stop یا stop limit order۔
اس کے لیے استعمال ہونے والی اصطلاحات مختلف ہو سکتی ہیں۔ Bracket، attached order، OCO bracket اور OTOCO سب اسی structure کو بیان کرتے ہیں۔ OTOCO، یعنی one triggers a one-cancels-the-other، اس sequence کا سب سے واضح نام ہے: entry اس جوڑے کو activate کرتی ہے، پھر یہ جوڑا خود کو ایک order تک محدود کر دیتا ہے۔
Bracket order میں OCO کا کیا مطلب ہے؟
OCO دو resting orders ہوتے ہیں جن کے درمیان cancel link ہوتا ہے۔ دونوں ایک ہی وقت میں book میں live رہتے ہیں۔ ایک fill ہو جائے تو دوسرا واپس کھینچ لیا جاتا ہے۔ اگر ایک order جزوی طور پر fill ہو، تو دوسرے کو مکمل طور پر ہٹانے کے بجائے filled quantity کے برابر کم کر دیا جاتا ہے۔ یہی کمی position اور اس کی protection کو share-for-share matched رکھتی ہے۔
200-share long bracket کی مکمل sequence یوں چلتی ہے۔
- Entry اکیلی کام کرتی ہے۔ Target اور stop broker کے system کے اندر موجود ہوتے ہیں، لیکن working orders نہیں ہوتے۔ اس لیے entry کے unfilled رہنے کے دوران target price سے اوپر یا نیچے ہونے والا کوئی print کچھ نہیں کرتا۔
- Entry 200 shares کے لیے fill ہو جاتی ہے۔ دونوں children live ہو جاتی ہیں، اور ہر ایک 200 shares کی ہوتی ہے۔
- Trading stop price تک پہنچتی ہے۔ Stop ایک live sell order میں تبدیل ہو کر book میں execute ہونے لگتی ہے۔
- Market کے رخ بدلنے سے پہلے stop 120 shares کے لیے fill ہو جاتی ہے۔ Target limit کو 200 سے کم کر کے 80 shares کر دیا جاتا ہے، جو باقی position کے برابر ہے۔
- بعد میں اسی session میں وہ آخری 80 shares target پر fill ہو جاتی ہیں۔ Stop کی باقی 80 shares cancel کر دی جاتی ہیں اور bracket بند ہو جاتا ہے۔
Entry کے partial fills پر platforms میں سب سے زیادہ فرق نظر آتا ہے۔ کچھ brokers filled quantity کے لیے children فوراً activate کرتے ہیں اور entry کے باقی حصے کے مکمل ہونے کے ساتھ ان کا حجم بڑھاتے جاتے ہیں۔ دوسرے brokers entry کے مکمل fill ہونے تک انتظار کرتے ہیں، جس سے اس درمیانی مدت میں position غیر محفوظ رہتی ہے۔ Broker کے لحاظ سے semantics میں ایسا فرق ہوتا ہے جو محض ظاہری نہیں: children partial entry fill پر activate ہوں گی یا نہیں، اور ایک child میں editing کرنے سے دوسری کے ساتھ cancel link ٹوٹے گا یا نہیں۔
دونوں legs کے درمیان کتنا فاصلہ ہونا چاہیے؟
دونوں legs کو اس noise سے باہر ہونا چاہیے جو کسی name میں عام دن کے دوران پیدا ہوتی ہے، لیکن اس فاصلے کے اندر بھی رہنا چاہیے جتنا وہ حقیقتاً طے کر سکتا ہے۔ Daily range اس کا پہلا سادہ پیمانہ ہے۔ نیچے دیا گیا panel چھ معروف names کو گزشتہ سال کے دوران دکھاتا ہے: open کے مقابلے میں high-to-low range کا median فیصد، اور اس کے ساتھ open سے close تک absolute move کا median۔
ہر عدد کے پیچھے موجود درست 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 چھ names میں سب سے وسیع typical session دکھاتا ہے، یعنی 2.72%، جبکہ SPY سب سے narrow ہے، یعنی 0.86%۔ غور کریں کہ ہر row میں دوسرا column پہلے سے کتنا نیچے ہے۔ کوئی typical name session کے دوران open سے close کے net move کے مقابلے میں خاصا زیادہ فاصلہ طے کرتا ہے، اور دونوں bracket legs اسی movement کے اندر رہتے ہیں۔ ایک target اور ایک stop دونوں ایک ہی عام دن میں قابلِ حصول ہو سکتے ہیں۔
Bracket leg کتنی بار touch ہوتی ہے؟
Entry سے فاصلہ وہ dial ہے جسے trader حقیقتاً control کرتا ہے۔ اگلا panel SPY sessions کے تین مقررہ سالوں کا جائزہ لیتا ہے۔ اس میں opening print سے مختلف distances کے لیے یہ دیکھا گیا ہے کہ دن کے کسی مرحلے پر کتنے sessions اتنا نیچے پہنچے اور کتنے اتنا اوپر گئے۔
ہر عدد کے پیچھے موجود درست 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.distOpen سے ایک quarter of a percent کے فاصلے پر، 62.3% sessions میں market کسی وقت اتنا نیچے گئی، جبکہ 64.7% sessions میں اتنا اوپر گئی۔ فاصلے کو 3% تک بڑھانے پر downside figure کم ہو کر 0.5% رہ جاتی ہے۔ دونوں curves ایک ساتھ کم ہوتی ہیں، اور bracket sizing کا بنیادی مسئلہ یہی ہے۔ Tight stop وہ stop ہے جو غیر معمولی نہ ہونے والے دنوں میں بھی hit ہو جاتا ہے۔ Distant target وہ target ہے جو زیادہ تر unfilled رہتا ہے۔
کیا stop loss ہمیشہ stop price پر fill ہوتا ہے؟
نہیں۔ Stop ایسی instruction ہے جو trigger price print ہونے کے بعد order بھیجتی ہے۔ عام stop ایک market order بھیجتا ہے، اور fill اس لمحے book میں موجود قیمت پر ہوتا ہے۔ Stop limit، آپ کی مقرر کردہ قیمت پر limit order بھیجتا ہے۔ یہ قیمت کا دفاع کرتا ہے، لیکن اس کے بدلے مکمل طور پر unfilled رہنے کا خطرہ قبول کرنا پڑتا ہے۔ اسی trade-off کی وضاحت stop order بمقابلہ stop limit order میں کی گئی ہے۔
Overnight gap اس کی سب سے واضح مثال ہے۔ Protective stop ان اوقات میں بھی موجود رہتا ہے جب exchange بند ہوتی ہے، اور opening print trigger سے بہت آگے آ سکتی ہے۔ ساڑھے تین سال کے دوران 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ان میں سب سے بڑا gap -9.45% تھا، جو Aug 5, 2024 کو بنا، جبکہ فہرست میں دسویں gap کی پیمائش بھی -2.96% رہی۔ ان gaps کے اندر کہیں بھی رکھا ہوا protective stop opening print پر convert ہوا، نہ کہ اپنے trigger price پر۔ صرف intraday range کی بنیاد پر bracket کا size مقرر کرنے سے اس فاصلے کو model نہیں کیا جاتا۔
OCO link حقیقت میں کہاں موجود ہوتا ہے؟
تقریباً کبھی بھی exchange پر نہیں۔ دونوں children کے درمیان cancel link broker کے order-management system میں رکھا جاتا ہے، یا اس سے ایک سطح باہر، آپ کی اپنی machine پر چلنے والے trading platform میں۔ Exchange کو دو عام اور غیر متعلق orders نظر آتے ہیں۔
یہ جگہ طے کرتی ہے کہ outage کے دوران کیا برقرار رہے گا۔ Broker-side bracket اس وقت بھی کام کرتا رہتا ہے جب laptop بند ہو جائے، کیونکہ broker کے servers دونوں legs اور cancel logic کو سنبھال رہے ہوتے ہیں۔ Platform-side bracket، جیسا کہ بعض charting applications مقامی طور پر implement کرتی ہیں، کے لیے application کا چلنا اور connected رہنا ضروری ہے۔ کچھ platforms simulated stop رکھتے ہیں جو trigger price print ہونے تک صرف local memory میں موجود ہوتا ہے۔ Laptop بند کریں تو وہ stop کبھی بھیجا ہی نہیں جاتا۔
یہی سوال آپ کے اپنے code پر بھی لاگو ہوتا ہے۔ ایسا stop جو صرف running process کے اندر موجود ہو، process رکنے کے بعد book میں کوئی resting order نہیں چھوڑتا۔ Trading bots کے لیے Circuit breakers automated systems کے اس pattern کی وضاحت کرتا ہے: فرض کریں process بدترین ممکنہ لمحے پر بند ہو جاتا ہے، پھر دیکھیں کہ broker کے پاس کیا چیز اب بھی working ہے۔
Time in force ہر leg پر لاگو ہوتا ہے
ہر leg کی اپنی time in force setting ہوتی ہے۔ Day entry کے ساتھ GTC children ایک عام مگر awkward combination ہے: Entry close پر expire ہو جاتی ہے، جبکہ children کبھی activate نہیں ہوتیں۔ نتیجتاً bracket اگلی صبح خاموشی سے کچھ نہیں کرتا۔ اس کے برعکس pairing میں ایسی protection رہ جاتی ہے جو overnight رکھی گئی position پر 4:00 p.m. ET پر expire ہو جاتی ہے۔
Regular hours کے باہر book کی نوعیت خود بدل جاتی ہے۔ نیچے دیا گیا panel پورے دن کے دوران SPY minute bars کو ET clock time کے مطابق buckets میں تقسیم کرتا ہے، اور ہر half hour کے لیے دو چیزیں دکھاتا ہے: ایک-minute move کا average size، basis points میں؛ ایک basis point، percent کا hundredth ہوتا ہے؛ اور ایک minute میں print ہونے والی volume کا median۔
ہر عدد کے پیچھے موجود درست 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_timePanel 32 half-hour buckets دکھاتا ہے، جو 04:00 سے 19:30 ET تک ہیں۔ اسے بائیں سے دائیں پڑھیں؛ pattern خود وضاحت کر دیتا ہے۔ دونوں series premarket hours کے دوران اپنی کم ترین سطح کے قریب رہتی ہیں، 09:30 open کے قریب تیزی سے بڑھتی ہیں، اور 16:00 کے بعد دوبارہ کم ہو جاتی ہیں۔ صبح 5 بجے رکھا ہوا GTC stop اس curve کے thin حصے میں موجود ہوتا ہے، اور اتنی thin book میں stop-market fill trigger سے بہت دور ہو سکتا ہے۔
اکثر پوچھے جانے والے سوالات
Bracket order اور OCO order میں کیا فرق ہے؟
OCO خود جوڑا ہوتا ہے: دو resting orders جن کے درمیان cancel link ہوتا ہے، اور ایک کے fill ہونے پر دوسرا ہٹا دیا جاتا ہے۔ Bracket ایک entry order ہوتی ہے جس کے ساتھ OCO pair منسلک ہوتا ہے، اور یہ pair entry کے fill ہونے کے بعد ہی live ہوتا ہے۔ ہر bracket میں ایک OCO شامل ہوتا ہے، لیکن بہت سے OCO pairs الگ سے بھی استعمال کیے جاتے ہیں۔
کیا میرا computer بند ہونے پر بھی bracket order کام کرے گا؟
یہ اس بات پر منحصر ہے کہ linkage کہاں موجود ہے۔ Broker-side bracket broker کے servers پر رہتا ہے اور platform بند ہونے کے باوجود کام کرتا رہتا ہے۔ Platform-side یا simulated bracket کے لیے application کا چلنا اور connected رہنا ضروری ہے، ورنہ child orders market تک پہنچ ہی نہیں سکتیں۔
Profit target جزوی طور پر fill ہو تو stop کا کیا ہوتا ہے؟
Stop کو cancel کرنے کے بجائے filled quantity کے برابر کم کر دیا جاتا ہے۔ اگر 200-share target میں سے 60 shares fill ہو جائیں تو stop کم ہو کر 140 shares رہ جاتا ہے، جو اب بھی کھلی position کے برابر ہے۔ Cancel صرف اس وقت ہوتا ہے جب position کا آخری حصہ بھی بند ہو جائے۔
کیا میں premarket یا after-hours trading میں bracket order استعمال کر سکتا ہوں؟
Broker کے لحاظ سے طریقہ مختلف ہوتا ہے، اور بہت سے brokers bracket children کو صرف regular hours کے دوران route کرتے ہیں۔ خاص طور پر stop orders کو US equities میں عموماً 9:30 a.m. سے 4:00 p.m. ET کے باہر reject یا hold کر دیا جاتا ہے۔ ہر leg کی time-in-force setting طے کرتی ہے کہ وہ leg extended session کے لیے eligible ہے یا نہیں۔
کیا exchanges کو معلوم ہوتا ہے کہ میرے دونوں orders linked ہیں؟
نہیں۔ US equities میں cancel link broker یا platform کے پاس ہوتا ہے، اور exchange کو دو independent orders موصول ہوتے ہیں۔ جو system link کو hold کر رہا ہوتا ہے، وہ دوسرے leg کے fill report ہونے کے بعد باقی leg کے لیے cancel message بھیجتا ہے۔
یہاں موجود ہر panel کے ساتھ اس کے نیچے استعمال ہونے والی exact SQL بھی فراہم کی گئی ہے۔ جس name کو آپ follow کرتے ہیں اس کی range اور gap risk ناپنے کے لیے Strasmore terminal پر plain English میں سوال کریں۔