اسمارت مانی · اندیکاتور
اسمارت مانی: 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)
- جلوگیری از شلوغی چارت
کجا بهتر کار میکند
تحلیل چندتایمفریمی؛ مثلاً ساختار در ۴ ساعته و ناحیه ورود در ۱۵ دقیقه.
نقطهضعف
اندیکاتور سیگنال خرید و فروش نمیدهد؛ تفسیر ناحیهها با خود تحلیلگر است.
این کد آموزشی است و توصیهی سرمایهگذاری نیست. قبل از استفاده روی حساب واقعی، کامپایل و رفتار آن را روی حساب دمو و در بکتست بررسی کنید؛ نتیجهی گذشته تضمینکنندهی آینده نیست.
← همهی اسکریپتها