Isolated Scroll Container

1. Mô Tả Volumetric Order Flow Structure Strategy

Phát hiện phá vỡ cấu trúc thị trường (BOS/CHoCH) qua pivot, gắn kèm một thanh "delta" thể hiện độ mạnh của nến phá vỡ, một Volume Profile tổng hợp 15 dòng cho chính cây nến pivot, và các bong bóng cảnh báo thao túng thanh khoản (liquidity grab) khi vùng cấu trúc còn đang hoạt động.

1.1 Khái Niệm Chỉ Báo

Chỉ báo này thuộc cùng họ Break of Structure (BOS) / Change of Character (CHoCH) như nhiều chỉ báo Smart Money Concepts khác: khi giá đóng cửa phá qua đỉnh/đáy pivot gần nhất, đó là bằng chứng cấu trúc thị trường vừa thay đổi. Điểm khác biệt của chỉ báo này nằm ở việc gắn thêm một "chữ ký khối lượng" (volumetric signature) vào mỗi lần phá vỡ:

  • Thanh Delta / Độ Tự Tin (conviction bar): một thanh ngang 3 lớp, phần được "tô đặc" bên trong thanh dài hay ngắn phản ánh việc giá đóng cửa của NẾN PHÁ VỠ đã đóng gần mép có lợi cho hướng phá vỡ đến mức nào - đóng càng gần mép thuận lợi, phần tô đặc càng dài (độ tự tin của cú phá vỡ càng cao).
  • Volume Profile tổng hợp 15 dòng: KHÔNG phải khối lượng theo giá thực (không dùng dữ liệu nến khung nhỏ hơn), mà là một cách xấp xỉ hình học - chia vùng giá của chính CÂY NẾN PIVOT (không phải nến phá vỡ) thành 15 dòng, mỗi dòng có "trọng số" hình chuông (cao ở giữa, thấp dần ra 2 biên), cộng thêm điểm thưởng cho dòng nào chồng lấn với thân nến thực. Dòng có trọng số cao nhất được gắn nhãn "POC" (Point of Control) màu cam.
  • Bong Bóng Thao Túng (Manipulation Bubbles): trong lúc một vùng cấu trúc ("Order Block") còn đang hoạt động, nếu giá thò qua ranh giới của nó bằng bấc rồi bị từ chối (không đóng cửa xuyên qua), chỉ báo vẽ một bong bóng cảnh báo, kích thước tỷ lệ với khối lượng tương đối của nến đó - một dạng cờ báo "thanh khoản vừa bị săn" (liquidity grab / stop hunt) tại đúng ranh giới vùng.

Mỗi lần phá vỡ trở thành một đối tượng "Order Block" được theo dõi liên tục, tồn tại cho đến khi giá đóng cửa xuyên ngược qua nó ("mitigation" - bị vô hiệu hoá), hoặc bị loại bỏ theo kiểu FIFO khi số lượng block đang hoạt động vượt quá giới hạn cho phép.

1.2 Chức Năng Chỉ Báo

  • Thanh Cấu Trúc Volumetric (3 lớp) + Nhãn BOS/CHoCH: một thanh ngang gồm lớp nền mờ, lớp "glow" và lớp lõi đặc, trải dài từ nến pivot tới nến xác nhận phá vỡ, kèm nhãn "BOS" (phá vỡ tiếp diễn) hoặc "CHoCH" (đảo chiều) - vẽ VĨNH VIỄN, không bao giờ bị xoá sau đó, đóng vai trò mốc lịch sử của sự kiện phá vỡ.
  • Volume Profile 15 Dòng (trên vùng Order Block): các dải màu ngang phủ theo chiều cao vùng, dòng chồng lấn thân nến thực được tô đậm hơn dòng chỉ chồng lấn bấc nến. Cạnh phải của các dải này tiếp tục kéo dài mỗi nến khi block còn hoạt động.
  • Histogram Thu Nhỏ (bên phải biểu đồ): phiên bản cột ngang của 15 trọng số trên, độ dài cột tỷ lệ với trọng số, dòng POC tô màu cam, các dòng còn lại tô theo màu tăng/giảm của block.
  • Bong Bóng + Nhãn Khối Lượng Thao Túng: vòng tròn cảnh báo xuất hiện tại đúng điểm giá thò qua ranh giới block rồi bị từ chối, kèm nhãn chữ hiện khối lượng của nến đó (định dạng rút gọn "1.5K", "2.3M"...), kích thước bong bóng chia theo 5 mức (tiny → huge) dựa trên khối lượng tương đối.
  • Bộ lọc chồng lấn (tuỳ chọn): khi bật, một block mới chỉ được vẽ nếu khối lượng của nó LỚN HƠN mọi block đang hoạt động mà nó chồng lấn vùng giá - các block yếu hơn bị xoá để nhường chỗ, giữ biểu đồ gọn hơn ở những nơi có nhiều pivot liên tiếp.
  • Giới hạn số Block đang hoạt động (FIFO): khi số block vượt quá "Max Recent Blocks", block CŨ NHẤT (theo thứ tự tạo ra, không theo giá) bị xoá ngay lập tức, bất kể nó còn "hợp lệ" về mặt giá hay không.
  • Không có input màu, không có alert: khác với nhiều chỉ báo BOS/CHoCH khác trong series, màu tăng/giảm/POC ở đây là hằng số cố định trong code, không có ô chọn màu; chỉ báo cũng không có bất kỳ alertcondition() nào được lập sẵn.

