1. Mô tả chỉ báo – Ranked FVG Imbalance Zones (Zeiierman)
Phát hiện, xếp hạng và hiển thị các vùng mất cân bằng giá (FVG) mạnh nhất trên biểu đồ theo điểm chất lượng động
1.1 Concept của chỉ báo
Fair Value Gap (FVG) – hay còn gọi là vùng mất cân bằng giá – là lý thuyết xuất phát từ Smart Money Concept (SMC). Ý tưởng cốt lõi: khi giá di chuyển quá mạnh và quá nhanh theo một chiều, nó để lại một khoảng trống trên biểu đồ (một "lỗ hổng" giữa hai cây nến), nơi không có giao dịch thực sự xảy ra. Thị trường có xu hướng quay lại lấp đầy khoảng trống đó sau – giống như việc giá "sửa lỗi" sự mất cân bằng cung/cầu mà nó đã tạo ra.
Chỉ báo này đi xa hơn: thay vì chỉ vẽ mọi FVG xuất hiện (dẫn đến biểu đồ bị ngập tràn ô màu), nó chấm điểm chất lượng từng vùng FVG dựa trên 4 yếu tố (kích thước vùng, khối lượng giao dịch, xu hướng thị trường, sức mạnh nến hình thành), sau đó chỉ hiển thị những vùng điểm cao nhất. Đây là lý do có chữ "Ranked" (xếp hạng) trong tên chỉ báo.
Niềm tin cơ bản: Không phải FVG nào cũng như nhau – một vùng FVG hình thành khi khối lượng lớn, giá đang trong xu hướng rõ, và nến bứt phá mạnh sẽ đáng tin cậy hơn nhiều so với một FVG hình thành trong điều kiện bình thường.
1.2 Chức năng của chỉ báo
- Vẽ vùng FVG (ô màu trên biểu đồ): Mỗi vùng FVG được vẽ thành một hình chữ nhật màu xanh ngọc (bullish – tăng) hoặc hồng đỏ (bearish – giảm), kéo dài sang phải theo thời gian để dễ theo dõi.
- Thanh sức mạnh Bull/Bear bên trong mỗi ô: Mỗi vùng FVG được chia đôi theo chiều dọc – nửa trên là thanh bear, nửa dưới là thanh bull – hiển thị % sức mạnh tương ứng (ví dụ: 73% bull / 27% bear).
- Nhãn văn bản thông minh trong ô FVG: Mỗi ô hiển thị một đánh giá bằng chữ như "Strong Bullish Imbalance", "Bearish Bias", "Weak Bullish (Bear Pressure)"... giúp đọc nhanh chất lượng vùng.
- Xếp hạng và lọc: Chỉ hiển thị tối đa maxZones (mặc định 10) vùng FVG điểm cao nhất. Các vùng điểm thấp bị ẩn đi (không xóa, chỉ ẩn).
- Alert (6 loại): Cảnh báo khi có FVG mới, khi FVG leo lên top 1, khi giá chạm vùng, và khi vùng bị lấp đầy hoàn toàn.
1.3 Cách dùng chỉ báo
- Xác định vùng hỗ trợ/kháng cự tiềm năng: Các ô FVG màu xanh ngọc phía dưới giá hiện tại là vùng hỗ trợ tiềm năng (giá có thể quay xuống lấp đầy). Các ô hồng đỏ phía trên giá là vùng kháng cự tiềm năng.
- Ưu tiên vùng có điểm cao: Vì chỉ báo chỉ hiển thị top maxZones vùng mạnh nhất, bất kỳ ô nào còn hiển thị đều đã qua "bộ lọc chất lượng". Vùng nào còn trụ vững qua nhiều thanh nến (không bị lấp) và chưa bị đẩy ra khỏi top thường là vùng đáng chú ý nhất.
- Đọc nhãn văn bản để đánh giá thiên kiến: "Strong Bullish Imbalance" → vùng mua mạnh, kỳ vọng giá nảy lên khi chạm. "Weak Bullish (Bear Pressure)" → dù là bullish FVG nhưng áp lực bán đang lớn hơn, cần thận trọng khi long.
- Theo dõi thanh % bull/bear để đọc sức mạnh nội tại: Nếu ô bullish FVG nhưng thanh bear chiếm 60%+ → vùng đang suy yếu, tín hiệu long kém tin cậy hơn.
- Dùng Alert "Bullish/Bearish FVG Touch" để bắt điểm vào lệnh khi giá quay về test lại vùng FVG, kết hợp với xác nhận từ price action hoặc chỉ báo khác.
- Alert "FVG Fully Mitigated" báo hiệu vùng đã bị lấp đầy hoàn toàn – cần cập nhật lại bản đồ hỗ trợ/kháng cự.
1.4 Cách hoạt động của chỉ báo
Đầu vào & vai trò- maxZones (Số nguyên, mặc định 10, từ 1–20): Số lượng vùng FVG tốt nhất được hiển thị trên biểu đồ. Chỉ báo lưu nhiều hơn nhưng chỉ tô màu và hiện nhãn cho top N vùng. Nếu giảm xuống 3 → chỉ thấy 3 ô đậm nhất; nếu tăng lên 20 → nhiều ô hơn nhưng bao gồm cả vùng yếu hơn.
- maxStored (Số nguyên, mặc định 50, từ 10–200): Số FVG tối đa được lưu trong bộ nhớ tại một thời điểm. Khi vượt ngưỡng này, vùng có điểm thấp nhất bị xóa hẳn. Tăng giá trị này cho phép theo dõi lịch sử xa hơn nhưng tốn tài nguyên hơn.
- volLength (Số nguyên, mặc định 20): Độ dài trung bình khối lượng (Volume SMA) dùng làm mốc so sánh. Nến hình thành FVG có khối lượng gấp đôi trung bình 20 nến → volScore = 2.0 → cộng điểm mạnh. Nếu chỉnh xuống 5 → trung bình tính ngắn hơn, dễ đạt volScore cao hơn.
- trendLength (Số nguyên, mặc định 50): Độ dài EMA xác định xu hướng. Nếu giá đóng cửa trên EMA-50 khi hình thành bullish FVG → xu hướng thuận → trendScore = 1.0 → cộng 20 điểm. Chỉnh nhỏ hơn (ví dụ 20) → nhạy cảm hơn với xu hướng ngắn hạn.
- showBars (Tick chọn, mặc định bật): Bật/tắt hiển thị thanh bull/bear bên trong ô FVG. Tắt đi cho biểu đồ gọn hơn.
- showBlockText (Tick chọn, mặc định bật): Bật/tắt nhãn chữ ("Strong Bullish Imbalance"...) trong ô FVG.
- strengthTextSize / blockTextSize (Lựa chọn: auto/tiny/small/normal/large/huge): Cỡ chữ cho phần trăm sức mạnh và nhãn văn bản trong ô.
- bullColor / bearColor (Màu sắc): Màu nền ô FVG và thanh sức mạnh. Mặc định xanh ngọc (bull) và hồng đỏ (bear).
- alertNewBull / alertNewBear / alertTopRank / alertBullTouch / alertBearTouch / alertFullyMitigated (Tick chọn): Bật/tắt từng loại cảnh báo độc lập với nhau.
🔷 Flow 1 – Phát hiện FVG (3 nến liên tiếp)
Mỗi thanh nến mới, chỉ báo kiểm tra mẫu hình 3 nến:
- Bullish FVG (tăng): low[0] > high[2] — Giá thấp nhất của nến hiện tại cao hơn giá cao nhất của nến cách 2 thanh. Khoảng trống giữa hai nến đó là vùng FVG tăng. Ví dụ: nến cách 2 có high = 100, nến hiện tại có low = 102 → khoảng từ 100 đến 102 là bullish FVG.
- Bearish FVG (giảm): high[0] < low[2] — Giá cao nhất của nến hiện tại thấp hơn giá thấp nhất của nến cách 2 thanh. Ví dụ: nến cách 2 có low = 100, nến hiện tại có high = 98 → khoảng từ 98 đến 100 là bearish FVG.
Nến "ở giữa" (nến số 1) là nến bứt phá mạnh, còn nến số 2 (cũ nhất trong 3 nến) và nến số 0 (hiện tại) định ra biên trên và biên dưới của vùng FVG.
🔷 Flow 2 – Tính điểm chất lượng (Quality Score)
Khi phát hiện FVG mới, chỉ báo tính ngay điểm chất lượng ban đầu dựa trên công thức:
qualityScore = fvgSize × 100 + volScore × 10 + trendScore × 20 − mitigation × 50
Trong đó mitigation = 0.0 khi vừa mới tạo (chưa bị lấp). Điểm sẽ suy giảm thêm
age × 0.1 theo từng nến tiếp theo.
| Thành phần | Cách tính | Ý nghĩa |
|---|---|---|
| fvgSize × 100 | Độ rộng vùng FVG (đơn vị giá) × 100 | FVG càng rộng → giá bứt phá càng mạnh → điểm càng cao |
| volScore × 10 | volume / volumeMA(20). Nếu volume gấp đôi trung bình → volScore = 2.0 → +20 điểm | Khối lượng cao xác nhận độ tin cậy của sự mất cân bằng |
| trendScore × 20 | = 1.0 nếu FVG cùng chiều xu hướng EMA, = 0 nếu ngược chiều | FVG thuận xu hướng đáng tin cậy hơn FVG ngược xu hướng |
| − mitigation × 50 | Tỉ lệ vùng đã bị lấp (0.0 → 1.0) | Vùng bị lấp một phần sẽ bị trừ điểm – mất dần độ tin cậy |
| − age × 0.1 | Số nến đã trôi qua kể từ khi FVG hình thành | Vùng cũ dần mất điểm theo thời gian nếu chưa được kiểm tra lại |
🔷 Flow 3 – Tính điểm sức mạnh Bull/Bear (Strength Score)
Song song với quality score, chỉ báo tính một điểm sức mạnh tổng hợp 0–100 để phân chia thanh bull/bear:
| Thành phần | Điểm tối đa | Cách tính |
|---|---|---|
| Gap Strength (sức mạnh khoảng trống) | 40 điểm | min(fvgSize / ATR(14), 2.0) / 2.0 × 40 — FVG rộng hơn 2× ATR đạt tối đa |
| Volume Strength (sức mạnh khối lượng) | 30 điểm | min(volScore, 2.0) / 2.0 × 30 — Khối lượng gấp đôi trung bình đạt tối đa |
| Trend Strength (sức mạnh xu hướng) | 20 điểm | trendScore × 20 — Chỉ có 0 hoặc 20 (thuận/không thuận xu hướng) |
| Candle Strength (sức mạnh thân nến) | 10 điểm | |close − open| / max(high − low, mintick) × 10 — Nến marubozu đạt ~10 điểm |
Tổng điểm (0–100) là mainStrength. Sau đó:
- Nếu là bullish FVG: bullStrength = mainStrength, bearStrength = 100 − mainStrength
- Nếu là bearish FVG: bearStrength = mainStrength, bullStrength = 100 − mainStrength
Ví dụ: FVG tăng với mainStrength = 73 → bullStrength = 73%, bearStrength = 27%.
🔷 Flow 4 – Cập nhật và theo dõi Mitigation (mức độ bị lấp đầy)
Mỗi thanh nến mới, chỉ báo duyệt qua toàn bộ danh sách FVG đang lưu và kiểm tra xem giá có "chạm" vào vùng đó không:
- Bullish FVG bị chạm khi: low <= fvg.top (giá thấp nhất nến hiện tại đã đi vào vùng)
- Bearish FVG bị chạm khi: high >= fvg.bottom (giá cao nhất nến hiện tại đã đi vào vùng)
Khi bị chạm, tính tỉ lệ đã lấp đầy: ví dụ bullish FVG từ 100 đến 105 (rộng 5 điểm). Giá thấp nhất chạm tới 102 → fillDistance = 105 − 102 = 3 → mitigation = 3/5 = 0.6 (60%). Khi mitigation ≥ 1.0 (100%) → vùng bị xóa hoàn toàn khỏi biểu đồ và danh sách.
🔷 Flow 5 – Sắp xếp, lọc và hiển thị
Sau khi cập nhật xong, toàn bộ danh sách FVG được sắp xếp giảm dần theo qualityScore. Sau đó:
- Nếu số lượng lưu > maxStored: xóa (pop) vùng điểm thấp nhất khỏi bộ nhớ
- Duyệt từng vùng theo thứ tự xếp hạng: vị trí index < maxZones → hiển thị đầy đủ; vị trí ≥ maxZones → tô màu trong suốt (ẩn đi, không xóa)
🔷 Flow 6 – Nhãn văn bản thông minh (Smart Label)
Với mỗi vùng FVG đang hiển thị, nhãn chữ được chọn theo bảng sau:
| Loại FVG | Điều kiện | Nhãn hiển thị |
|---|---|---|
| Bearish FVG | bearStrength ≥ 70 | Strong Bearish Imbalance |
| bearStrength ≥ 55 | Bearish Bias | |
| bullStrength > bearStrength | Weak Bearish (Bull Pressure) | |
| Còn lại | Neutral Bearish | |
| Bullish FVG | bullStrength ≥ 70 | Strong Bullish Imbalance |
| bullStrength ≥ 55 | Bullish Bias | |
| bearStrength > bullStrength | Weak Bullish (Bear Pressure) | |
| Còn lại | Neutral Bullish |
- Ô màu FVG (box trên biểu đồ): Hiển thị vùng mất cân bằng, kéo dài sang phải 25 nến để dễ nhìn. Xanh ngọc = bullish (hỗ trợ tiềm năng), hồng đỏ = bearish (kháng cự tiềm năng).
- Thanh sức mạnh bull/bear: Hai thanh ngang bên trong mỗi ô, hiển thị % của từng phe. Thanh bull ở nửa dưới ô, thanh bear ở nửa trên. Độ dài thanh tỉ lệ với % sức mạnh.
- Nhãn văn bản: Chuỗi chữ góc phải ô FVG cho biết đánh giá tổng hợp (Strong/Bias/Weak/Neutral) để đọc nhanh không cần nhìn %.
- 6 loại Alert: New Bullish FVG, New Bearish FVG, New Top-Ranked FVG, Bullish FVG Touch, Bearish FVG Touch, FVG Fully Mitigated — mỗi loại bật/tắt độc lập.
// This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
// https://creativecommons.org/licenses/by-nc-sa/4.0/
// © Zeiierman {
//@version=6
indicator("Ranked FVG Imbalance Zones (Zeiierman)", overlay = true, max_boxes_count = 300)
//}
// ~~ Tooltips {
t1 = "Controls how many of the highest-ranked FVG zones are visible on the chart. The script can store more zones internally, but only the strongest ranked zones are displayed."
t2 = "Maximum number of FVG zones stored internally before the oldest/lowest-ranked zones are removed. Higher values allow more historical zones to be tracked."
t3 = "Length used to calculate the average volume baseline. The FVG volume score compares current volume against this average."
t4 = "EMA length used to define trend alignment. Bullish FVGs above the EMA and bearish FVGs below the EMA receive stronger trend scores."
t5 = "Shows or hides the internal bullish and bearish strength bars inside each FVG block."
t6 = "Shows or hides the smart text label inside each FVG block, such as Strong Bullish Imbalance, Bearish Bias, or Weak Bearish."
t7 = "Color used for bullish FVG bodies and bullish strength bars."
t8 = "Color used for bearish FVG bodies and bearish strength bars."
t9 = "Trigger an alert when a new bullish FVG is detected."
t10 = "Trigger an alert when a new bearish FVG is detected."
t11 = "Trigger an alert when a new FVG becomes the highest-ranked visible zone."
t12 = "Trigger an alert when price touches or begins mitigating an active bullish FVG."
t13 = "Trigger an alert when price touches or begins mitigating an active bearish FVG."
t14 = "Trigger an alert when an FVG becomes fully mitigated and is removed from the chart."
t15 = "Controls the text size used for the bullish and bearish strength percentage labels inside each FVG."
t16 = "Controls the text size used for the smart FVG block text, such as Strong Bullish Imbalance or Bearish Bias."
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Inputs {
gRanking = "Ranking"
gStrength = "Strength Engine"
gDisplay = "Display"
gColors = "Colors"
gAlerts = "Alerts"
maxZones = input.int(10, "Show Top Zones", minval = 1, maxval = 20, tooltip = t1, group = gRanking)
maxStored = input.int(50, "Max Stored FVGs", minval = 10, maxval = 200, tooltip = t2, group = gRanking)
volLength = input.int(20, "Volume MA Length", tooltip = t3, group = gStrength)
trendLength = input.int(50, "Trend EMA Length", tooltip = t4, group = gStrength)
showBars = input.bool(true, "Show Strength Bars", tooltip = t5, group = gDisplay)
showBlockText = input.bool(true, "Show FVG Block Text", tooltip = t6, group = gDisplay)
strengthTextSize = input.string("auto", "Strength Text Size", options = ["auto", "tiny", "small", "normal", "large", "huge"], tooltip = t15, group = gDisplay)
blockTextSize = input.string("auto", "Block Text Size", options = ["auto", "tiny", "small", "normal", "large", "huge"], tooltip = t16, group = gDisplay)
bullColor = input.color(color.rgb(26, 216, 194, 50), "Bullish", inline = "colors", tooltip = t7, group = gColors)
bearColor = input.color(color.rgb(216, 26, 102, 50), "Bearish", inline = "colors", tooltip = t8, group = gColors)
alertNewBull = input.bool(true, "New Bullish FVG", tooltip = t9, group = gAlerts)
alertNewBear = input.bool(true, "New Bearish FVG", tooltip = t10, group = gAlerts)
alertTopRank = input.bool(true, "New Top-Ranked FVG", tooltip = t11, group = gAlerts)
alertBullTouch = input.bool(true, "Bullish FVG Touch", tooltip = t12, group = gAlerts)
alertBearTouch = input.bool(true, "Bearish FVG Touch", tooltip = t13, group = gAlerts)
alertFullyMitigated = input.bool(true, "FVG Fully Mitigated", tooltip = t14, group = gAlerts)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ UDT for each imbalance zone {
type FVG
float qualityScore
float top
float bottom
int direction
int bornBar
int leftTime
float size
float mitigation
float volumeScore
float trendScore
int bullStrength
int bearStrength
box body
box bullBar
box bearBar
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Helpers {
volumeMA = ta.sma(volume, volLength)
trendEMA = ta.ema(close, trendLength)
barMs = timeframe.in_seconds(timeframe.period) * 1000
bullFVG = low > high[2]
bearFVG = high < low[2]
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Create new FVG object {
var array fvgs = array.new()
var string topFvgKey = ""
newBullFvgAlert = false
newBearFvgAlert = false
newTopRankAlert = false
bullTouchAlert = false
bearTouchAlert = false
fullyMitigatedAlert = false
if bullFVG or bearFVG
float top = bullFVG ? low : low[2]
float bottom = bullFVG ? high[2] : high
int direction = bullFVG ? 1 : -1
newBullFvgAlert := direction == 1
newBearFvgAlert := direction == -1
float fvgSize = math.abs(top - bottom)
float volScore = volumeMA != 0 ? volume / volumeMA : 1.0
float trendScore = direction == 1 and close > trendEMA ? 1.0 : direction == -1 and close < trendEMA ? 1.0 : 0.0
float mitigation = 0.0
float qualityScore = fvgSize * 100 + volScore * 10 + trendScore * 20 - mitigation * 50
float gapStrength = math.min(fvgSize / ta.atr(14), 2.0) / 2.0 * 40
float volStrength = math.min(volScore, 2.0) / 2.0 * 30
float trendStrength = trendScore * 20
float candleStrength = math.abs(close - open) / math.max(high - low, syminfo.mintick) * 10
float totalStrength = gapStrength + volStrength + trendStrength + candleStrength
int mainStrength = int(math.max(math.min(totalStrength, 100), 0))
int bullStrength = direction == 1 ? mainStrength : 100 - mainStrength
int bearStrength = direction == -1 ? mainStrength : 100 - mainStrength
color bodyColor = direction == 1 ? bullColor : bearColor
int leftTime = time[2]
int rightTime = time + barMs * 5
box body = box.new(
left = leftTime,
right = rightTime,
top = top,
bottom = bottom,
xloc = xloc.bar_time,
bgcolor = color.new(bodyColor, 70),
border_color = na
)
float mid = math.avg(top, bottom)
box bearBar = box.new(
left = leftTime,
right = leftTime,
top = top,
bottom = mid,
xloc = xloc.bar_time,
bgcolor = bearColor,
border_color = chart.bg_color
)
box bullBar = box.new(
left = leftTime,
right = leftTime,
top = mid,
bottom = bottom,
xloc = xloc.bar_time,
bgcolor = bullColor,
border_color = chart.bg_color
)
fvgs.push(FVG.new(
qualityScore,
top,
bottom,
direction,
bar_index,
leftTime,
fvgSize,
mitigation,
volScore,
trendScore,
bullStrength,
bearStrength,
body,
bullBar,
bearBar
))
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Update existing FVGs {
if fvgs.size() > 0
for i = fvgs.size() - 1 to 0
FVG fvg = fvgs.get(i)
int age = bar_index - fvg.bornBar
bool touched = fvg.direction == 1 ? low <= fvg.top : high >= fvg.bottom
bullTouchAlert := bullTouchAlert or (touched and fvg.direction == 1)
bearTouchAlert := bearTouchAlert or (touched and fvg.direction == -1)
if touched
float fillDistance = fvg.direction == 1 ? fvg.top - low : high - fvg.bottom
float zoneSize = math.max(fvg.top - fvg.bottom, syminfo.mintick)
fvg.mitigation := math.min(math.max(fillDistance / zoneSize, 0), 1)
fvg.qualityScore := fvg.size * 100 + fvg.volumeScore * 10 + fvg.trendScore * 20 - fvg.mitigation * 50 - age * 0.1
box.set_right(fvg.body, time + barMs * 25)
if fvg.mitigation >= 1
fullyMitigatedAlert := true
box.delete(fvg.body)
box.delete(fvg.bullBar)
box.delete(fvg.bearBar)
fvgs.remove(i)
else
fvgs.set(i, fvg)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Sort FVGs by quality score {
fvgs.sort(order.descending, sort_field = "qualityScore")
if fvgs.size() > 0
FVG topFvg = fvgs.get(0)
string currentTopKey = str.tostring(topFvg.leftTime) + "_" + str.tostring(topFvg.direction)
newTopRankAlert := currentTopKey != topFvgKey
topFvgKey := currentTopKey
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Limit stored zones {
while fvgs.size() > maxStored
FVG removed = fvgs.pop()
box.delete(removed.body)
box.delete(removed.bullBar)
box.delete(removed.bearBar)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Show only top zones {
if fvgs.size() > 0
for i = 0 to fvgs.size() - 1
FVG fvg = fvgs.get(i)
bool showZone = i < maxZones
color bodyColor = fvg.direction == 1 ? bullColor : bearColor
int left = fvg.leftTime
int right = time + barMs * 25
int width = right - left
int sizeUnit = math.max(int(width / 200), 1)
float top = box.get_top(fvg.body)
float bot = box.get_bottom(fvg.body)
float mid = math.avg(top, bot)
box.set_bgcolor(fvg.body, showZone ? color.new(bodyColor, 70) : color.new(color.gray, 100))
box.set_border_color(fvg.body, na)
box.set_right(fvg.body, right)
if showZone and showBars
box.set_left(fvg.bearBar, left)
box.set_right(fvg.bearBar, left + sizeUnit * fvg.bearStrength)
box.set_top(fvg.bearBar, top)
box.set_bottom(fvg.bearBar, mid)
box.set_bgcolor(fvg.bearBar, bearColor)
box.set_border_color(fvg.bearBar, chart.bg_color)
box.set_text(fvg.bearBar, str.tostring(fvg.bearStrength, format.percent))
box.set_text_color(fvg.bearBar, chart.fg_color)
box.set_text_halign(fvg.bearBar, text.align_right)
box.set_text_size(fvg.bearBar, strengthTextSize)
box.set_left(fvg.bullBar, left)
box.set_right(fvg.bullBar, left + sizeUnit * fvg.bullStrength)
box.set_top(fvg.bullBar, mid)
box.set_bottom(fvg.bullBar, bot)
box.set_bgcolor(fvg.bullBar, bullColor)
box.set_border_color(fvg.bullBar, chart.bg_color)
box.set_text(fvg.bullBar, str.tostring(fvg.bullStrength, format.percent))
box.set_text_color(fvg.bullBar, chart.fg_color)
box.set_text_halign(fvg.bullBar, text.align_right)
box.set_text_size(fvg.bullBar, strengthTextSize)
string labelText = ""
if fvg.direction == -1 // Bearish FVG
if fvg.bearStrength >= 70
labelText := "Strong Bearish Imbalance"
else if fvg.bearStrength >= 55
labelText := "Bearish Bias"
else if fvg.bullStrength > fvg.bearStrength
labelText := "Weak Bearish (Bull Pressure)"
else
labelText := "Neutral Bearish"
else // Bullish FVG
if fvg.bullStrength >= 70
labelText := "Strong Bullish Imbalance"
else if fvg.bullStrength >= 55
labelText := "Bullish Bias"
else if fvg.bearStrength > fvg.bullStrength
labelText := "Weak Bullish (Bear Pressure)"
else
labelText := "Neutral Bullish"
box.set_text(fvg.body, showBlockText ? labelText : "")
box.set_text_halign(fvg.body, text.align_right)
box.set_text_color(fvg.body, chart.bg_color)
box.set_text_size(fvg.body, blockTextSize)
else
box.set_bgcolor(fvg.bullBar, color.new(color.gray, 100))
box.set_bgcolor(fvg.bearBar, color.new(color.gray, 100))
box.set_border_color(fvg.bullBar, color.new(color.gray, 100))
box.set_border_color(fvg.bearBar, color.new(color.gray, 100))
box.set_text(fvg.bullBar, "")
box.set_text(fvg.bearBar, "")
box.set_text(fvg.body, "")
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// ~~ Alerts {
alertcondition(alertNewBull and newBullFvgAlert, "New Bullish FVG", "A new bullish FVG has formed.")
alertcondition(alertNewBear and newBearFvgAlert, "New Bearish FVG", "A new bearish FVG has formed.")
alertcondition(alertTopRank and newTopRankAlert, "New Top-Ranked FVG", "A new FVG has become the highest-ranked zone.")
alertcondition(alertBullTouch and bullTouchAlert, "Bullish FVG Touch", "Price has touched or started mitigating a bullish FVG.")
alertcondition(alertBearTouch and bearTouchAlert, "Bearish FVG Touch", "Price has touched or started mitigating a bearish FVG.")
alertcondition(alertFullyMitigated and fullyMitigatedAlert, "FVG Fully Mitigated", "An FVG has been fully mitigated and removed.")
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
Indicator Insider

Volume Delta [BigBeluga]
Volume Delta là chỉ báo dựa trên nguyên lý phân tích dòng lệnh (Order Flow Analysis) – một phương pháp đánh giá sức mạnh thực sự của thị trường thông qua hành động của người mua và người bán.

FVG Volume Profile [ChartPrime]
Chỉ báo FVG Volume Profile dựa trên lý thuyết về Fair Value Gap (FVG) – hay còn gọi là “vùng mất cân bằng giá”. Đây là những khoảng trống xuất hiện trên biểu đồ giá khi thị trường di chuyển quá nhanh, tạo ra vùng giá mà không có hoặc

TP RSI
TP RSI v2.0 được xây dựng dựa trên nguyên lý tích hợp ba chiều trong phân tích kỹ thuật: Xu hướng (Trend), Động lượng (Momentum), và Biến động (Volatility). Thay vì phải chuyển đổi giữa nhiều chỉ báo khác nhau, TP RSI tập trung tất cả vào một màn hình


