1. Mô tả Trend Pivots Profile Strategy
Vẽ hồ sơ khối lượng (volume profile) riêng cho từng nhịp sóng (swing) giữa 2 điểm đảo chiều (pivot), dùng dữ liệu volume nội nến kéo từ khung thời gian thấp hơn, cộng thêm 1 đường xu hướng kiểu kênh Donchian.
1.1 Concept của chỉ báo
Chỉ báo dựa trên ý tưởng Volume Profile quen thuộc (biểu đồ ngang cho biết khối lượng giao dịch tập trung nhiều nhất ở vùng giá nào), nhưng thay vì vẽ 1 profile cố định cho cả phiên/tuần, chỉ báo này tự động vẽ 1 profile riêng cho mỗi nhịp sóng tăng/giảm (giữa 2 điểm đảo chiều pivot liên tiếp) và tìm ra Point of Control (PoC) — mức giá có khối lượng giao dịch nhiều nhất trong đúng nhịp sóng đó.
- Vì sao cần dữ liệu khung thời gian thấp hơn (LTF): nến trên chart bạn xem (VD 15 phút) chỉ cho biết TỔNG volume của cả nến, không biết volume đó xảy ra ở mức giá cụ thể nào trong nến. Chỉ báo tự "mổ" mỗi nến lớn thành nhiều nến/giao dịch nhỏ hơn (VD nến 3 phút) để biết chính xác giá nào hút nhiều volume nhất.
- Đường xu hướng kiểu Donchian: song song với phần profile, chỉ báo duy trì 1 trạng thái "đang ở pha tăng hay giảm" đơn giản bằng cách theo dõi khi nào giá lập đỉnh/đáy mới trong N nến gần nhất — dùng để tô màu profile và vẽ 1 đường xu hướng tham chiếu.
1.2 Chức năng của chỉ báo
-
Hiển thị:
- Đường Trend: 1 đường dày, mờ, là trung bình cộng của giá cao nhất & thấp nhất trong "Trend Length" nến gần nhất (kiểu đường giữa kênh Donchian) — luôn hiện bất kể các cài đặt khác.
- Hồ sơ khối lượng theo từng nhịp sóng (khi "Pivot Profile" BẬT): mỗi khi 1 nhịp sóng hoàn tất (xác nhận bởi 1 pivot đối lập), chỉ báo vẽ 1 hình "biểu đồ cột nằm ngang" (polyline tô màu mờ) bên cạnh nhịp sóng đó, cho thấy khối lượng tập trung nhiều/ít ở từng vùng giá.
- Điểm đảo chiều (●): 1 chấm tròn màu đặt đúng tại đỉnh/đáy pivot vừa được xác nhận.
- Đường + nhãn PoC (Point of Control): 1 đoạn line ngang ngắn + nhãn số volume, đặt đúng tại mức giá có khối lượng lớn nhất của nhịp sóng đó.
- Chế độ tối giản (khi "Pivot Profile" TẮT): ẩn toàn bộ hình vẽ ở trên, thay bằng 1 đường plot liên tục xuyên suốt chart theo dõi đúng mức giá PoC hiện tại — phù hợp khi muốn dùng PoC như 1 chuỗi dữ liệu bình thường (VD để tham chiếu trong chỉ báo/chiến lược khác).
- Alert: Chỉ báo KHÔNG có alertcondition() nào — chỉ thuần hiển thị trực quan.
1.3 Cách dùng chỉ báo
- Dùng mức PoC của nhịp sóng gần nhất làm vùng hỗ trợ/kháng cự tiềm năng: đây là mức giá mà thị trường "giao dịch nhiều nhất" trong đúng nhịp sóng vừa qua, thường được thị trường "nhớ" và phản ứng lại khi quay về.
- Nhìn hình dạng profile (rộng/hẹp, lệch trên/lệch dưới) để đánh giá nhịp sóng đó là "trải đều" (dễ đảo chiều, không có vùng tích luỹ rõ) hay "dồn mạnh 1 vùng" (dễ tạo hỗ trợ/kháng cự chắc).
- Theo dõi đường Trend (kênh Donchian) như 1 tham chiếu xu hướng nền, kết hợp với các profile riêng lẻ để biết đang ở nhịp sóng nào trong xu hướng lớn.
- Bật "Pivot Profile" khi phân tích trực quan, tắt đi và dùng đường PoC dạng plot khi cần đưa mức PoC vào tính toán ở nơi khác.
1.4 Cách hoạt động của chỉ báo
Đầu vào & vai trò
- length ("Pivot Length", số nguyên, mặc định 10): vừa là số nến 2 bên để xác nhận 1 pivot cao/thấp (nên pivot luôn được biết TRỄ đúng "length" nến sau khi nó thực sự hình thành), vừa là 1 nửa bề rộng cửa sổ dùng để dựng mỗi profile (luôn quét lùi length×2+1 nến quanh mỗi pivot), vừa là độ dài tối đa (tính bằng nến) mà thanh profile ở mức giá "hot" nhất có thể vươn sang phải.
- trendLength ("Trend Length", số nguyên, mặc định 50): số nến dùng để tính đỉnh cao nhất/đáy thấp nhất gần đây (kiểu kênh Donchian) — vừa để vẽ đường Trend, vừa để xác định trạng thái "đang pha tăng hay giảm".
- Profile ("Pivot Profile", bật/tắt, mặc định BẬT): chuyển đổi giữa chế độ đầy đủ (polyline hồ sơ khối lượng + chấm pivot + line/nhãn PoC riêng biệt, có màu) và chế độ tối giản (chỉ 1 đường plot liên tục theo mức PoC, không polyline, không chấm).
- colorUp / colorDn (màu, mặc định xanh dương/cam): xem kỹ ở lưu ý kỹ thuật — 2 màu này KHÔNG đơn giản là "xu hướng tăng"/"xu hướng giảm" theo nghĩa trực quan, mà gắn với LOẠI pivot đang neo profile hiện tại (pivot cao hay pivot thấp).
Các khối logic chính
📈 Luồng 1 — Trạng thái xu hướng kiểu Donchian (mọi nến)
- H = giá cao nhất, L = giá thấp nhất trong trendLength nến gần nhất; TrendLine = trung bình cộng (H+L)/2 — đây là đường "Trend" luôn được vẽ.
- Biến trạng thái trend (được giữ nguyên qua các nến, chỉ đổi khi có sự kiện mới): chuyển thành true ngay khi nến hiện tại lập đỉnh cao mới trong trendLength nến (high == H); chuyển thành false ngay khi nến hiện tại lập đáy thấp mới (low == L); nếu không có sự kiện nào thì giữ nguyên giá trị cũ.
🔍 Luồng 2 — Xác định khi nào chốt xong 1 nhịp sóng để vẽ profile (mọi nến)
- ph/pl = pivot cao/thấp đã XÁC NHẬN (trễ đúng length nến mỗi bên).
- Cờ pivot: nếu trend hiện đang là false (sự kiện gần nhất là 1 đáy mới) → chờ 1 pivot CAO mới xác nhận (ph) — đây chính là đỉnh của nhịp sóng tăng vừa kết thúc trước khi giá quay đầu giảm. Nếu trend đang là true (sự kiện gần nhất là 1 đỉnh mới) → chờ 1 pivot THẤP mới xác nhận (pl) — đáy của nhịp sóng giảm vừa kết thúc.
- Khi pivot=true VÀ đã đủ khoảng cách kể từ lần vẽ profile trước ((bar_index-length)-start > length) → bắt đầu 1 chu kỳ dựng profile MỚI, neo tại đúng nến chứa pivot đó (start := bar_index-length).
📥 Luồng 3 — Kéo dữ liệu giao dịch nội nến (LTF) cho cả cửa sổ nhịp sóng
- Khung thời gian phụ (LTF) được tự chọn theo khung chart hiện tại: nếu chart ≤1 phút → dùng LTF 5 giây; ngược lại → LTF = làm tròn LÊN(số phút chart ÷ 5). Ví dụ: chart 15 phút → LTF = ⌈15/5⌉ = 3 phút; chart 60 phút → LTF = ⌈60/5⌉ = 12 phút.
- Mỗi nến trên chart tự "nhớ" toàn bộ giá đóng cửa & volume của các nến LTF xảy ra bên trong nó (qua request.security_lower_tf). Khi 1 profile mới bắt đầu dựng, code "lật lại" length×2+1 nến gần đây (đúng cửa sổ quanh pivot) và đọc lại TOÀN BỘ dữ liệu LTF đã lưu của từng nến đó để tổng hợp.
📊 Luồng 4 — Dựng hồ sơ khối lượng theo giá (volume-at-price)
- Khoảng giá [đáy, đỉnh] = giá thấp nhất/cao nhất trong đúng length×2+1 nến vừa quét. Bề rộng mỗi "bin" (khoảng giá) = atr = 10% của ATR(200) — cố định theo biến động chung, không phụ thuộc riêng vào nhịp sóng.
- Với MỖI giao dịch LTF đã ghi nhận trong cửa sổ: volume của nó được cộng vào MỌI bin có tâm nằm trong phạm vi ±2×atr quanh giá đóng cửa của giao dịch đó (không phải chỉ 1 bin gần nhất) — xem lưu ý kỹ thuật về việc này tạo ra 1 hồ sơ "làm mượt", các bin cạnh nhau chồng lấn dữ liệu.
- Ví dụ cụ thể: ATR(200)=20 → atr(bin)=2.0. Khoảng giá nhịp sóng rộng 24 điểm → 12 bin, mỗi bin rộng 2.0. 1 giao dịch LTF đóng cửa tại giá X sẽ được cộng volume vào MỌI bin có tâm cách X không quá 4.0 điểm (±2 bin) — tức thường rơi vào 3-4 bin liền kề chứ không phải chỉ 1 bin duy nhất.
🎨 Luồng 5 — Vẽ hình profile & đánh dấu PoC
- Mỗi bin được vẽ thành 1 điểm của đường polyline, "vươn ra" bên phải 1 khoảng tỉ lệ với (volume bin đó ÷ volume bin lớn nhất) × length — bin có volume cao nhất vươn xa nhất (tối đa = length nến); riêng bin đầu tiên & bin cuối cùng luôn bị ghim về đúng cột "start" (không vươn ra) để hình khép kín thành 1 "silhouette" biểu đồ cột nằm ngang.
- Bin có volume lớn nhất được đánh dấu là PoC: vẽ 1 đoạn line ngắn + nhãn số volume (định dạng gọn, VD "1.2M").
- Nếu Profile bật: vẽ thêm polyline tô màu mờ + 1 chấm tròn màu tại đúng điểm pivot. Nếu tắt: bỏ qua toàn bộ phần này, chỉ còn 1 đường plot() liên tục theo dõi giá PoC hiện tại xuyên suốt chart.
🧹 Luồng 6 — Dọn dẹp hình vẽ cũ (mọi nến)
- Chỉ giữ tối đa 25 bộ profile gần nhất trên chart; khi có bộ thứ 26, bộ CŨ NHẤT (polyline + line PoC + nhãn PoC + chấm pivot) bị xoá hẳn — vừa để tránh chart quá rối, vừa để không vượt giới hạn số lượng object của Pine (đã khai báo max_labels_count=500, max_lines_count=500, max_polylines_count=100 ở đầu code).
Đầu ra & vai trò trong sử dụng
- Đường Trend: tham chiếu nhanh đang ở pha nào của kênh giá gần đây.
- Hồ sơ khối lượng theo nhịp sóng + PoC: xác định vùng giá "hot" nhất của từng nhịp sóng, dùng làm mốc hỗ trợ/kháng cự có cơ sở khối lượng thay vì chỉ dựa vào hình dạng giá.
- Chế độ plot liên tục (Profile tắt): cho phép lấy mức PoC như 1 chuỗi giá trị bình thường để dùng ở nơi khác.
- Hồ sơ khối lượng KHÔNG phải histogram chặt (mutually-exclusive): ngưỡng gán volume vào bin là ±2×atr (2 lần bề rộng bin) chứ không phải ±0.5×atr (nửa bin) như 1 histogram bình thường — nghĩa là gần như mọi giao dịch đều bị cộng lặp vào 3-4 bin liền kề. Hình dạng profile vì vậy được "làm mượt" đáng kể, không phản ánh chính xác tỉ lệ volume tuyệt đối của từng mức giá riêng lẻ.
- colorUp/colorDn gắn với LOẠI pivot đang neo, không phải "trend đang tăng/giảm": colorUp (mặc định xanh dương) được dùng khi trend hiện đang là false — tức là code vừa xác nhận xong 1 pivot CAO, đánh dấu 1 nhịp sóng TĂNG vừa kết thúc; colorDn (mặc định cam) dùng khi trend đang là true, vừa xác nhận xong 1 pivot THẤP, đánh dấu 1 nhịp GIẢM vừa kết thúc. Tên biến dễ khiến hiểu lầm là "màu theo trạng thái trend hiện tại" trong khi thực chất nó mô tả HƯỚNG của nhịp sóng vừa hoàn tất.
- "+15 nến" ở dòng tạo PoC line bị ghi đè ngay trong cùng 1 nến: khi 1 PoC line mới được tạo, nó được set kéo dài tới "start+right+15" — nhưng ngay sau đó, dòng PoClevel.set_x2(bar_index+5) chạy VÔ ĐIỀU KIỆN ở cuối mỗi nến sẽ ghi đè lại giá trị x2 này. Kết quả thực tế trên chart: đoạn PoC line luôn chỉ trông như đang "đuổi theo" 5 nến phía sau nến hiện tại, con số "+15" gần như không có tác dụng thị giác.