1.3 Cách Dùng Chỉ Báo

  • Phân biệt BOS và CHoCH để đọc đúng bối cảnh: "BOS" là phá vỡ CÙNG hướng xu hướng hiện tại (tiếp diễn), "CHoCH" là phá vỡ NGƯỢC hướng xu hướng hiện tại (dấu hiệu đầu tiên của đảo chiều) - 2 loại tín hiệu này nên được xử lý khác nhau về mặt chiến lược.
  • Dùng vùng [low, high] của Order Block làm vùng hỗ trợ/kháng cự động: khi giá quay lại chạm vùng này rồi bật ra, vùng vẫn còn "sống" trên biểu đồ; khi giá đóng cửa xuyên hẳn qua nó, toàn bộ hình vẽ live của block biến mất - đó là tín hiệu vùng đã bị vô hiệu hoá, không còn đáng tin nữa.
  • Coi bong bóng thao túng là cảnh báo bẫy thanh khoản: một bong bóng lớn (khối lượng tương đối cao) xuất hiện đúng ranh giới của block mà giá không đóng cửa xuyên qua cho thấy vùng đó vừa được "bảo vệ" bởi dòng tiền thực - tăng độ tin cậy nếu giá sau đó đảo chiều trở lại vào trong block.
  • Đọc độ dài phần tô đặc của thanh delta như một chỉ báo về độ tự tin của cú phá vỡ: phần tô đặc càng dài (gần lấp đầy cả thanh) → nến phá vỡ đóng cửa rất gần mép có lợi, phá vỡ mạnh mẽ, dứt khoát; phần tô đặc ngắn → nến phá vỡ đóng cửa gần mép bất lợi, tín hiệu yếu, dễ bị giả.
  • Không dùng dòng POC (cam) như một mức khối lượng thực tế: đây là một hình dạng tổng hợp mang tính minh hoạ (hình chuông + điểm thưởng cho thân nến), không phải volume profile tính từ dữ liệu tick/khung nhỏ hơn thực sự - chỉ nên hiểu là "vùng thân nến pivot chiếm ưu thế nhất trong toàn bộ range của nó".
  • Điều chỉnh "Max Recent Blocks" và "Hide Overlapping Blocks" để kiểm soát độ rối của biểu đồ trên các khung thời gian nhỏ có nhiều pivot xuất hiện liên tục.

1.4 Cách Hoạt Động Của Chỉ Báo

