پرش به محتوا
کریپکس

اسمارت مانی · اندیکاتور

اسمارت مانی: BOS، CHoCH، FVG و Order Block

ساختار بازار را خودکار علامت می‌زند: شکست ساختار (BOS)، تغییر کاراکتر (CHoCH)، گپ ارزش منصفانه (FVG) و اوردر بلاک.

smart-money-structure.pine · Pine Script v6 · ۱۱۴ خط
//@version=6
// Crypex.org | اسمارت مانی: BOS / CHoCH + FVG + Order Block
// ابزار کمکی تحلیل است، نه سیگنال خرید و فروش.
indicator("Crypex | Smart Money Concepts", overlay = true, max_boxes_count = 300, max_lines_count = 300, max_labels_count = 300)

swingLen   = input.int(5, "طول سوئینگ", minval = 2, group = "ساختار")
showStruct = input.bool(true, "نمایش BOS / CHoCH", group = "ساختار")
showFvg    = input.bool(true, "نمایش FVG", group = "نمایش")
showOb     = input.bool(true, "نمایش Order Block", group = "نمایش")
fvgMinAtr  = input.float(0.15, "حداقل اندازه FVG (ضریب ATR)", step = 0.05, group = "نمایش")
maxZones   = input.int(6, "حداکثر ناحیه فعال از هر نوع", minval = 1, maxval = 30, group = "نمایش")
bullCol    = input.color(color.new(#06a314, 80), "رنگ صعودی", group = "رنگ‌ها")
bearCol    = input.color(color.new(#e53935, 80), "رنگ نزولی", group = "رنگ‌ها")

atr = ta.atr(14)
ph  = ta.pivothigh(high, swingLen, swingLen)
pl  = ta.pivotlow(low,  swingLen, swingLen)

var float lastHigh = na
var int   lastHighBar = na
var float lastLow = na
var int   lastLowBar = na
var bool  highBroken = true
var bool  lowBroken = true
var int   trend = 0

var array<box> bullFvg = array.new<box>()
var array<box> bearFvg = array.new<box>()
var array<box> bullOb  = array.new<box>()
var array<box> bearOb  = array.new<box>()

if not na(ph)
    lastHigh := ph
    lastHighBar := bar_index - swingLen
    highBroken := false
if not na(pl)
    lastLow := pl
    lastLowBar := bar_index - swingLen
    lowBroken := false

// حذف ناحیه‌هایی که قیمت از آن‌ها عبور کرده و محدود کردن تعداد
prune(array<box> arr, bool bull) =>
    for i = array.size(arr) - 1 to 0
        b = array.get(arr, i)
        broken = bull ? close < box.get_bottom(b) : close > box.get_top(b)
        if broken
            box.delete(b)
            array.remove(arr, i)
    while array.size(arr) > maxZones
        box.delete(array.shift(arr))

bullBreak = barstate.isconfirmed and not highBroken and not na(lastHigh) and close > lastHigh
bearBreak = barstate.isconfirmed and not lowBroken  and not na(lastLow)  and close < lastLow
bullChoch = bullBreak and trend == -1
bearChoch = bearBreak and trend == 1

if bullBreak
    tag = trend == -1 ? "CHoCH" : "BOS"
    highBroken := true
    trend := 1
    if showStruct
        line.new(lastHighBar, lastHigh, bar_index, lastHigh, color = color.new(#06a314, 0), style = line.style_dashed)
        label.new(math.round(math.avg(lastHighBar, bar_index)), lastHigh, tag, style = label.style_label_down,
             color = color.new(#06a314, 100), textcolor = #06a314, size = size.small)
    if showOb and not na(lastLowBar)
        n = math.min(bar_index - lastLowBar, 250)
        int obOff = 0
        float obLow = low
        for i = 0 to n
            if low[i] < obLow
                obLow := low[i]
                obOff := i
        array.push(bullOb, box.new(left = bar_index - obOff, top = high[obOff], right = bar_index + 1, bottom = low[obOff],
             border_color = color.new(#06a314, 40), bgcolor = bullCol, extend = extend.right))

if bearBreak
    tag = trend == 1 ? "CHoCH" : "BOS"
    lowBroken := true
    trend := -1
    if showStruct
        line.new(lastLowBar, lastLow, bar_index, lastLow, color = color.new(#e53935, 0), style = line.style_dashed)
        label.new(math.round(math.avg(lastLowBar, bar_index)), lastLow, tag, style = label.style_label_up,
             color = color.new(#e53935, 100), textcolor = #e53935, size = size.small)
    if showOb and not na(lastHighBar)
        n = math.min(bar_index - lastHighBar, 250)
        int obOff = 0
        float obHigh = high
        for i = 0 to n
            if high[i] > obHigh
                obHigh := high[i]
                obOff := i
        array.push(bearOb, box.new(left = bar_index - obOff, top = high[obOff], right = bar_index + 1, bottom = low[obOff],
             border_color = color.new(#e53935, 40), bgcolor = bearCol, extend = extend.right))

// Fair Value Gap (الگوی سه‌کندلی)
if showFvg and barstate.isconfirmed and bar_index > 2
    if low > high[2] and (low - high[2]) > atr * fvgMinAtr
        array.push(bullFvg, box.new(left = bar_index - 2, top = low, right = bar_index + 1, bottom = high[2],
             border_color = na, bgcolor = color.new(#2962ff, 85), extend = extend.right))
    if high < low[2] and (low[2] - high) > atr * fvgMinAtr
        array.push(bearFvg, box.new(left = bar_index - 2, top = low[2], right = bar_index + 1, bottom = high,
             border_color = na, bgcolor = color.new(#ff9800, 85), extend = extend.right))

if barstate.isconfirmed
    prune(bullFvg, true)
    prune(bearFvg, false)
    prune(bullOb, true)
    prune(bearOb, false)

alertcondition(bullBreak and not bullChoch, "Bullish BOS",   "شکست ساختار صعودی (BOS)")
alertcondition(bearBreak and not bearChoch, "Bearish BOS",   "شکست ساختار نزولی (BOS)")
alertcondition(bullChoch, "Bullish CHoCH", "تغییر کاراکتر به صعودی (CHoCH)")
alertcondition(bearChoch, "Bearish CHoCH", "تغییر کاراکتر به نزولی (CHoCH)")

منطق کار

  • سوئینگ‌های های و لو با طول قابل تنظیم پیدا می‌شوند.
  • بسته‌شدن کندل بالای آخرین سوئینگ های: BOS در روند صعودی یا CHoCH اگر روند قبلی نزولی بوده.
  • همین منطق برای شکست سوئینگ لو (روند نزولی) اجرا می‌شود.
  • اوردر بلاک: کندل کفِ (یا سقفِ) حرکتِ منتهی به شکست.
  • FVG: شکاف سه‌کندلی بین سقف کندل اول و کف کندل سوم (و برعکس).
  • ناحیه‌ای که قیمت با بسته‌شدن کندل از آن عبور کند، حذف می‌شود.

تنظیمات مهم

طول سوئینگ
هرچه بزرگ‌تر، ساختار کلان‌تر و سیگنال کمتر
نمایش BOS / CHoCH، FVG، OB
هر لایه جدا روشن یا خاموش می‌شود
حداقل اندازه FVG (TradingView)
حذف شکاف‌های ریز با ضریب ATR
حداکثر ناحیه فعال (TradingView)
جلوگیری از شلوغی چارت

کجا بهتر کار می‌کند

تحلیل چندتایم‌فریمی؛ مثلاً ساختار در ۴ ساعته و ناحیه ورود در ۱۵ دقیقه.

نقطه‌ضعف

اندیکاتور سیگنال خرید و فروش نمی‌دهد؛ تفسیر ناحیه‌ها با خود تحلیلگر است.

این کد آموزشی است و توصیه‌ی سرمایه‌گذاری نیست. قبل از استفاده روی حساب واقعی، کامپایل و رفتار آن را روی حساب دمو و در بک‌تست بررسی کنید؛ نتیجه‌ی گذشته تضمین‌کننده‌ی آینده نیست.

← همه‌ی اسکریپت‌ها