Isolated Scroll Container

1. Mô tả Volume Order Blocks Strategy

Mỗi khi một EMA nhanh cắt qua một EMA chậm hơn, chỉ báo quét lại nhịp vừa kết thúc để tìm cây nến đã tạo cực trị, dựng một hộp Order Block từ cây nến đó, và gắn cho hộp khối lượng đã cộng dồn trong suốt nhịp dẫn tới lúc cắt. Các hộp chồng lấn hoặc đã bị vô hiệu liên tục bị dọn bớt, và chỉ những hộp còn sống (tối đa 15 mỗi bên) mới được vẽ, mỗi hộp gắn nhãn tỉ trọng khối lượng của nó so với các hộp đang hiển thị cùng phía.

1.1 Concept của chỉ báo

Chỉ báo trả lời ba câu hỏi: "Nhịp cuối cùng trước xu hướng hiện tại thực sự bắt đầu từ đâu? Khối lượng giao dịch trong suốt nhịp đó là bao nhiêu? Và vùng này còn ý nghĩa không, hay giá đã xoá sổ nó rồi?" Nó coi một lần EMA nhanh cắt qua EMA chậm là xác nhận rằng một nhịp xu hướng vừa kết thúc, rồi nhìn lại để tìm đúng cây nến đánh dấu đáy (khi đảo lên) hoặc đỉnh (khi đảo xuống) của nhịp đó — đúng định nghĩa kinh điển "cây nến cuối cùng trước cú đẩy mạnh" của một Order Block.

  • Lần cắt là yếu tố kích hoạt, không phải bản thân vùng. Một EMA nhanh (độ dài length1, mặc định 5) cắt qua một EMA chậm hơn (luôn là length1 + 13, mặc định 18) đánh dấu thời điểm một nhịp giảm vừa đảo thành tăng (hoặc nhịp tăng vừa đảo thành giảm). Vùng sau đó được dựng bằng cách quét các nến của nhịp vừa kết thúc.
  • Hộp được neo vào cây nến cực trị của nhịp. Với một lần đảo tăng, chỉ báo tìm cây nến có đáy khớp với đáy thấp nhất của cửa sổ nhìn lại — đáy của cây nến đó và mức thấp hơn trong (mở, đóng) của nó trở thành hai mép của hộp. Với một lần đảo giảm, hình ảnh đối xứng: cây nến có đỉnh khớp với đỉnh cao nhất của cửa sổ, dùng mức cao hơn trong (mở, đóng) làm mép còn lại.
  • Khối lượng được cộng dồn suốt cả nhịp, không chỉ một cây nến. Con số gắn cho mỗi hộp là tổng khối lượng của mọi cây nến từ cây nến cực trị cho tới nến xác nhận cắt — một thước đo lượng giao dịch diễn ra trong suốt cả nhịp đi ra khỏi vùng đó, không phải khối lượng của riêng một cây nến.
  • Các vùng liên tục bị dọn bớt, không chỉ tạo một lần. Ở mỗi nến, hai vùng cùng phía nằm quá gần nhau (đo bằng một khoảng cách dựa trên biến động) bị gộp lại thành vùng gần hơn, và bất kỳ vùng nào giá đã đóng cửa xuyên qua đều bị loại bỏ hoàn toàn — nên những gì còn lại trên chart thường là một danh sách ngắn, đã lọc trùng, của các vùng vẫn được coi là "còn sống".
  • Mỗi vùng còn sống được gắn nhãn theo tỉ trọng khối lượng tương đối. Phần trăm hiển thị không phải tỉ trọng trên tổng khối lượng thị trường — đó là khối lượng cộng dồn của vùng này tính theo phần trăm so với tổng khối lượng của mọi vùng cùng phía khác đang còn sống trên chart.

Tóm lại: một bộ dò Order Block kích hoạt bởi lần cắt EMA, có cơ chế lọc trùng và vô hiệu hoá dựa trên biến động, mỗi vùng còn sống được gắn nhãn khối lượng đã tích luỹ trong nhịp dẫn tới nó, hiển thị dưới dạng tỉ trọng so với các vùng khác đang trên chart.