Đầu vào & vai trò

  • pivotLenInput ("Pivot Length", Số nguyên, mặc định: 3): số nến hai bên dùng để xác nhận một pivot high/low. Ví dụ: pivotLenInput=3 nghĩa là một đỉnh chỉ được xác nhận sau 3 nến kể từ khi nó hình thành - độ trễ tối thiểu là 3 nến. Tăng → chỉ bắt đỉnh/đáy lớn, ít sự kiện BOS/CHoCH hơn nhưng đáng tin hơn. Giảm → nhiều sự kiện hơn, độ trễ ít hơn nhưng dễ nhiễu.
  • volLookbackInput ("Volume Lookback", Số nguyên, mặc định: 20): số nến dùng để cộng dồn vào biến totalVolume.
  • maxObsInput ("Max Recent Blocks", Số nguyên, mặc định: 5): số Order Block tối đa được phép hoạt động đồng thời. Ví dụ: khi block thứ 6 được tạo ra trong lúc 5 block trước vẫn còn "sống" → block CŨ NHẤT (tạo đầu tiên) bị xoá ngay lập tức để nhường chỗ, không xét việc nó còn hợp lệ về giá hay không. Tăng → giữ được nhiều lịch sử cấu trúc hơn nhưng biểu đồ rối hơn. Giảm → biểu đồ gọn hơn nhưng mất sớm các block cũ.
  • boxTransparencyInput ("Base Transparency", Số nguyên 0-100, mặc định: 80): độ trong suốt cơ bản của các dải Volume Profile 15 dòng. Các dòng chồng lấn thân nến thực luôn được vẽ đậm hơn 10 điểm so với giá trị này (dễ nhìn hơn), các dòng chỉ chồng lấn bấc nến bị mờ thêm 10 điểm.
  • hideOverlappingInput ("Hide Overlapping Blocks", Boolean, mặc định: false): khi BẬT, một block mới chỉ được vẽ nếu khối lượng của nến pivot tạo ra nó LỚN HƠN mọi block đang hoạt động có vùng giá chồng lấn với nó; nếu đúng, các block chồng lấn yếu hơn bị xoá hoàn toàn trước khi vẽ block mới.
  • showManipulationInput ("Show Manipulation Bubbles", Boolean, mặc định: true): bật/tắt các bong bóng cảnh báo thao túng thanh khoản.
  • manipSizeInput ("Bubble Sensitivity", Số thập phân, mặc định: 1.0, tối thiểu 0.1): hệ số nhân với tỷ lệ khối lượng tương đối trước khi phân loại kích thước bong bóng. Ví dụ: khối lượng nến = 1500, khối lượng cao nhất trong 200 nến = 5000, manipSizeInput=1.0 → tỷ lệ = (1500/5000)×1.0 = 0.30 → rơi vào mức "small". Tăng → cùng một khối lượng thực tế sẽ cho bong bóng to hơn (dễ đạt mức "huge" hơn). Giảm → bong bóng nhỏ hơn với cùng khối lượng.
💡 Lưu ý về "Volume Profile": 15 dòng trọng số trong chỉ báo này KHÔNG được tính từ dữ liệu khối lượng theo giá thực (khác hẳn với các chỉ báo Volume Profile thực thụ dùng dữ liệu nến khung nhỏ hơn) - đây là một công thức hình học tổng hợp: trọng số hình chuông (cao ở giữa vùng, thấp ở 2 biên) cộng thêm điểm thưởng cố định cho dòng nào chồng lấn thân nến thực. Ngoài ra, toàn bộ dữ liệu OHLC/khối lượng dùng để dựng cả thanh delta lẫn profile 15 dòng (pHigh/pLow/pOpen/pClose/pVol) đều lấy từ CHÍNH CÂY NẾN PIVOT (nến hình thành đỉnh/đáy) - riêng phần trăm lấp đầy của thanh delta (deltaPct) là ngoại lệ duy nhất, được tính từ nến XÁC NHẬN PHÁ VỠ (nến hiện tại lúc phá vỡ xảy ra).

Các Khối Logic Chính

🎯 Luồng 1: Phát Hiện Pivot

  • ta.pivothigh(pivotLenInput, pivotLenInput) và ta.pivotlow(...) xác nhận đỉnh/đáy sau khi đủ số nến 2 bên. Khi có pivot mới: lưu lastPh/lastPl = giá trị pivot, lastPhIdx/lastPlIdx = vị trí bar THỰC của pivot đó (bar_index - pivotLenInput, tính lùi lại đúng số nến độ trễ).
  • Ví dụ: pivotLenInput=3. Đỉnh hình thành tại bar 500, xác nhận tại bar 503 → lastPh := giá đỉnh, lastPhIdx := 503 - 3 = 500 (trỏ đúng về bar pivot thật, không phải bar xác nhận).

🎯 Luồng 2: Phát Hiện Phá Vỡ & Gán Nhãn BOS/CHoCH

  • isCrossover = ta.crossover(close, lastPh): khi đúng và lastPh đang tồn tại → gọi draw_structure() với nhãn "CHoCH" nếu xu hướng hiện tại đang là -1 (giảm, tức đây là đảo chiều), hoặc "BOS" nếu không (đang là +1 hoặc trung tính, tức tiếp diễn) → cập nhật trend := 1 → xoá lastPh (để pivot này không kích hoạt lại lần 2).
  • isCrossunder đối xứng với lastPl, gán trend := -1.
  • Ví dụ: lastPh=1.2700 (từ bar 500), trend hiện tại = -1. Tại bar 530, close=1.2705 cắt lên trên 1.2700 → gọi draw_structure(500, 1.2700, "CHoCH", BULL_COLOR, true) (vì trend==-1 → đảo chiều); trend := 1; lastPh bị xoá.

