Market Structure Break & Order Block (MSB-OB)
ZigZag Length
Fib Factor
MSB Labels
OB / BB / MB Zones
Alerts
لمحة سريعة
يهدف مؤشر MSB-OB إلى تتبّع تغيّر الاتجاه عبر نمط يشبه ZigZag ثم تأكيد كسر هيكل السوق (MSB) باستخدام عامل فيبوناتشي قابل للتعديل. عند تحقق الكسر، يقوم برسم مناطق بلوك الأوامر (Order Blocks) ومناطق Breaker/Mitigation Blocks لكل من الاتجاهين الصاعد والهابط، مع تمديد الصناديق ديناميكيًا وحذف المكسور منها اختياريًا، إضافة إلى تنبيهات دخول السعر في كل منطقة.
فكرة العمل — كيف تُحتسب الإشارات؟
ZigZag وقيعان/قمم مرجعية
- يُحدّد المؤشر نقاط قمم/قيعان وفقًا لأطوال zigzag_len عبر أعلى/أدنى قيم نسبية.
- يتغيّر trend إلى صاعد عند تكوّن قاع جديد وإلى هابط عند تكوّن قمة جديدة، مع رسم خط ZigZag اختياريًا.
- تُحفظ آخر قيم/فهرس للقمم (h0, h1) والقيعان (l0, l1) للاحتكام إليها.
تأكيد كسر الهيكل (MSB)
- يستخدم شرطًا مبنيًا على الفارق بين القمّة والقاع مع عامل فيبوناتشي fib_factor لتأكيد التحوّل بين السوق الصاعد/الهابط.
- عند تحقق التغيّر في market تُرسَم علامة MSB وخط أفقي عند مستوى الكسر (باللون الأخضر للصعود والأحمر للهبوط).
تحديد مناطق OB/BB/MB
- Bu-OB / Be-OB: تُستخرج من آخر شمعة معاكسة ضمن التأرجح السابق (شمعة حمراء قبل صعود أو خضراء قبل هبوط).
- Bu-BB / Be-BB: مناطق Breaker، وإذا لم ينطبق الشرط تتحوّل التسمية إلى MB (Mitigation Block) تلقائيًا.
- تتم إطالة الصناديق إلى اليمين وتُحذف تلقائيًا إن كُسرت (اختياري عبر الإعداد Delete Old/Broken Boxes).
التنبيهات
- تنبيه عام عند حدوث MSB (alertcondition).
- تنبيه عند دخول السعر إلى أي من مناطق BU-OB / BE-OB / BU-BB / BE-BB.
الإعدادات المتاحة
- ZigZag Length: طول التأرجح لتحديد القمم/القيعان.
- Fib Factor for breakout confirmation: عامل مرن لضبط حساسية تأكيد الكسر.
- Show Zigzag: إظهار/إخفاء خطوط ZigZag.
- Text Size: حجم نصوص العناوين داخل الصناديق.
- Delete Old/Broken Boxes: حذف الصناديق المكسورة أو القديمة تلقائيًا.
- لوحة الألوان: تخصيص ألوان، حدود، ونصوص لكل من Bu-OB / Be-OB / Bu-BB / Be-BB.
التقييم/الإشارات
- MSB: يحدث عند تغيّر حالة market وفق معايير الفيبوناتشي والقمم/القيعان المرجعية مع وضع Label على الشارت.
- Zones: تُعتبر مناطق تفاعل للسعر؛ عند دخول السعر لأي منطقة يصدر المؤشر تنبيه.
طريقة الاستخدام
- افتح TradingView ثم انتقل إلى Pine Editor.
- ألصق كود المؤشر ثم اضغط Add to chart.
- اختر الإطار الزمني المناسب لاستراتيجيتك (يعمل عبر الأطر القصيرة والمتوسطة والطويلة).
- اضبط ZigZag Length لتقليل/زيادة حساسية التأرجحات.
- عدّل Fib Factor لتشديد أو تسهيل تأكيد الكسر.
- فعّل/عطّل حذف الصناديق تلقائيًا وفق حاجتك لإبقاء السجل التاريخي.
- للتنبيهات: أنشئ Alert على شرط MSB أو Price in zone حسب تفضيلك.
تنبيه: هذه الأداة تعليمية، وليست توصية مالية أو استثمارية. قم دائمًا باختبار المؤشر وتوافقه مع خطة تداولك وإدارة المخاطر.
إظهار كود Pine Script (v5)
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
```
// © EmreKb
//@version=5
indicator("Market Structure Break & Order Block", "MSB-OB", overlay=true, max_lines_count=500, max_bars_back=4900, max_boxes_count=500)
settings = "Settings"
zigzag_len = input.int(9, "ZigZag Length", group=settings)
show_zigzag = input.bool(true, "Show Zigzag", group=settings)
fib_factor = input.float(0.33, "Fib Factor for breakout confirmation", 0, 1, 0.01, group=settings)
text_size = input.string(size.tiny, "Text Size", [size.tiny, size.small, size.normal, size.large, size.huge], group=settings)
delete_boxes = input.bool(true, "Delete Old/Broken Boxes", group=settings)
bu_ob_inline_color = "Bu-OB Colors"
be_ob_inline_color = "Be-OB Colors"
bu_bb_inline_color = "Bu-BB Colors"
be_bb_inline_color = "Be-BB Colors"
bu_ob_display_settings = "Bu-OB Display Settings"
bu_ob_color = input.color(color.new(color.green, 70), "Color", group=bu_ob_display_settings, inline=bu_ob_inline_color)
bu_ob_border_color = input.color(color.green, "Border Color", group=bu_ob_display_settings, inline=bu_ob_inline_color)
bu_ob_text_color = input.color(color.green, "Text Color", group=bu_ob_display_settings, inline=bu_ob_inline_color)
be_ob_display_settings = "Be-OB Display Settings"
be_ob_color = input.color(color.new(color.red, 70), "Color", group=be_ob_display_settings, inline=be_ob_inline_color)
be_ob_border_color = input.color(color.red, "Border Color", group=be_ob_display_settings, inline=be_ob_inline_color)
be_ob_text_color = input.color(color.red, "Text Color", group=be_ob_display_settings, inline=be_ob_inline_color)
bu_bb_display_settings = "Bu-BB & Bu-MB Display Settings"
bu_bb_color = input.color(color.new(color.green, 70), "Color", group=bu_bb_display_settings, inline=bu_bb_inline_color)
bu_bb_border_color = input.color(color.green, "Border Color", group=bu_bb_display_settings, inline=bu_bb_inline_color)
bu_bb_text_color = input.color(color.green, "Text Color", group=bu_bb_display_settings, inline=bu_bb_inline_color)
be_bb_display_settings = "Be-BB & Be-MB Display Settings"
be_bb_color = input.color(color.new(color.red, 70), "Color", group=be_bb_display_settings, inline=be_bb_inline_color)
be_bb_border_color = input.color(color.red, "Border Color", group=be_bb_display_settings, inline=be_bb_inline_color)
be_bb_text_color = input.color(color.red, "Text Color", group=be_bb_display_settings, inline=be_bb_inline_color)
var float[] high_points_arr = array.new_float(5)
var int[] high_index_arr = array.new_int(5)
var float[] low_points_arr = array.new_float(5)
var int[] low_index_arr = array.new_int(5)
var box[] bu_ob_boxes = array.new_box(5)
var box[] be_ob_boxes = array.new_box(5)
var box[] bu_bb_boxes = array.new_box(5)
var box[] be_bb_boxes = array.new_box(5)
to_up = high >= ta.highest(zigzag_len)
to_down = low <= ta.lowest(zigzag_len)
trend = 1
trend := nz(trend[1], 1)
trend := trend == 1 and to_down ? -1 : trend == -1 and to_up ? 1 : trend
last_trend_up_since = ta.barssince(to_up[1])
low_val = ta.lowest(nz(last_trend_up_since > 0 ? last_trend_up_since : 1, 1))
low_index = bar_index - ta.barssince(low_val == low)
last_trend_down_since = ta.barssince(to_down[1])
high_val = ta.highest(nz(last_trend_down_since > 0 ? last_trend_down_since : 1, 1))
high_index = bar_index - ta.barssince(high_val == high)
if ta.change(trend) != 0
if trend == 1
array.push(low_points_arr, low_val)
array.push(low_index_arr, low_index)
if trend == -1
array.push(high_points_arr, high_val)
array.push(high_index_arr, high_index)
f_get_high(ind) =>
[array.get(high_points_arr, array.size(high_points_arr) - 1 - ind), array.get(high_index_arr, array.size(high_index_arr) - 1 - ind)]
f_get_low(ind) =>
[array.get(low_points_arr, array.size(low_points_arr) - 1 - ind), array.get(low_index_arr, array.size(low_index_arr) - 1 - ind)]
f_delete_box(box_arr) =>
if delete_boxes
box.delete(array.shift(box_arr))
else
array.shift(box_arr)
0
[h0, h0i] = f_get_high(0)
[h1, h1i] = f_get_high(1)
[l0, l0i] = f_get_low(0)
[l1, l1i] = f_get_low(1)
if ta.change(trend) != 0 and show_zigzag
if trend == 1
line.new(h0i, h0, l0i, l0)
if trend == -1
line.new(l0i, l0, h0i, h0)
market = 1
market := nz(market[1], 1)
// market := market == 1 and close < l0 and low < l0 - math.abs(h0 - l0) * fib_factor ? -1 : market == -1 and close > h0 and high > h0 + math.abs(h0 - l0) * fib_factor ? 1 : market
last_l0 = ta.valuewhen(ta.change(market) != 0, l0, 0)
last_h0 = ta.valuewhen(ta.change(market) != 0, h0, 0)
market := last_l0 == l0 or last_h0 == h0 ? market : market == 1 and l0 < l1 and l0 < l1 - math.abs(h0 - l1) * fib_factor ? -1 : market == -1 and h0 > h1 and h0 > h1 + math.abs(h1 - l0) * fib_factor ? 1 : market
bu_ob_index = bar_index
bu_ob_index := nz(bu_ob_index[1], bar_index)
for i=h1i to l0i[zigzag_len]
index = bar_index - i
if open[index] > close[index]
bu_ob_index := bar_index[index]
bu_ob_since = bar_index - bu_ob_index
be_ob_index = bar_index
be_ob_index := nz(be_ob_index[1], bar_index)
for i=l1i to h0i[zigzag_len]
index = bar_index - i
if open[index] < close[index]
be_ob_index := bar_index[index]
be_ob_since = bar_index - be_ob_index
be_bb_index = bar_index
be_bb_index := nz(be_bb_index[1], bar_index)
for i=h1i - zigzag_len to l1i
index = bar_index - i
if open[index] > close[index]
be_bb_index := bar_index[index]
be_bb_since = bar_index - be_bb_index
bu_bb_index = bar_index
bu_bb_index := nz(bu_bb_index[1], bar_index)
for i=l1i - zigzag_len to h1i
index = bar_index - i
if open[index] < close[index]
bu_bb_index := bar_index[index]
bu_bb_since = bar_index - bu_bb_index
if ta.change(market) != 0
if market == 1
line.new(h1i, h1, h0i, h1, color=color.green, width=2)
label.new(int(math.avg(h1i, l0i)), h1, "MSB", color=color.new(color.black, 100), style=label.style_label_down, textcolor=color.green, size=size.small)
bu_ob = box.new(bu_ob_index, high[bu_ob_since], bar_index + 10, low[bu_ob_since], bgcolor=bu_ob_color, border_color=bu_ob_border_color, text="Bu-OB", text_color=bu_ob_text_color, text_halign=text.align_right, text_size=text_size)
bu_bb = box.new(bu_bb_index, high[bu_bb_since], bar_index + 10, low[bu_bb_since], bgcolor=bu_bb_color, border_color=bu_bb_border_color, text=l0 < l1 ? "Bu-BB" : "Bu-MB", text_color=bu_bb_text_color, text_halign=text.align_right, text_size=text_size)
array.push(bu_ob_boxes, bu_ob)
array.push(bu_bb_boxes, bu_bb)
if market == -1
line.new(l1i, l1, l0i, l1, color=color.red, width=2)
label.new(int(math.avg(l1i, h0i)), l1, "MSB", color=color.new(color.black, 100), style=label.style_label_up, textcolor=color.red, size=size.small)
be_ob = box.new(be_ob_index, high[be_ob_since], bar_index + 10, low[be_ob_since], bgcolor=be_ob_color, border_color=be_ob_border_color, text="Be-OB", text_color=be_ob_text_color, text_halign=text.align_right, text_size=text_size)
be_bb = box.new(be_bb_index, high[be_bb_since], bar_index + 10, low[be_bb_since], bgcolor=be_bb_color, border_color=be_bb_border_color, text=h0 > h1 ? "Be-BB" : "Be-MB", text_color=be_bb_text_color, text_halign=text.align_right, text_size=text_size)
array.push(be_ob_boxes, be_ob)
array.push(be_bb_boxes, be_bb)
for bull_ob in bu_ob_boxes
bottom = box.get_bottom(bull_ob)
top = box.get_top(bull_ob)
if close < bottom
f_delete_box(bu_ob_boxes)
else if close < top
alert("Price in the BU-OB zone")
else
box.set_right(bull_ob, bar_index + 10)
for bear_ob in be_ob_boxes
top = box.get_top(bear_ob)
bottom = box.get_bottom((bear_ob))
if close > top
f_delete_box(be_ob_boxes)
if close > bottom
alert("Price in the BE-OB zone")
else
box.set_right(bear_ob, bar_index + 10)
for bear_bb in be_bb_boxes
top = box.get_top(bear_bb)
bottom = box.get_bottom(bear_bb)
if close > top
f_delete_box(be_bb_boxes)
else if close > bottom
alert("Price in the BE-BB zone")
else
box.set_right(bear_bb, bar_index + 10)
for bull_bb in bu_bb_boxes
bottom = box.get_bottom(bull_bb)
top = box.get_top(bull_bb)
if close < bottom
f_delete_box(bu_bb_boxes)
else if close < top
alert("Price in the BU-BB zone")
else
box.set_right(bull_bb, bar_index + 10)
alertcondition(ta.change(market) != 0, "MSB", "MSB") كلمات مفتاحية
تداول
مؤشر
Pine Script
TradingView
Market Structure Break
Order Block
Breaker Block
Mitigation Block
ZigZag
ليست هناك تعليقات:
إرسال تعليق