1. Mô Tả Directional Imbalance Index Strategy
Đếm số lần giá tạo đỉnh cao nhất / đáy thấp nhất trong một cửa sổ trượt, trong một chu kỳ nhìn lại nhất định, rồi biểu diễn tương quan giữa 2 phe dưới dạng bộ đếm tăng/giảm và % áp đảo.
1.1 Khái Niệm Chỉ Báo
Chỉ báo này đo "mất cân bằng có hướng" (directional imbalance) bằng một cách tiếp cận đơn giản nhưng khác biệt so với các oscillator momentum truyền thống: thay vì tính toán trên tốc độ thay đổi giá, nó đếm số lần một nến "chạm đỉnh cao nhất" (đỉnh của nến đó bằng đúng mức cao nhất trong cửa sổ trượt length+1 nến của chính nó) và số lần một nến "chạm đáy thấp nhất" (đối xứng), trong một chu kỳ nhìn lại gần đây (period nến).
Kết quả là 2 con số nguyên (Up/Dn) - số lần "chạm cao nhất" và "chạm thấp nhất" xảy ra trong chu kỳ đó - được vẽ dưới dạng 2 đường trong một pane riêng (như một oscillator), cộng thêm 2 nhãn % (bulls%/bears%) cho biết tỷ lệ đóng góp của mỗi phía trên tổng số sự kiện. Bên nào có Up/Dn cao hơn được xem là bên đang "áp đảo" - tạo nhiều đỉnh/đáy mới hơn trong giai đoạn gần đây.
- "Chạm cao nhất" khác pivot chuẩn: điều kiện chỉ yêu cầu nến đó là cao nhất trong cửa sổ length+1 nến TÍNH LÙI VỀ TRƯỚC (một phía) - không đòi hỏi các nến SAU đó cũng phải thấp hơn như pivot 2 phía chuẩn (VD ta.pivothigh) - nên xác nhận diễn ra ngay lập tức, không có độ trễ chờ xác nhận phía sau.
- Pane kép: chỉ báo chạy ở pane riêng (overlay=false) nhưng "ép" một số hình vẽ (nhãn "+1", đường Upper/Lower) hiện trực tiếp trên biểu đồ giá chính bằng force_overlay=true - kết hợp cả 2 góc nhìn: oscillator riêng biệt VÀ đánh dấu trực quan trên giá.
1.2 Chức Năng Chỉ Báo
- 2 Đường Oscillator (Up/Down): vẽ trong pane riêng bên dưới biểu đồ, đường nào đang chiếm ưu thế (Up>Dn hoặc ngược lại) được tô đậm màu, đường còn lại mờ đi (20% trong suốt).
- Vùng Tô Màu Giữa 2 Đường: tô theo màu của bên đang áp đảo, độ đậm phụ thuộc các nút "Bull"/"Bear" có đang bật hay không.
- Nhãn % (bulls%/bears%): 1 nhãn nổi duy nhất mỗi bên, luôn chỉ hiện tại nến cuối cùng, tự động xoá nhãn cũ mỗi lần cập nhật (không tích luỹ chồng chất).
- Nhãn "+1" trên biểu đồ giá: đánh dấu chính xác từng nến trong cửa sổ period gần nhất đã "chạm cao nhất"/"chạm thấp nhất" - đặt phía trên (nếu là cao nhất) hoặc phía dưới (nếu là thấp nhất) đúng nến đó, hiện trực tiếp trên biểu đồ giá dù chỉ báo chạy ở pane riêng.
- Đường Upper/Lower trên biểu đồ giá: đường cao nhất/thấp nhất trượt (length+1 nến) vẽ liên tục trên MỌI nến (không chỉ nến cuối), làm mốc tham chiếu trực quan cho các điều kiện "chạm".
1.3 Cách Dùng Chỉ Báo
- Đọc bên nào có Up/Dn cao hơn như bên đang kiểm soát: nếu Up liên tục vượt Dn, thị trường gần đây đang tạo nhiều đỉnh mới hơn đáy mới - thiên về bối cảnh tăng; ngược lại nghiêng về giảm.
- Theo dõi % để đo mức độ áp đảo, không chỉ hướng: bulls%=80% mang ý nghĩa khác hẳn bulls%=55% dù cả 2 đều "Up thắng Dn" - phần trăm cho biết chênh lệch rõ rệt hay chỉ nhỉnh hơn một chút.
- Dùng nhãn "+1" trên biểu đồ giá để xem CHÍNH XÁC những nến nào đang đóng góp vào bộ đếm hiện tại - hữu ích để hiểu tại sao Up/Dn đang ở mức đó, thay vì chỉ nhìn con số trừu tượng.
- Điều chỉnh "Highest/Lowest Length" để đổi độ nhạy của một "sự kiện chạm": tăng lên → chỉ những đỉnh/đáy thực sự nổi bật (so với cửa sổ rộng hơn) mới được tính, ít sự kiện hơn nhưng đáng kể hơn; giảm xuống → nhiều sự kiện nhỏ hơn được tính, nhạy hơn nhưng dễ nhiễu.
- Điều chỉnh "Calculation Period" để đổi "trí nhớ" của chỉ báo: chu kỳ dài hơn → Up/Dn phản ánh xu hướng dài hạn hơn, ít biến động qua từng nến; chu kỳ ngắn hơn → phản ứng nhanh với thay đổi gần đây nhưng dễ dao động.
- Không nhầm "chạm cao nhất/thấp nhất" với pivot 2 phía chuẩn: vì chỉ xác nhận 1 phía (không cần nến sau thấp hơn), một nến có thể được đếm là "+1" ngay khi vừa hình thành, kể cả khi sau đó giá tiếp tục đi thẳng theo hướng đó (không phải một đỉnh/đáy đảo chiều thực sự).
1.4 Cách Hoạt Động Của Chỉ Báo
Đầu vào & vai trò
- length ("Highest/Lowest Length", Số nguyên, mặc định: 10, tối thiểu 1): độ dài cửa sổ dùng để tính cao nhất/thấp nhất trượt (thực tế dùng length+1 trong ta.highest/lowest). Ví dụ: length=10 → mỗi nến được so sánh với 11 nến (chính nó + 10 nến trước) để xem có phải cao nhất/thấp nhất trong nhóm đó không. Tăng → chỉ những đỉnh/đáy nổi bật hơn mới đạt điều kiện "chạm", ít sự kiện hơn. Giảm → dễ đạt điều kiện hơn, nhiều sự kiện hơn.
- period ("Calculation Period", Số nguyên, mặc định: 70): số nến gần nhất được quét để đếm tổng số sự kiện "chạm cao nhất"/"chạm thấp nhất" (i=0 là nến hiện tại, i=period-1 là nến xa nhất được tính). Toàn bộ Up/Dn/bulls%/ bears% đều tính lại từ đầu dựa trên đúng cửa sổ này mỗi nến.
- showBul / colUp ("Bull", Boolean/Màu, mặc định: true / cam #FB8C00): bật/tắt hiển thị bên tăng (đường Up, nhãn %, phần tô màu) + màu dùng cho bên đó.
- showBer / colDn ("Bear", Boolean/Màu, mặc định: true / xanh dương #2962FF): tương tự cho bên giảm.
Các Khối Logic Chính
🎯 Luồng 1: Tính Cao Nhất/Thấp Nhất Trượt
- upper = ta.highest(high, length+1) và lower = ta.lowest(low, length+1) - tính LIÊN TỤC cho mọi nến trong lịch sử (là 1 series đầy đủ, không chỉ giá trị hiện tại), cho phép truy xuất upper[i]/lower[i] để biết "cao nhất trượt TẠI thời điểm đó trong quá khứ là bao nhiêu".
🔢 Luồng 2: Đếm Sự Kiện "Chạm" Trong Cửa Sổ Period
- Với mỗi i từ 0 tới period-1 (quét lùi từ nến hiện tại): lấy h = high[i], l = low[i] - giá trị high/low CỦA CHÍNH nến đó. Nếu h == upper[i] (nến đó CHÍNH LÀ đỉnh cao nhất trong cửa sổ length+1 nến của riêng nó) → cộng 1 vào countUp. Tương tự l == lower[i] → cộng 1 vào countDn.
- Up = countUp.sum(), Dn = countDn.sum() - tổng số sự kiện "chạm" mỗi bên trong toàn bộ cửa sổ period nến vừa quét.
- Ví dụ: length=10, period=70. Quét 70 nến gần nhất, đếm được 42 nến từng là "đỉnh cao nhất của chính nó trong 11 nến" (Up=42) và 28 nến từng là "đáy thấp nhất của chính nó trong 11 nến" (Dn=28). total=70, bulls=42/70×100=60%, bears=28/70×100=40%.
🏷️ Luồng 3: Vẽ Nhãn "+1" Trên Biểu Đồ Giá (chỉ tại nến cuối)
- Chỉ chạy khi barstate.islast: xoá TOÀN BỘ nhãn "+1" cũ (lưu trong mảng labels có var nên tồn tại xuyên các lần vẽ lại), sau đó quét lại đúng period nến gần nhất, vẽ 1 nhãn "+1" cho MỖI sự kiện "chạm" tìm thấy - phía trên (nếu chạm cao nhất, style "ldn" chỉ xuống) hoặc phía dưới (nếu chạm thấp nhất, style "lup" chỉ lên) đúng vị trí nến đó, dùng force_overlay=true để hiện trên biểu đồ giá chính dù chỉ báo đang ở pane riêng.
- Vì chỉ vẽ lại tại nến cuối và chỉ trong đúng cửa sổ period hiện tại, các nhãn "+1" KHÔNG phải một bản ghi lịch sử vĩnh viễn - khi có nến mới, cửa sổ dịch chuyển, nhãn cũ ngoài cửa sổ biến mất, nhãn mới xuất hiện.
🔖 Luồng 4: Nhãn % Tự Cập Nhật (bulls%/bears%)
- Nếu showBul bật: tạo nhãn mới l1 tại (bar_index, Up) hiện giá trị bulls% (định dạng %), rồi NGAY LẬP TỨC xoá l1[1] - tham chiếu tới đối tượng nhãn đã được lưu trong biến l1 CỦA NẾN TRƯỚC (nhờ cơ chế historical-reference của Pine với kiểu object) - kỹ thuật này tạo cảm giác "1 nhãn duy nhất đang cập nhật sống" mà không cần mảng lưu trữ hay dọn dẹp thủ công. showBer/Dn/bears% làm tương tự với l2.
📊 Luồng 5: Vẽ Oscillator Up/Down (pane riêng)
-
2 đường plot(Up)/plot(Dn) vẽ
trong pane riêng của chỉ báo (KHÔNG force_overlay) trên MỌI nến. Màu đường: nếu bên
đó đang bật (showBul/showBer) VÀ đang thắng thế (Up>Dn hoặc Up
- fill() tô vùng giữa 2 đường theo màu của bên đang thắng thế (bên thua để color(na), không tô), độ đậm 50% nếu nút hiển thị bên đó đang bật, 100% trong suốt (ẩn hẳn) nếu tắt.
📏 Luồng 6: Vẽ Upper/Lower Trên Biểu Đồ Giá (mọi nến)
- 2 lệnh plot(upper,...) / plot(lower,...) dùng force_overlay=true, chạy trên MỌI nến (không gated bởi barstate.islast) - vẽ liên tục đường cao nhất/thấp nhất trượt (length+1 nến) trực tiếp trên biểu đồ giá, làm mốc tham chiếu trực quan cho toàn bộ logic "chạm" phía trên.
Đầu ra & vai trò trong sử dụng
- 2 đường Up/Down + vùng tô: oscillator trực quan cho biết bên nào đang tạo nhiều đỉnh/đáy mới hơn trong period nến gần nhất, và mức độ áp đảo qua độ đậm màu.
- Nhãn % (bulls%/bears%): con số cụ thể hoá mức độ áp đảo, dễ so sánh giữa các thời điểm hơn là chỉ nhìn 2 đường.
- Nhãn "+1" trên biểu đồ giá: cho biết CHÍNH XÁC nến nào đang đóng góp vào bộ đếm hiện tại - kết nối con số trừu tượng với vị trí thật trên biểu đồ.
- Đường Upper/Lower trên biểu đồ giá: mốc tham chiếu trực quan cho điều kiện "chạm cao nhất/thấp nhất" đang dùng để tính chỉ báo.