🔍 Luồng 3: Lọc Chồng Lấn (nếu bật)

  • Quét toàn bộ activeObs tìm các block có vùng giá [low, high] chồng lấn với block sắp tạo. Nếu BẤT KỲ block chồng lấn nào có khối lượng ≥ khối lượng nến pivot mới → huỷ vẽ block mới hoàn toàn (shouldDraw := false). Ngược lại, xoá tất cả các block chồng lấn (yếu hơn) trước khi tiếp tục vẽ block mới.

🖊️ Luồng 4: Vẽ Thanh Cấu Trúc Volumetric

  • range_ = khoảng cao-thấp của nến XÁC NHẬN PHÁ VỠ (nến hiện tại). deltaPct = tỷ lệ giá đóng cửa của nến đó nằm gần mép có lợi cho hướng phá vỡ đến đâu (VD nến tăng: (close-low)/range_).
  • dist = khoảng cách (số nến) từ pivot tới hiện tại. fillEnd = pivot + làm tròn(dist × max(0.1, deltaPct)) - đây là điểm cuối của phần "tô đặc" (glow + lõi) của thanh, phần còn lại (nền mờ) kéo dài hết tới bar hiện tại.
  • Vẽ 3 box chồng nhau: nền rất mờ (92% trong suốt, full chiều dài), glow (80% trong suốt, dài theo fillEnd), lõi đặc (20% trong suốt, dài theo fillEnd) - cả 3 box này KHÔNG được lưu vào bất kỳ mảng nào, nên tồn tại VĨNH VIỄN trên biểu đồ. Nhãn "BOS"/"CHoCH" cũng vậy - vẽ 1 lần, không bao giờ bị xoá.
  • Ví dụ: pivot tại bar 500, phá vỡ xác nhận tại bar 530 → dist=30. Nến 530 có high=1.2710, low=1.2695, close=1.2705, isBullish=true → range_=0.0015, deltaPct=(1.2705-1.2695)/0.0015=0.667 → fillEnd=500+round(30×0.667)=500+20=520. Phần tô đặc trải từ bar 500 đến 520 (~67% chiều dài thanh), phần còn lại (520→530) chỉ có lớp nền mờ.

🧮 Luồng 5: Dựng Volume Profile Tổng Hợp 15 Dòng

  • Chia vùng [pLow, pHigh] của CÂY NẾN PIVOT thành 15 dòng bằng nhau (rowStep). Với mỗi dòng i: distFromMid = |i - 7.5|, trọng số cơ bản w = max(2, 12 - distFromMid×1.5) (hình chuông, cao ở giữa, thấp ở 2 biên); nếu dòng đó chồng lấn thân nến thực (giữa pOpen và pClose) → cộng thêm 5.
  • Dòng có trọng số lớn nhất trở thành pocIndex (POC, tô màu cam). Sau đó vẽ 2 bộ box cho mỗi dòng: dải màu phủ trên vùng Order Block (boxes, cạnh phải sẽ tiếp tục kéo dài mỗi nến khi block còn sống) và cột trong histogram thu nhỏ bên phải biểu đồ (histBoxes, độ dài = trọng số).
  • Ví dụ: pHigh=1.2720, pLow=1.2680 → rowStep=0.002667. Dòng i=7 (gần giữa nhất): distFromMid=0.5 → w=max(2,12-0.5×1.5)=11; nếu chồng lấn thân nến → w=16 → thường trở thành POC. Dòng i=0 (biên trên cùng): distFromMid=7.5 → w=max(2,12-7.5×1.5)=max(2,0.75)=2 (mức sàn tối thiểu), trừ khi cũng chồng lấn thân nến (khi đó +5=7).

📦 Luồng 6: Đăng Ký Order Block Mới + Giới Hạn FIFO

  • Block mới (kèm toàn bộ box + trọng số vừa tạo) được đẩy vào mảng activeObs. Nếu kích thước mảng vượt quá maxObsInput → array.shift() lấy ra và xoá phần tử ĐẦU MẢNG (cũ nhất theo thứ tự tạo) - xoá toàn bộ box/nhãn của nó.

