Isolated Scroll Container

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.
Các khối logic chính

🔷 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ầnCá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 đaCá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ệnNhãn hiển thị
Bearish FVGbearStrength ≥ 70Strong Bearish Imbalance
bearStrength ≥ 55Bearish Bias
bullStrength > bearStrengthWeak Bearish (Bull Pressure)
Còn lạiNeutral Bearish
Bullish FVGbullStrength ≥ 70Strong Bullish Imbalance
bullStrength ≥ 55Bullish Bias
bearStrength > bullStrengthWeak Bullish (Bear Pressure)
Còn lạiNeutral Bullish
Đầu ra & vai trò trong sử dụng
  • Ô 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.
Zoom/Pan Layered Image
Background Overlay
+
				
					// 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<FVG> fvgs = array.new<FVG>()

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

PRO Scalper Chiến lược của Nga ngố

PRO Scalper tin rằng giá cả không chỉ di chuyển theo kỹ thuật đơn thuần, mà còn phản ánh dòng tiền thực tế (order flow) và thanh khoản (liquidity) đang tập trung ở đâu.

Thay vì chỉ nhìn vào các đường trung bình động hay mô hình nến, chỉ báo

Scalper Pro Pattern Recognition & Price Action

Scalper Pro được xây dựng dựa trên 3 nguyên lý cốt lõi trong giao dịch thị trường:

Nguyên lý xu hướng bền vững
Lý thuyết Smart Money (Tiền thông minh)
Quản lý rủi ro dựa trên biến động
Điểm đặc biệt: Scalper Pro không chỉ đơn thuần

Bitgak [Osprey]

Bitgak (번각 – trong tiếng Hàn nghĩa là “Góc Xiên”) là một chiến lược được các trader chuyên nghiệp Hàn Quốc sử dụng rất phổ biến, đôi khi còn được ưa chuộng hơn cả Fibonacci Retracement.