1.2 Chức năng của chỉ báo

  • Hiển thị:
    • Vùng tăng (cầu): một hình chữ nhật từ đáy thấp nhất của nhịp lên tới mức thấp hơn trong (mở, đóng) của cây nến cực trị, vẽ màu xanh ngọc — hai đường viền liền (dày 2px), một đường trung tâm nét đứt (tuỳ chọn, "Mid Line"), và vùng tô trong suốt 90% giữa hai viền.
    • Vùng giảm (cung): hình ảnh đối xứng, từ đỉnh của cây nến cực trị xuống tới mức cao hơn trong (mở, đóng) của nó, vẽ màu tím, cùng kiểu đường/vùng tô.
    • Nhãn tỉ trọng khối lượng ở mép phải mỗi vùng, đọc là ⮜ XX,X% (khối lượng) — tỉ trọng của vùng này so với tổng khối lượng của mọi vùng cùng phía khác đang hiển thị, cộng con số khối lượng thô.
    • Dải tô xu hướng (tuỳ chọn, "Trend Shadow"): một cặp EMA nhanh/chậm vô hình với khoảng giữa chúng được tô màu — xanh ngọc, đậm dần khi EMA nhanh vượt xa EMA chậm; tím, đậm dần khi EMA chậm vượt xa EMA nhanh — cả hai chia tỉ lệ theo khoảng cách lớn nhất của chính nó trong 100 nến gần nhất.
  • Alert: Chỉ báo KHÔNG có lệnh alertcondition() nào.

1.3 Cách dùng chỉ báo

  • Coi hộp xanh ngọc là vùng cầu và hộp tím là vùng cung — ý tưởng order-block kinh điển rằng giá có thể quay lại vùng đó và phản ứng, vì nó đánh dấu nơi nhịp đi ra khỏi vùng đã bắt đầu.
  • Dùng nhãn tỉ trọng khối lượng để xếp hạng các vùng với nhau, không phải so với cả thị trường. Một vùng đọc 35% trong khi các vùng khác chỉ 10–15% nổi bật giữa các vùng đang hiển thị cùng phía — không có nghĩa là 35% tổng khối lượng giao dịch.
  • Chờ đợi danh sách luôn ngắn và gần đây. Các vùng chủ động được gộp khi nằm gần nhau và bị loại ngay khi giá đóng cửa xuyên qua, nên những gì bạn thấy thường là một nhúm vùng liên quan nhất, chưa bị kiểm chứng, không phải lịch sử dài của mọi lần cắt trong quá khứ.
  • Chỉnh "Sensitivity Detection" để kiểm soát tần suất xuất hiện vùng mới. Giá trị nhỏ hơn làm cặp EMA nhanh/chậm cắt nhau thường xuyên hơn (nhiều nhịp nhỏ hơn, nhiều vùng hơn); giá trị lớn hơn làm lần cắt hiếm hơn (ít nhịp, nhịp lớn hơn). EMA chậm luôn dài hơn EMA nhanh đúng 13 nến — bạn không thể đặt riêng hai cái.
  • Dùng "Trend Shadow" như thước đo động lượng nhanh giữa các lần cắt — dải tô xanh ngọc đậm dần nói rằng EMA nhanh đang tách xa EMA chậm về phía trên, dải tô tím đậm dần là về phía dưới, so với khoảng cách đó đã rộng tới đâu trong 100 nến gần nhất.
  • Nhớ rằng các vùng chỉ được vẽ lại ở nến gần nhất. Logic dò và dọn dẹp chạy ở mọi nến lịch sử, nhưng các đường/nhãn thực tế chỉ được vẽ lại khi chart tới nến cuối cùng — kéo lùi lịch sử sẽ không cho bạn thấy các vùng "trông như thế nào" ở một nến trước đó.

1.4 Cách hoạt động của chỉ báo