🗑️ Luồng 7: Cập Nhật Mỗi Nến - Kiểm Tra Vô Hiệu Hoá (Mitigation)

  • Mỗi nến, quét ngược qua từng block trong activeObs: mitigated = đúng nếu block tăng mà close đóng cửa dưới ob.low, hoặc block giảm mà close đóng cửa trên ob.high. Nếu đúng: xoá TOÀN BỘ box profile, box histogram, bong bóng và nhãn khối lượng thao túng đã tích luỹ của block đó, rồi loại nó khỏi mảng.
  • Ví dụ: block tăng có ob.low=1.2680. Giá sau đó đóng cửa 1.2675 (<1.2680) → mitigated=true → toàn bộ hình vẽ "sống" của block bị xoá. Riêng thanh delta 3 lớp + nhãn BOS/CHoCH ban đầu của nó (không nằm trong mảng theo dõi) vẫn giữ nguyên vĩnh viễn trên biểu đồ như một mốc lịch sử.

🔄 Luồng 8: Cập Nhật Mỗi Nến - Kéo Dài Hình Vẽ Đang Sống

  • Với các block CHƯA bị vô hiệu hoá: cạnh phải của toàn bộ box profile được kéo dài tới bar_index + 10; toạ độ của các box histogram được gán lại (dùng cùng trọng số và biên độ đã lưu, không đổi giá trị).

🫧 Luồng 9: Phát Hiện Thao Túng (Manipulation)

  • Với các block còn hoạt động: raidHigh = block đang giảm VÀ high hiện tại > ob.high VÀ close hiện tại ≤ ob.high (giá thò lên trên ranh giới rồi bị từ chối). raidLow đối xứng cho block tăng.
  • Khi đúng: manipVolScale = (khối lượng nến hiện tại / khối lượng cao nhất 200 nến) × manipSizeInput, phân vào 5 mức kích thước (tiny đến huge). Vẽ 1 bong bóng tròn (màu theo BEAR_COLOR nếu raidHigh, BULL_COLOR nếu raidLow) + 1 nhãn chữ hiện khối lượng rút gọn, cả 2 được lưu vào mảng của block để sau này bị xoá cùng lúc khi block bị vô hiệu hoá hoặc bị loại theo FIFO.
  • Ví dụ: block giảm có ob.high=1.2650. Nến hiện tại: high=1.2658 (>1.2650), close=1.2645 (≤1.2650) → raidHigh=true. Khối lượng nến=1500, khối lượng cao nhất 200 nến=5000, manipSizeInput=1.0 → tỷ lệ=(1500/5000)×1.0=0.30 → rơi vào mức "small". Bong bóng màu đỏ (BEAR_COLOR) xuất hiện tại giá 1.2658, nhãn chữ hiện "1.5K".

Đầu ra & vai trò trong sử dụng

  • Thanh delta + nhãn BOS/CHoCH: mốc lịch sử vĩnh viễn đánh dấu chính xác thời điểm, mức giá, và độ tự tin của mỗi lần phá vỡ cấu trúc.
  • Dải Volume Profile 15 dòng + histogram + dòng POC: hình dung trực quan "thân nến pivot tập trung ở đâu trong toàn bộ range của nó" - tham khảo cho vùng phản ứng tiềm năng khi giá quay lại block.
  • Bong bóng + nhãn thao túng: cảnh báo sống rằng ranh giới của một block đang hoạt động vừa bị kiểm tra và bảo vệ, kích thước tỷ lệ khối lượng tương đối.
  • Sự biến mất của một block: tín hiệu giá đã đóng cửa dứt khoát xuyên qua block đó (bị vô hiệu hoá) - tham chiếu cấu trúc này không còn giá trị nữa.
💡 Lưu ý khác: biến totalVolume (tính từ volLookbackInput) được khai báo nhưng KHÔNG được dùng ở bất kỳ đâu khác trong code - đây là hành vi vốn có của chỉ báo gốc (biến "chết"/dư thừa), không phải lỗi phát sinh từ phân tích này, không nên bịa ra công dụng cho nó. Chỉ báo cũng không có input màu tuỳ chỉnh (BULL_COLOR/BEAR_COLOR/POC_COLOR là hằng số cố định trong code) và không có alertcondition() nào - nếu cần cảnh báo tự động hoặc màu tuỳ biến, phải bổ sung ở Phase B (Strategy conversion).
Zoom/Pan Layered Image
Background Overlay
− +

Chỉ báo trên vừa hoá thành BOT TRADE — chỉ 1 click AI

📊Chỉ báo gốc
→
🤖AI convert 1-click
→
⚙️Bot tự trade 24/7