1. Mô tả Triangular Hull Moving Average + Volatility Strategy
Một đường Triangular Hull Moving Average (một cách làm mượt giá nhanh, độ trễ thấp) vẽ dưới dạng một dải nến mà thân nến thể hiện chuyển động 2 nến gần nhất của chính đường, và râu nến kéo dài theo một thước đo biến động biên độ nến gần đây đã được làm mượt kiểu Hull. Màu đổi ngay khi độ dốc của đường đảo chiều, các dấu tam giác đánh dấu đúng nến đó, và một bảng nhỏ báo mũi tên xu hướng hiện tại cùng mức biến động hôm nay so với 1000 nến gần nhất.
1.1 Concept của chỉ báo
Chỉ báo kết hợp hai ý tưởng riêng biệt vào một hình vẽ: "Đường xu hướng nhanh, độ trễ thấp đang hướng về đâu ngay lúc này?" và "Nến gần đây đã dao động rộng tới đâu, so với mức rộng nhất trong 1000 nến gần nhất?" Cả hai câu trả lời được gói gọn trong một dải nến duy nhất chạy dọc chart.
- Đường xu hướng là một Triangular Hull Moving Average (THMA) — một công thức cụ thể gồm ba trung bình có trọng số (theo độ dài, nửa độ dài và một phần ba độ dài) kết hợp rồi làm mượt thêm một lần nữa, được thiết kế để bám sát giá với độ trễ thấp hơn nhiều so với một trung bình động thường cùng độ dài.
- Hướng đến từ việc so sánh đường với chính nó, cách đó 2 nến. Chỉ có đúng một đường THMA; chỉ báo còn xem giá trị của chính đường đó cách đây 2 nến là bao nhiêu, và coi "giá trị hiện tại cao hơn/thấp hơn giá trị 2-nến-trước" là đang tăng/giảm.
- Thân của mỗi "cây nến" được vẽ chính là chuyển động 2 nến của chính đường. Thay vì vẽ một đường đơn giản, chỉ báo dùng plotcandle() với giá trị THMA hiện tại làm một mép và giá trị cách đây 2 nến làm mép kia — nên chiều cao và hướng của thân nến thể hiện đúng đường đã di chuyển bao xa và theo chiều nào gần đây.
- Râu nến là thước đo biến động, không phải râu nến giá thật. Chúng kéo dài ra ngoài thân nến theo một trung bình biên độ nến gần đây (cao − thấp) đã làm mượt kiểu Hull, nên râu nến rộng hơn nghĩa là nến gần đây đã dao động rộng hơn — việc này không liên quan gì tới râu nến thật của các cây nến giá bên dưới.
- Một lần đảo độ dốc là tín hiệu duy nhất. Ngay khi đường cắt qua giá trị 2-nến-trước của chính nó (đổi từ giảm sang tăng, hoặc ngược lại), một dấu tam giác xuất hiện và màu của mọi thứ đổi theo.
Tóm lại: một đường xu hướng Hull độ trễ thấp, hiển thị dưới dạng dải nến mà thân nến cho thấy chuyển động gần đây của chính nó và râu nến cho thấy biến động gần đây so với 1000 nến gần nhất, kèm các dấu và một bảng nhỏ dựng quanh những thời điểm độ dốc của nó đảo chiều.
1.2 Chức năng của chỉ báo
-
Hiển thị:
- Dải nến THMA: một "cây nến" mỗi nến chart, thân từ giá trị THMA hiện tại tới giá trị cách đây 2 nến, râu kéo dài thêm theo thước đo biến động ở mỗi bên. Tô màu xanh ngọc khi đường đang tăng, tím khi đang giảm, viền luôn đặc hoàn toàn bất kể cài đặt "Volatility".
- Hai kiểu thân/râu (do "Volatility" điều khiển): khi bật, thân nến trong suốt một phần và râu nến hiện ra ở cùng độ trong suốt, nên mức biến động có thể đọc được trực quan theo từng nến; khi tắt, thân nến trở nên đặc hoàn toàn và râu nến biến mất hoàn toàn — con số biến động vẫn luôn được tính và hiển thị trong bảng dù bật hay tắt, chỉ có phần vẽ râu bị ẩn.
- Dấu tam giác chỉ xuất hiện ở nến độ dốc đảo chiều: tam giác xanh ngọc phía dưới đường khi đảo tăng, tam giác tím phía trên đường khi đảo giảm, mỗi dấu vẽ bằng một quầng mờ nhỏ cộng một tâm nhỏ đặc.
- Bảng 2 hàng (dưới-phải, chỉ ở nến cuối): mũi tên xu hướng hiện tại (↑/↓, nhớ từ lần đảo gần nhất) và mức biến động hiện tại tính theo phần trăm so với mức tối đa của chính nó trong 1000 nến.
- Alert: Chỉ báo KHÔNG có lệnh alertcondition() nào.
1.3 Cách dùng chỉ báo
- Đọc màu của dải nến như bộ lọc xu hướng. Xanh ngọc nghĩa là đường Hull hiện cao hơn giá trị 2 nến trước (đang tăng); tím nghĩa là thấp hơn (đang giảm). Coi một lần đổi màu là tín hiệu hướng duy nhất của chỉ báo.
- Dùng các dấu tam giác để bắt đúng nến đảo chiều mà không cần theo dõi màu dải nến từng nến một — chúng chỉ xuất hiện ở đúng nến độ dốc thực sự quay đầu.
- Đọc độ dài râu nến như "nến gần đây đã dao động rộng tới đâu", không phải hỗ trợ/kháng cự giá. Râu kéo dài xa cả trên và dưới thân nến nói rằng biên độ nến gần đây đang gần mức rộng nhất thấy được trong 1000 nến; râu mỏng nói điều ngược lại.
- Tắt "Volatility" nếu bạn chỉ muốn một dải hướng sạch hơn — việc này chỉ ẩn râu nến và làm thân nến đặc lại; nó không làm dừng việc theo dõi và hiển thị phần trăm biến động trên bảng.
- Đọc phần trăm "Volatility" trong bảng như một con số tương đối, không phải tuyệt đối. 80% nghĩa là mức biên độ đã làm mượt hôm nay bằng 80% đường đi tới mức cao nhất thấy được ở bất kỳ đâu trong 1000 nến gần nhất — nó không nói gì về kích thước điểm/phần trăm thực của biên độ đó.
- Chỉnh "Length" để đổi tốc độ phản ứng của chính đường (nhỏ hơn = nhạy hơn nhưng nhiều lần đảo hơn; lớn hơn = mượt hơn nhưng quay đầu chậm hơn), và độ dài "Volatility" (ô số nhỏ không tên cạnh ô tick) để đổi độ mượt của mức đọc râu nến, độc lập với đường chính.
1.4 Cách hoạt động của chỉ báo
Đầu vào & vai trò
- len_ ("Length", số nguyên, mặc định 40, min 1): độ dài làm mượt của THMA. Ví dụ: ở 40, ba trung bình có trọng số nội bộ dùng khoảng 13, 20 và 40 nến; ở 20, khoảng 7, 10 và 20 nến — một đường nhanh hơn, nhạy hơn với nhiều lần đảo hơn.
- source ("Source", ô chọn chuỗi giá, mặc định close): THMA được dựng từ chuỗi giá nào.
- volat ("Volatility", ô tick, mặc định bật, cùng hàng với độ dài bên dưới): quyết định râu nến của dải có được vẽ và thân nến có trong suốt một phần (bật) hay râu nến bị ẩn và thân nến đặc (tắt). Chỉ là hiển thị — con số biến động luôn được tính và luôn hiện trên bảng.
- len_vol (ô số không tên, cùng hàng với "Volatility", mặc định 15): độ dài làm mượt của thước đo biên độ nến (độ dài râu) — hoàn toàn độc lập với len_. Ví dụ: 15 → mức đọc biên độ làm mượt vừa phải; 5 → nhạy hơn, phản ứng mạnh hơn với từng cây nến rộng đơn lẻ; 50 → mượt hơn nhiều, đổi chậm hơn.
- color_u / color_d (hai ô màu, không có tên, cùng một hàng, mặc định xanh ngọc #16e5a0 và tím #741ddd): màu tăng / giảm dùng cho dải nến, các dấu, và chữ xu hướng trong bảng. Chỉ đổi màu.
Hằng số cố định trong code (KHÔNG phải input)
- Độ lệch so sánh 2 nến: đường luôn được so với giá trị của chính nó cách đây 2 nến, cho cả màu độ dốc lẫn tín hiệu cắt — không chỉnh được.
- Trần biến động 1000 nến / phân vị thứ 100: mức "tối đa" tham chiếu mà mức biến động hiện tại được đo so với là giá trị cao nhất mà biên độ nến đã làm mượt kiểu Hull đạt được ở bất kỳ đâu trong 1000 nến gần nhất — một cửa sổ cố định, độc lập với len_vol.
- Độ lệch của dấu: ATR(200) — đẩy tam giác lên/xuống khỏi đường để không nằm đè lên đường.
- Vị trí/kích thước bảng: dưới-phải, cấp phát 10 cột × 10 hàng, chỉ 2 ô được dùng, chỉ vẽ ở nến cuối cùng của chart.
Các khối logic chính
⏱️ Flow 0 — Thứ tự làm việc ở mỗi cây nến
- ① dựng giá trị THMA cho nến này → ② so với giá trị của chính nó cách đây 2 nến để dò lần đảo độ dốc và cập nhật mũi tên xu hướng được nhớ → ③ quyết định màu của dải nến từ cùng phép so sánh → ④ đo biến động biên độ nến gần đây và chia tỉ lệ theo trần 1000 nến của chính nó → ⑤ vẽ "cây nến" hình dải (kiểu vẽ tuỳ thuộc "Volatility") → ⑥ chỉ ở nến đảo chiều, vẽ dấu tam giác → ⑦ chỉ ở nến cuối cùng của chart, cập nhật bảng.
📐 Flow 1 — Dựng Triangular Hull Moving Average
- Ba trung bình động có trọng số của source được tính, trên len_ ÷ 3, len_ ÷ 2 và len_ nến. Chúng được kết hợp thành 3 × (ngắn nhất) − (vừa) − (dài nhất), triệt tiêu phần lớn độ trễ mà một trung bình có trọng số đơn lẻ sẽ có, và kết quả được làm mượt thêm một lần nữa bằng một trung bình có trọng số len_-nến cuối cùng — cho ra thma, đường xu hướng duy nhất mà chỉ báo này vẽ.
- thma1 = thma[2] — không phải một đường thứ hai được tính riêng, chỉ đơn giản là giá trị của chính đường đó cách đây 2 nến, được giữ lại cho mọi phép so sánh tiếp theo.
🔀 Flow 2 — Dò lần đảo độ dốc
- signal_up = crossover(thma, thma1): giá trị hiện tại của đường vừa vượt lên trên giá trị cách đây 2 nến, sau khi còn bằng hoặc thấp hơn nó ở nến trước đó. signal_dn là hình đối xứng (crossunder).
- Một giá trị chữ được nhớ (trend, bắt đầu trống) chỉ được cập nhật ở nến đảo chiều — mũi tên lên khi signal_up, mũi tên xuống khi signal_dn — và đơn giản giữ nguyên giá trị đã đặt lần cuối ở mọi nến khác. Đây là thứ hàng "Trend" trong bảng đọc từ đó.
🎨 Flow 3 — Chọn màu
- color = thma > thma1 ? color_u : color_d — chỉ đơn giản là đường hiện đang cao hơn hay thấp hơn giá trị của chính nó cách đây 2 nến. Phép so sánh duy nhất này dẫn dắt màu thân/râu/viền của dải nến, màu các dấu tam giác, và màu chữ xu hướng trong bảng.
🌊 Flow 4 — Đo biến động
- volatility = HMA(high − low, len_vol): trung bình biên độ toàn phần của mỗi nến (cao tới thấp) đã làm mượt kiểu Hull — một mức đọc biến động, không phải theo nghĩa đen "râu nến" của các nến bên dưới.
- vv = phân vị thứ 100 của volatility trong 1000 nến gần nhất — trên thực tế, là mức biến động cao nhất thấy được ở bất kỳ đâu trong cửa sổ đó.
- vol = volatility ÷ vv: một mức đọc từ 0 tới 1 cho biết biên độ đã làm mượt hôm nay gần tới mức cao nhất trong 1000 nến gần nhất tới đâu. Ví dụ: biên độ đã làm mượt hiện tại 18, cao nhất trong 1000 nến 24 → vol = 0,75, hiển thị trên bảng là 75%.
🕯️ Flow 5 — Vẽ "cây nến" THMA
- plotcandle(open = thma, high = thma + volatility, low = thma1 − volatility, close = thma1): thân nến trải từ giá trị THMA hiện tại tới giá trị cách đây 2 nến (nên chiều cao và hướng của nó cho thấy chuyển động gần đây của chính đường), trong khi cao/thấp kéo xa hơn theo thước đo biến động ở mỗi bên, tạo ra râu nến.
- Khi volat bật: thân trong suốt 40%, râu trong suốt 40% (bằng thân, nên đọc như một khối màu thống nhất) — cả hai hiện rõ. Khi tắt: thân đặc hoàn toàn (trong suốt 0%), râu trong suốt 100% (vô hình) — chỉ còn lại một khối đặc, không có râu. Viền luôn đặc hoàn toàn dù bật hay tắt.
🔺 Flow 6 — Các dấu tam giác tín hiệu
- Khi signal_up: một tam giác chỉ lên tại thma1 − ATR(200) (dưới đường), vẽ bằng một quầng mờ 60% lớn hơn cộng một tâm nhỏ đặc hoàn toàn, màu theo bất kỳ màu nào Flow 3 đã đặt cho nến đó. Khi signal_dn: hình đối xứng, một tam giác chỉ xuống tại thma1 + ATR(200) (trên đường).
🗂️ Flow 7 — Bảng (chỉ ở nến cuối)
- Hàng 0 — "Trend: " + mũi tên: mũi tên lên/xuống được nhớ từ Flow 2, chữ tô màu color_d nếu lần đảo gần nhất là xuống, ngược lại color_u.
- Hàng 1 — "Volatility: " + phần trăm: vol từ Flow 4, hiển thị dưới dạng phần trăm, màu chữ trung tính của chart.
Đầu ra & vai trò trong sử dụng
- Dải nến: bộ lọc hướng độ trễ thấp — màu là xu hướng, độ dài thân nến là đã di chuyển nhanh tới đâu, độ dài râu nến là nến gần đây đã dao động rộng tới đâu.
- Các tam giác: đúng cây nến độ dốc quay đầu.
- Bảng: tóm tắt một lần nhìn về hướng hiện tại và mức biến động hiện tại đang căng tới đâu so với 1000 nến gần nhất.
- Cao/thấp của dải nến không đảm bảo luôn bao trọn thân nến. high = thma + volatility và low = thma1 − volatility được tính độc lập với việc thma/thma1 cái nào lớn hơn; khi có một chuyển động 2 nến rất nhanh kết hợp với mức biến động nhỏ, đã làm mượt nhiều, giá trị cao đã tính có thể thấp hơn đỉnh của chính thân nến (hoặc giá trị thấp cao hơn đáy của nó). Bộ vẽ nến của TradingView thường xử lý việc này mà không báo lỗi, nhưng hình ảnh có thể trông hơi khác thường ở những nến như vậy.
- "Volatility" (ô tick) chỉ đổi cách vẽ râu và thân nến — nó không bao giờ làm dừng việc tính hoặc hiển thị con số biến động trên bảng. Tắt nó thuần tuý là thẩm mỹ cho dải nến.
- Trần biến động 1000 nến cần đủ 1000 nến lịch sử để thực sự có ý nghĩa. Trên một sản phẩm hoặc khung thời gian có ít lịch sử hơn thế, vv được đo trên bất kỳ lịch sử nào có sẵn, nên các mức đọc "% của tối đa" ban đầu là tương đối so với một mẫu nhỏ hơn.
- Không có alert. Một lần đảo chỉ hiện trên chart (đổi màu + tam giác); mọi thứ dựa trên sự kiện đều cần tự bổ sung.
- Biến cục bộ color trùng tên với kiểu color dựng sẵn của Pine. Việc này hợp lệ nhưng là lý do script sao chép ngay nó thành color1 trước khi dùng bên trong các lệnh gọi color.new(...) — một thói quen phòng thủ, không phải khác biệt về chức năng.