Đầu vào & vai trò

  • length1 ("Sensitivity Detection: ", số nguyên, mặc định 5): độ dài của EMA nhanh. Ví dụ: ở 5, EMA chậm tự động là 18; ở 10, EMA chậm thành 23. Giá trị nhỏ hơn làm cặp cắt nhau thường xuyên hơn, nên vùng được dò thường xuyên hơn nhưng nhịp đằng sau mỗi vùng ngắn hơn.
  • mid_l ("Mid Line", ô tick, mặc định bật): hiện hoặc ẩn đường nét đứt giữa mỗi vùng.
  • trend_shadow ("Trend Shadow", ô tick, mặc định bật): hiện hoặc ẩn dải tô chuyển màu giữa EMA nhanh và chậm. Tắt = màu dải tô trong suốt hoàn toàn; bản thân hai EMA luôn vô hình dù bật hay tắt.
  • col1 / col2 (hai ô màu, không có tên, cùng một hàng, mặc định xanh ngọc #26ba9f và tím #6626ba): col1 tô mọi phần tử tăng (vùng, đường giữa, vùng tô, phía xanh ngọc của dải xu hướng); col2 tô mọi phần tử giảm. Chỉ đổi màu.

Hằng số cố định trong code (KHÔNG phải input)

  • Độ dài EMA chậm: luôn là length1 + 13 — không chỉnh riêng được.
  • Chiều cao tối thiểu của vùng: (ATR(200) cao nhất trong 200 nến gần nhất) × 1 — nếu chiều cao tự nhiên của vùng (cực trị tới mép thân nến) nhỏ hơn mức này, mép thân nến bị đẩy ra để đạt ít nhất chiều cao này.
  • Khoảng cách chồng lấn/gộp: (ATR(200) cao nhất trong 200 nến gần nhất) × 3 — đúng bằng 1,5× giá trị chiều cao tối thiểu ở trên. Hai vùng cùng phía có điểm giữa gần nhau hơn mức này bị gộp thành một.
  • Số vùng tối đa theo dõi mỗi phía: 15 (vùng cũ nhất bị loại khi vùng thứ 16 được thêm vào).
  • Giới hạn cấp chỉ báo: max_lines_count = 500, max_labels_count = 500, max_bars_back = 5000.

Các khối logic chính

⏱️ Flow 0 — Thứ tự làm việc ở mỗi cây nến

  • ① cập nhật cặp EMA nhanh/chậm và dải tô xu hướng → ② khi có lần cắt đã xác nhận, quét nhịp vừa kết thúc và tạo một vùng mới → ③ ở mọi nến, dọn các vùng đã gộp vào vùng lân cận hoặc bị giá vô hiệu hoá, và giới hạn danh sách ở 15 → ④ chỉ ở nến cuối cùng của chart, xoá và vẽ lại đường, vùng tô và nhãn khối lượng của mọi vùng còn sống.

🌊 Flow 1 — Cặp EMA và dải tô xu hướng

  • ema1 = EMA(close, length1), ema2 = EMA(close, length1 + 13). cross_up / cross_dn nổ ra khi ema1 cắt ema2, chỉ chốt ở nến đã đóng.
  • difff = ema2 − ema1: âm khi EMA nhanh dẫn trước (xu hướng tăng), dương khi EMA chậm dẫn trước (xu hướng giảm). Vùng tô vô hình giữa hai EMA được tô màu theo vị trí của difff trong khoảng cao/thấp 100 nến của chính nó — trong suốt hoàn toàn khi vừa cắt (khoảng cách gần 0), tô đầy đủ ở khoảng cách rộng nhất thấy được trong 100 nến gần nhất.

📦 Flow 2 — Dò một vùng mới ở mỗi lần cắt

  • Khi cross_up (tăng): quét từ nến 1 tới length2 về trước (bỏ qua chính nến cắt) tìm nến có đáy bằng lowest (đáy thấp nhất của cửa sổ đó). Khi tìm thấy ở độ lệch i: cộng khối lượng của mọi nến từ nến hiện tại lùi về tới nến đó (tổng cộng i + 1 nến) → con số khối lượng của vùng. Mép trên của vùng là mức thấp hơn trong (mở, đóng) của nến đó; mép dưới là chính lowest. Nếu khoảng cách tự nhiên giữa chúng nhỏ hơn hằng số chiều cao tối thiểu, mép trên bị kéo xuống để đạt mức đó.
  • Ví dụ cụ thể: đáy thấp nhất của một nhịp giảm là 61.200, và cây nến tạo ra nó đóng cửa ở 61.340 (thấp hơn giá mở 61.410) — mép trên 61.340 (giá đóng, vì thấp hơn giá mở), mép dưới 61.200, chiều cao 140. Nếu hằng số chiều cao tối thiểu là 220, mép trên bị kéo xuống thành 61.420 thay vào đó (61.200 + 220) để hộp cao ít nhất mức đó.
  • Khi cross_dn (giảm): hình ảnh đối xứng — quét tìm nến có đỉnh bằng highest, khối lượng cộng theo cách tương tự, mép trên = highest, mép dưới = mức cao hơn trong (mở, đóng) của nến đó (bị kéo lên nếu cần để đạt chiều cao tối thiểu).
  • Nếu không có cây nến lịch sử nào trong cửa sổ khớp chính xác với cực trị của cửa sổ (ví dụ, chính nến cắt lại là cực trị), phép quét không tìm thấy gì và không có vùng nào được tạo cho lần cắt đó.

🧹 Flow 3 — Dọn dẹp: chồng lấn, vô hiệu hoá, và trần 15 vùng

  • Ở mọi nến (không chỉ lúc cắt), toàn bộ danh sách các vùng đang theo dõi mỗi phía được quét lại từ cũ nhất tới mới nhất. Với mỗi vùng, hai phép kiểm chạy: nó có quá gần vùng lân cận không, và giá đã đóng cửa xuyên qua nó chưa.
  • Chồng lấn: nếu điểm giữa của một vùng nằm trong khoảng cách gộp so với điểm giữa của vùng trước đó, vùng cũ hơn trong hai vùng bị xoá trắng, chỉ để lại vùng mới hơn. Ví dụ: hai vùng tăng có điểm giữa cách nhau 4 điểm, khoảng cách gộp 150 — chúng nằm trong tầm, nên vùng cũ hơn bị loại.
  • Vô hiệu hoá: một vùng tăng bị xoá trắng ngay khi close rơi xuống dưới mép dưới của nó (giá đã đóng cửa xuyên hẳn qua vùng cầu); một vùng giảm bị xoá trắng ngay khi close đóng cửa trên mép trên của nó.
  • Phép so sánh cũ nhất-với-mới nhất: vùng đầu tiên được kiểm trong lượt quét (vùng cũ nhất trong danh sách) được so với vùng cuối cùng trong danh sách thay vì một "vùng trước vùng đầu tiên" không tồn tại — nên riêng cặp này là phép so cũ nhất-với-mới nhất, không phải cũ nhất-với-không-có-gì, trong khi mọi cặp khác trong lượt quét so một vùng với vùng ngay trước nó.
  • Khi danh sách có hơn 15 vùng (tính cả những vùng đã bị xoá trắng nhưng chưa thực sự bị gỡ), ô cũ nhất bị loại.

🖊️ Flow 4 — Vẽ ở nến cuối cùng

  • Chỉ khi script tới nến cuối cùng hiện tại của chart: mọi đường/vùng tô/nhãn đã vẽ trước đó cho một phía bị xoá, rồi vẽ lại hoàn toàn mới từ những vùng hiện đang còn sống trong danh sách phía đó.
  • Với mỗi vùng: hai đường viền liền dày 2px (mép trên và mép dưới) từ cây nến neo của vùng tới nến hiện tại, một đường nét đứt tuỳ chọn ở điểm giữa, vùng tô trong suốt 90% giữa hai viền, và một nhãn ở mép phải ghi tỉ trọng của vùng này so với tổng khối lượng của mọi vùng cùng phía đang còn sống, cộng con số khối lượng thô.

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

  • Vùng xanh ngọc / tím: khu vực cầu / cung neo vào cây nến bắt đầu nhịp đi ra khỏi chúng.
  • Nhãn khối lượng: xếp hạng tương đối về lượng giao dịch diễn ra trong nhịp đằng sau mỗi vùng đang hiển thị.
  • Dải tô xu hướng: thước đo động lượng EMA nhanh giữa các lần cắt.
💡 Ghi chú kỹ thuật quan trọng:
  • Phép so sánh cũ nhất-với-mới nhất phụ thuộc vào việc Pine xử lý chỉ số mảng âm bằng cách đếm từ cuối mảng. Vòng lặp dọn dẹp đọc vùng "trước đó" bằng array.get(i − 1), và ở i = 0 điều này trở thành array.get(-1). Chỉ báo này (và strategy đã được chuyển đổi từ nó trong dự án này, với một kết quả backtest đã có sẵn) rõ ràng chạy được trong thực tế, đó là bằng chứng mạnh nhất rằng Pine xử lý chỉ số âm ở đây theo kiểu "đếm từ cuối" thay vì báo lỗi. Một hệ quả cụ thể của hành vi đó: khi danh sách một phía chỉ có đúng một vùng, vùng đơn độc đó bị so với chính nó (chỉ số 0 vòng lại chính nó), và vì một giá trị luôn nằm trong khoảng cách gộp so với chính nó, nó bị xoá trắng ngay cùng nến nó được tạo ra — một vùng đơn độc, không có vùng lân cận, khó tồn tại trên chart hơn một vùng đã có "bạn đồng hành". Đáng để tự kiểm chứng trên chart của bạn nếu có lúc thấy một vùng đơn độc biến mất ngay lập tức.
  • Các vùng bị xoá trắng (đã dọn) không bị gỡ khỏi danh sách về mặt vật lý — chúng bị ghi đè bằng một ô trống và chỉ rời khỏi danh sách khi trần 15 vùng đẩy chúng ra từ đầu danh sách. Chúng không đóng góp khối lượng thật vào phần trăm của nhãn (bước cộng tổng bỏ qua các giá trị trống/vắng), nhưng nếu bước vẽ ở Flow 4 có lúc nào đó chạm tới một ô vẫn còn trống, việc vẽ một đường từ một vị trí chưa xác định thường sẽ hoặc lỗi hoặc tự động bỏ qua — một lần nữa, việc script này đã chạy như một strategy hoạt động được trong dự án này là bằng chứng thực tế rằng điều này không gây rắc rối trong sử dụng bình thường.
  • Con số khối lượng là tổng của cả nhịp, không phải khối lượng của một cây nến. Nó cộng mọi cây nến từ nến neo cho tới nến cắt, nên một nhịp dài hơn (nhiều nến hơn giữa cực trị và lần cắt) tự nhiên tích luỹ một con số lớn hơn dù hoạt động giao dịch mỗi nến không có gì đặc biệt.
  • Phần trăm là tương đối, không phải tuyệt đối. Nó luôn được đo so với tổng của các vùng khác đang còn sống cùng phía tại thời điểm đó — khi các vùng cũ hơn bị gộp hoặc vô hiệu hoá và rời khỏi danh sách, phần trăm hiển thị của cùng một vùng có thể thay đổi theo thời gian dù con số khối lượng của chính nó không bao giờ đổi.
  • Độ dài EMA chậm không phải cài đặt tự do — nó vĩnh viễn là Sensitivity Detection + 13, nên hai EMA không thể chỉnh riêng độc lập.
  • Không có alert. Mọi thứ dựa trên sự kiện (một vùng mới xuất hiện, một vùng bị vô hiệu hoá) đều phải tự bổ sung.
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