Bracket ও OCO Order কীভাবে কাজ করে
Bracket order কী, profit target ও protective stop কীভাবে OCO হিসেবে যুক্ত থাকে, partial fill হলে কী ঘটে এবং linkage কোথায় থাকে তা জানুন।
একটি bracket order হলো এমন একটি নির্দেশ, যা নির্দিষ্ট সম্পর্ক বজায় রেখে তিনটি order পাঠায়: একটি entry order এবং তার সঙ্গে যুক্ত দুটি exit order, যেগুলো entry order-এর দুই পাশে থাকে। এই জোড়াটিই OCO, যার অর্থ one cancels the other। Profit-target limit entry price-এর ওপরে থাকে এবং protective stop তার নিচে থাকে। যেকোনো একটি কার্যকর হলে অন্যটি স্বয়ংক্রিয়ভাবে বাতিল হয়। আসলে bracket একটি ছোট state machine-এর মতো কাজ করে। এর state পরিবর্তনের মধ্যবর্তী মুহূর্তগুলোতেই বেশিরভাগ অপ্রত্যাশিত ঘটনা ঘটে।
Bracket order কী?
ধরা যাক, একজন trader প্রায় $50 দামে 200টি শেয়ার কিনতে চান। লেনদেন অনুকূলে গেলে প্রায় $53 দামে position বন্ধ করতে চান। আর অনুকূলে না গেলে প্রায় $48.50 দামে position থেকে বের হতে চান। আলাদা ticket হিসেবে লিখলে এটি তিনটি order এবং একটি manual কাজ: target কার্যকর হওয়ার সঙ্গে সঙ্গে stop বাতিল করতে হবে। তা না হলে 200টি শেয়ার দুইবার বিক্রি হওয়ার ঝুঁকি থাকে। Bracket একই উদ্দেশ্যকে একটি submission হিসেবে প্যাকেজ করে। Entry হলো একটি সাধারণ market order বা limit order। দুটি exit হলো তার child order: একটি target price-এ position বন্ধ করার limit order এবং protective level-এ position বন্ধ করার জন্য একটি stop বা stop limit order।
পরিভাষা brokerভেদে আলাদা হতে পারে। Bracket, attached order, OCO bracket এবং OTOCO—সবগুলোই এই কাঠামো বোঝায়। OTOCO-এর পূর্ণ অর্থ one triggers a one-cancels-the-other। Sequence-টির সবচেয়ে সরাসরি নাম এটিই: entry pair-টিকে সক্রিয় করে, তারপর pair নিজেকে এমনভাবে কমিয়ে আনে যাতে একটি order অবশিষ্ট থাকে।
Bracket order-এ OCO বলতে কী বোঝায়?
OCO হলো দুটি resting order, যাদের মধ্যে cancel link থাকে। দুটি order একই সময়ে book-এ সক্রিয় থাকে। একটি কার্যকর হলে অন্যটি সরিয়ে নেওয়া হয়। একটি আংশিকভাবে কার্যকর হলে অন্যটি পুরোপুরি সরিয়ে নেওয়ার বদলে কার্যকর হওয়া quantity অনুযায়ী কমানো হয়। এর ফলে position এবং তার protection শেয়ার-প্রতি সামঞ্জস্যপূর্ণ থাকে।
200-share long bracket-এর সম্পূর্ণ sequence এভাবে চলে।
- Entry একাই সক্রিয় থাকে। Target এবং stop broker-এর system-এর মধ্যে থাকে, কিন্তু working order নয়। তাই entry পূরণ না হওয়া অবস্থায় target price অতিক্রম করে কোনো print হলেও কিছু ঘটে না।
- Entry 200 শেয়ারে পূরণ হয়। দুটি child order-ই সক্রিয় হয়, প্রতিটি 200 শেয়ারের জন্য।
- Trading stop price-এ পৌঁছায়। Stop একটি live sell order-এ রূপান্তরিত হয় এবং book-এ কার্যকর হতে শুরু করে।
- বাজারের দিক বদলে যাওয়ার আগে stop 120 শেয়ারে পূরণ হয়। Target limit 200 থেকে কমে 80 হয়, যাতে অবশিষ্ট position-এর সঙ্গে সামঞ্জস্য থাকে।
- পরে session-এ অবশিষ্ট 80 শেয়ার target price-এ পূরণ হয়। Stop-এর অবশিষ্ট 80 শেয়ার বাতিল হয় এবং bracket বন্ধ হয়ে যায়।
Entry-তে partial fill হলে platformগুলোর মধ্যে সবচেয়ে বেশি পার্থক্য দেখা যায়। কিছু broker সঙ্গে সঙ্গে পূরণ হওয়া quantity অনুযায়ী child order সক্রিয় করে এবং entry-এর বাকি অংশ পূরণ হওয়ার সঙ্গে সঙ্গে সেগুলো বাড়ায়। অন্যরা entry পুরোপুরি পূরণ না হওয়া পর্যন্ত অপেক্ষা করে। এতে ওই সময় position অরক্ষিত থাকে। Brokerভেদে semantics-এর পার্থক্য কেবল আনুষ্ঠানিক নয়। Partial entry fill হলে child order সক্রিয় হবে কি না এবং একটি child সম্পাদনা করলে অন্যটির cancel link বিচ্ছিন্ন হবে কি না—এসব বিষয়ে বাস্তব পার্থক্য থাকে।
দুটি leg-এর মধ্যে দূরত্ব কত হওয়া উচিত?
দুটি leg-ই কোনো নামের সাধারণ দিনের noise-এর বাইরে এবং তার বাস্তবে অতিক্রম করার মতো দূরত্বের মধ্যে থাকা উচিত। Daily range হলো এর প্রথম সরল মাপ। নিচের panel-এ গত এক বছরে ছয়টি বহুল পরিচিত নামের data দেখানো হয়েছে: open-এর শতাংশ হিসেবে high-to-low range-এর median এবং তার পাশে open থেকে close পর্যন্ত median absolute move।
প্রতিটি সংখ্যার পেছনের সঠিক 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ছয়টির মধ্যে NVDA-এর সাধারণ session range সবচেয়ে বিস্তৃত, 2.72%। আর SPY-এর range সবচেয়ে সংকীর্ণ, 0.86%। লক্ষ্য করুন, প্রতিটি row-তেই দ্বিতীয় column প্রথমটির তুলনায় কত নিচে। একটি সাধারণ session-এ কোনো নাম open থেকে close পর্যন্ত net move-এর চেয়ে অনেক বেশি দূরত্ব অতিক্রম করে। Bracket-এর দুটি leg-ই এই intraday movement-এর মধ্যে থাকে। তাই একই সাধারণ দিনে target এবং stop—দুটিই কার্যকর হতে পারে।
Bracket leg কত ঘন ঘন স্পর্শ করা হয়?
Entry থেকে দূরত্বই trader বাস্তবে নিয়ন্ত্রণ করতে পারেন। পরের panel-এ প্রশ্নটি SPY-এর তিনটি নির্দিষ্ট বছরের session-এ সীমাবদ্ধ করা হয়েছে। Opening print থেকে বিভিন্ন নির্দিষ্ট দূরত্বের ক্ষেত্রে কত শতাংশ session-এ দাম ওই দূরত্ব পর্যন্ত নিচে এবং কত শতাংশ session-এ ওই দূরত্ব পর্যন্ত ওপরে গিয়েছিল, তা দেখানো হয়েছে।
প্রতিটি সংখ্যার পেছনের সঠিক 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 থেকে এক-চতুর্থাংশ শতাংশ দূরত্বে, 62.3% session কোনো এক সময় ওই দূরত্ব পর্যন্ত নিচে লেনদেন করেছে এবং 64.7% session ওই দূরত্ব পর্যন্ত ওপরে লেনদেন করেছে। দূরত্ব 3%-এ বাড়ালে downside figure কমে 0.5% হয়। দুটি curve একসঙ্গে কমে যায়। Bracket sizing-এর মূল টানাপোড়েন এখানেই। Tight stop হলো এমন stop, যা সাধারণ দিনেও কার্যকর হয়ে যায়। আর distant target হলো এমন target, যা বেশিরভাগ সময় পূরণ না হয়েই মেয়াদ শেষ করে।
Stop loss কি সবসময় stop price-এ পূরণ হয়?
না। Stop হলো এমন একটি নির্দেশ, যেখানে trigger price-এ print হলে একটি order পাঠানো হয়। সাধারণ stop একটি market order পাঠায়। ফলে ওই মুহূর্তে book-এ যে price থাকে, fill সেখানেই হতে পারে। Stop limit আপনার নির্ধারিত price-এ একটি limit order পাঠায়। এতে price সুরক্ষিত থাকে, কিন্তু একেবারেই fill না হওয়ার ঝুঁকি গ্রহণ করতে হয়। এই trade-off-টি stop order বনাম stop limit order-এর আলোচনার বিষয়।
Overnight gap হলো এর সবচেয়ে স্পষ্ট উদাহরণ। Exchange বন্ধ থাকার সময়ও একটি protective stop বহাল থাকে। তাই opening print trigger-এর চেয়ে অনেক দূরের price-এ হতে পারে। সাড়ে তিন বছরে 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% ছিল। ওই gapগুলোর মধ্যে যেকোনো জায়গায় থাকা protective stop trigger price-এ নয়, opening print-এ order-এ রূপান্তরিত হয়েছে। শুধু intraday range ব্যবহার করে bracket-এর size নির্ধারণ করলে এই দূরত্বের ঝুঁকি হিসাবের বাইরে থেকে যায়।
OCO link আসলে কোথায় থাকে?
প্রায় কখনোই exchange-এ নয়। দুটি child order-এর মধ্যকার cancel link broker-এর order-management system-এ থাকে। কখনও এটি আপনার নিজের machine-এ চলা trading platform-এর আরও বাইরের একটি layer-এ থাকে। Exchange দুটি সাধারণ, পরস্পর-সম্পর্কহীন order দেখতে পায়।
এই অবস্থানই ঠিক করে outage-এর সময় কী টিকে থাকবে। Broker-side bracket laptop বন্ধ হয়ে গেলেও কাজ করতে থাকে, কারণ broker-এর server-এ দুটি leg এবং cancel logic থাকে। Platform-side bracket—কিছু charting application যেভাবে locally প্রয়োগ করে—তার জন্য application চালু এবং connected থাকা প্রয়োজন। কিছু platform একটি simulated stop রাখে, যা trigger price print না হওয়া পর্যন্ত কেবল local memory-তে থাকে। Laptop বন্ধ করলে stop-টি কখনোই পাঠানো হয় না।
একই প্রশ্ন আপনার নিজের code-এর ক্ষেত্রেও প্রযোজ্য। কোনো running process-এর ভেতরে থাকা stop process বন্ধ হলে book-এ আর resting order হিসেবে থাকে না। Trading bot-এর circuit breaker automated system-এর জন্য এই কাঠামো ব্যাখ্যা করে: process সবচেয়ে খারাপ সম্ভাব্য মুহূর্তে বন্ধ হয়ে যেতে পারে ধরে নিন। এরপর broker-এর কাছে তখনও কী working আছে, তা যাচাই করুন।
প্রতিটি leg-এর ক্ষেত্রে time in force প্রযোজ্য
প্রতিটি leg-এর নিজস্ব time in force setting থাকে। GTC child order-এর সঙ্গে day entry যুক্ত করা একটি প্রচলিত কিন্তু সমস্যাজনক সমন্বয়। Entry close-এ expire হয়ে যায়, কিন্তু child order কখনো সক্রিয় হয় না। ফলে পরদিন সকালে bracket নীরবে কোনো কাজ করে না। বিপরীত সমন্বয়ে overnight ধরে রাখা position-এর protection 4:00 p.m. ET-তে expire হয়ে যায়।
Regular hours-এর বাইরে book-এর চরিত্রও বদলে যায়। নিচের panel-এ পুরো দিনের ET clock time অনুযায়ী SPY-এর minute bar-গুলোকে ভাগ করা হয়েছে। প্রতি half hour-এ দুটি বিষয় দেখানো হয়েছে: এক মিনিটের move-এর average size, basis point-এ; এবং এক মিনিটে print হওয়া volume-এর median। এক basis point হলো এক শতাংশের একশতাংশ।
প্রতিটি সংখ্যার পেছনের সঠিক 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 bucket রয়েছে, 04:00 থেকে 19:30 ET পর্যন্ত। বাম থেকে ডানে পড়লে pattern-টি স্পষ্ট হয়। Premarket hours-এ দুটি series-ই তাদের সর্বনিম্ন স্তরের কাছাকাছি থাকে। 09:30 open-এর দিকে দ্রুত বাড়ে এবং 16:00-এর পর আবার কমে যায়। সকাল 5টায় বহাল থাকা একটি GTC stop এই curve-এর thin অংশে অবস্থান করে। এত পাতলা book-এ stop-market fill trigger price থেকে অনেক দূরে হতে পারে।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Bracket order এবং OCO order-এর মধ্যে পার্থক্য কী?
OCO হলো pair নিজেই: দুটি resting order-এর মধ্যে cancel link থাকে এবং একটি কার্যকর হলে অন্যটি সরিয়ে নেওয়া হয়। Bracket হলো একটি entry order, যার সঙ্গে OCO pair যুক্ত থাকে। Entry পূরণ না হওয়া পর্যন্ত pair সক্রিয় হয় না। প্রতিটি bracket-এর মধ্যে একটি OCO থাকে। তবে অনেক OCO pair আলাদাভাবেও ব্যবহৃত হয়।
আমার computer বন্ধ থাকলে কি bracket order কাজ করবে?
Linkage কোথায় থাকে, তার ওপর নির্ভর করে। Broker-side bracket broker-এর server-এ থাকে এবং platform বন্ধ থাকলেও কাজ করতে থাকে। Platform-side বা simulated bracket-এর জন্য application চালু এবং connected থাকা প্রয়োজন। এটি ছাড়া child order বাজারে নাও পৌঁছাতে পারে।
Profit target আংশিকভাবে পূরণ হলে stop-এর কী হয়?
Stop পূরণ হওয়া quantity অনুযায়ী কমে যায়, বাতিল হয় না। 200-share target-এর মধ্যে 60 শেয়ার পূরণ হলে stop 140 শেয়ারে নেমে আসে। এতে খোলা position-এর সঙ্গে stop-এর সামঞ্জস্য থাকে। Position-এর শেষ শেয়ারটি বন্ধ হলেই কেবল cancel কার্যকর হয়।
Premarket বা after-hours trading-এ কি bracket order ব্যবহার করা যায়?
আচরণ brokerভেদে আলাদা। অনেক broker কেবল regular hours-এ bracket child order route করে। বিশেষ করে US equities-এ 9:30 a.m. থেকে 4:00 p.m. ET-এর বাইরে stop order প্রায়ই reject করা হয় বা hold করে রাখা হয়। প্রতিটি leg-এর time-in-force setting ঠিক করে ওই leg extended session-এর জন্য eligible কি না।
আমার দুটি order linked—এটা কি exchange জানে?
না। US equities-এ cancel link broker বা platform-এর কাছে থাকে। Exchange দুটি independent order পায়। একটি leg পূরণ হওয়ার খবর পাওয়ার পর যে system link ধরে রেখেছে, সেটিই অবশিষ্ট leg বাতিল করার message পাঠায়।
এখানে প্রতিটি panel-এর নিচে ব্যবহৃত সঠিক SQL দেওয়া আছে। আপনি যে নামটি অনুসরণ করেন, তার range এবং gap risk মাপতে Strasmore terminal-এ প্রশ্নটি সাধারণ ইংরেজিতে লিখুন।