1. Mô tả Market Shift Levels Strategy
Mỗi khi đường trung bình HMA đổi chiều dốc, chỉ báo chốt lấy đỉnh hoặc đáy của đúng cây nến đó làm một "mức ranh giới", tô màu toàn bộ nến theo mức này, và đánh dấu những lần giá chọc qua mức rồi thất bại ngay.
1.1 Concept của chỉ báo
Chỉ báo trả lời một câu hỏi rất đơn giản: "Thị trường vừa đổi hướng tại mức giá nào, và giá hiện tại đang ở phía nào của mức đó?" Toàn bộ chỉ báo xoay quanh một con số duy nhất gọi là level — một mức giá nằm ngang được chốt lại rồi giữ nguyên cho tới lần đổi hướng kế tiếp.
- Cách phát hiện "đổi hướng": so đường HMA với chính nó của 5 nến trước. Chỉ báo tính đường trung bình Hull (HMA — một loại đường trung bình được thiết kế để bám giá sát hơn và trễ ít hơn MA thường) rồi đem giá trị hôm nay so với giá trị của chính nó 5 nến trước. Nếu hôm nay cao hơn trong khi 5 nến trước còn thấp hơn → đường HMA vừa bẻ dốc lên. Ngược lại là bẻ dốc xuống. Đây là cách đo độ dốc bằng đúng một phép so sánh, không cần công thức đạo hàm nào.
- Cách chốt mức: lấy chính cây nến gây ra cú bẻ dốc. Bẻ dốc LÊN → lấy đáy của cây nến đó làm mức. Bẻ dốc XUỐNG → lấy đỉnh của cây nến đó. Logic đằng sau: cây nến mà tại đó động lượng chính thức đổi chiều là cây nến "vạch ranh giới"; nếu giá quay lại phá thủng chính đáy/đỉnh của nó thì cú đổi hướng ấy coi như thất bại.
- Cách đọc kết quả: màu nến làm việc đó thay bạn. Giá đóng cửa nằm dưới mức → toàn bộ nến chuyển đỏ. Nằm từ mức trở lên → nến chuyển xanh lá. Bạn không cần tự so sánh gì cả, chỉ cần nhìn màu.
Niềm tin nền tảng: mức giá nơi động lượng chính thức đổi chiều là một ranh giới có ý nghĩa tâm lý. Giá giữ được phía bên "đúng" của ranh giới thì xu hướng còn nguyên; xuyên qua được thì cục diện đã đổi. Và những lần chọc qua rồi rút về ngay trong 1 nến chính là dấu hiệu ranh giới đang được bảo vệ mạnh — đó là thứ mà phần nhãn của chỉ báo đi tìm.
1.2 Chức năng của chỉ báo
-
Hiển thị:
- Đường mức ranh giới (Market Shift Level): một đường nằm ngang, nét đứt, màu đen trên nền chart sáng và màu trắng trên nền chart tối (bám theo màu chữ mặc định của chart, không chỉnh được). Đường giữ nguyên độ cao cho tới khi có cú bẻ dốc HMA tiếp theo, lúc đó nó nhảy sang mức mới và bắt đầu một đoạn mới.
- Nến đổi màu theo mức: mọi cây nến trên chart bị tô lại — xanh lá khi giá đóng cửa từ mức trở lên, đỏ khi đóng cửa dưới mức. Cả thân nến, viền nến lẫn râu nến đều đổi màu.
- Nhãn đảo chiều tiềm năng (Possible Reversals):
· Nhãn đỏ hình ⬙ chỉ xuống, đặt phía trên nến — đánh dấu một cú giá chọc lên qua mức rồi rơi lại ngay ở nến kế tiếp.
· Nhãn xanh lá tươi hình ⬘ chỉ lên, đặt phía dưới nến — đánh dấu một cú giá chọc xuống dưới mức rồi bật lại ngay.
Mỗi nhãn kèm một con số: hoặc tổng khối lượng của 3 nến tạo nên cú chọc, hoặc mức giá tại đỉnh nến chọc — tuỳ lựa chọn trong settings.
- Alert: Chỉ báo KHÔNG có lệnh alertcondition() nào. Muốn có cảnh báo phải tự tạo alert thủ công trên TradingView, hoặc bổ sung code.
1.3 Cách dùng chỉ báo
- Dùng màu nến làm bộ lọc hướng giao dịch. Đây là cách dùng đơn giản và mạnh nhất: nến đang xanh thì chỉ tìm lệnh mua, nến đang đỏ thì chỉ tìm lệnh bán. Bản thân chỉ báo không cho điểm vào lệnh — nó cho bạn biết đang ở phe nào.
- Coi khoảnh khắc nến đổi màu là tín hiệu chuyển cục diện. Một cây nến đóng cửa xuyên qua mức và đổi màu nghĩa là ranh giới vừa mất. Nhiều trader dùng đúng cây nến đổi màu đầu tiên làm tín hiệu thoát lệnh đang giữ, hoặc làm tín hiệu chuẩn bị đảo chiều hướng giao dịch.
- Dùng đường nét đứt làm mốc đặt Stop Loss. Vì mức chính là đáy (hoặc đỉnh) của một cây nến thật, nó là mốc kỹ thuật rõ ràng chứ không phải con số tính toán trừu tượng. Vào lệnh mua khi nến xanh → đặt SL dưới đường nét đứt. Vào lệnh bán khi nến đỏ → đặt SL trên đường.
- Săn nhãn ⬘ / ⬙ như tín hiệu vào lệnh theo kiểu "quét thanh khoản thất bại". Nhãn chỉ xuất hiện khi giá chọc qua mức đúng một nến rồi rút về — hình mẫu kinh điển của một cú quét stop bất thành. Nhãn ⬘ dưới đáy = phe bán không giữ nổi vùng dưới mức, cân nhắc mua. Nhãn ⬙ trên đỉnh = phe mua không giữ nổi vùng trên mức, cân nhắc bán.
- Đọc con số trên nhãn để chấm điểm chất lượng cú chọc. Để chế độ "Volume" (mặc định): con số càng lớn nghĩa là cú chọc-và-thất-bại diễn ra với khối lượng càng cao, tức càng nhiều người bị mắc kẹt sai phía — tín hiệu đáng tin hơn. Một nhãn với volume nhỏ xíu thường chỉ là nhiễu.
- Chỉnh "Length" theo khung thời gian và phong cách. Để 55 (mặc định) cho tín hiệu cân bằng. Giảm xuống 20–30 → HMA bẻ dốc liên tục, mức nhảy thường xuyên, nến đổi màu nhiều — hợp scalping nhưng nhiễu. Tăng lên 100+ → mức rất ít thay đổi, mỗi mức tồn tại rất lâu, hợp swing trade theo xu hướng lớn.
1.4 Cách hoạt động của chỉ báo
Đầu vào & vai trò
- length ("Length", số nguyên, mặc định 55): số nến dùng để tính đường HMA. Đây là input DUY NHẤT ảnh hưởng tới logic — nó quyết định mức được chốt ở đâu, bao lâu đổi một lần, và do đó quyết định toàn bộ màu nến lẫn vị trí nhãn. Ví dụ: trên XAUUSD M15, để 55 thì mức có thể giữ nguyên 40–80 nến; hạ xuống 20 thì mức có thể đổi sau mỗi 10–20 nến. Hai input màu và một input lựa chọn còn lại không hề đụng tới logic, chỉ đổi cách hiển thị.
- lbl_data ("Label Data:", ô lựa chọn thả xuống, hai giá trị "Volume" / "Price", mặc định Volume): quyết định con số in trên nhãn đảo chiều. Chọn "Volume" → in tổng khối lượng của 3 nến tạo nên cú chọc, định dạng gọn kiểu 1.234K / 5.6M. Chọn "Price" → in một mức giá với 3 chữ số thập phân. Không ảnh hưởng gì tới việc nhãn có xuất hiện hay không, chỉ đổi nội dung chữ bên trong.
- color_shiftUp (chọn màu, mặc định rgb(36,213,128) — xanh lá): màu của nến khi giá đóng cửa từ mức trở lên.
- color_shiftDn (chọn màu, mặc định rgb(225,43,43) — đỏ): màu của nến khi giá đóng cửa dưới mức. Hai ô màu này dùng inline = "col" và để trống phần tên, nên trong bảng Settings chúng hiện ra là hai ô màu nằm cạnh nhau không có chữ mô tả — dễ gây bối rối lần đầu mở. Ô bên trái là màu tăng, ô bên phải là màu giảm.
Hằng số cố định trong code (KHÔNG phải input)
- Độ lệch 5 nến trong hma1[5]: khoảng cách để đo độ dốc của HMA. Đổi số này sẽ làm chỉ báo nhạy hơn hoặc lì hơn hẳn, nhưng phải sửa code.
- Cửa sổ 3 nến của vol_sum và của hình mẫu nhận diện nhãn: cố định cứng, không nới ra được.
- max_labels_count = 500: khai báo ở dòng đầu, trần số nhãn tồn tại cùng lúc. Vượt quá thì TradingView tự xoá các nhãn cũ nhất.
Các khối logic chính
📐 Luồng 1 — Phát hiện cú bẻ dốc của HMA (mọi nến)
- hma1 = ta.hma(close, length) — đường trung bình Hull 55 phiên của giá đóng cửa. HMA là một biến thể trung bình động được thiết kế để vừa mượt vừa ít trễ hơn MA thường, nên nó bẻ hướng sớm hơn.
- hma2 = hma1[5] — chính đường đó nhưng lấy giá trị của 5 nến trước. Đây không phải đường thứ hai, chỉ là bản sao trễ 5 nến của cùng một đường.
- ta.crossover(hma1, hma2) — bắt đúng khoảnh khắc hma1 vượt lên trên hma2, nghĩa là HMA hôm nay đã cao hơn chính nó 5 nến trước trong khi nến trước thì chưa. Dịch nghĩa: đường HMA vừa bẻ dốc từ đi xuống sang đi lên.
- ta.crossunder(hma1, hma2) — ngược lại, HMA vừa bẻ dốc sang đi xuống.
- Ví dụ cụ thể: HMA 5 nến trước = 2640. Nến trước HMA = 2638 (vẫn thấp hơn 2640, chưa cắt). Nến này HMA = 2643 (đã cao hơn 2640) → crossover bật. Vì HMA cần 55 nến để tính và còn cần thêm 5 nến để có bản trễ, khoảng 60 nến đầu chart không thể có tín hiệu nào.
📍 Luồng 2 — Chốt mức ranh giới (chỉ tại nến có cú bẻ dốc)
- var level = float(na) — từ khoá var nghĩa là biến này được nhớ qua các nến, không bị tính lại từ đầu mỗi nến. Nó giữ nguyên giá trị cho tới khi có dòng lệnh gán mới.
- Bẻ dốc LÊN → level := low, lấy đáy của chính cây nến hiện tại.
- Bẻ dốc XUỐNG → level := high, lấy đỉnh của chính cây nến hiện tại.
- Ở mọi nến khác, không có dòng nào chạm vào level → nó đứng yên. Đây là lý do đường nét đứt trên chart luôn nằm ngang tuyệt đối.
- Tại bất kỳ thời điểm nào cũng CHỈ CÓ ĐÚNG MỘT mức đang hoạt động. Chỉ báo không giữ lịch sử các mức cũ trong bộ nhớ — mức cũ chỉ còn lại dưới dạng nét vẽ trên chart. Tên gọi "Levels" số nhiều là nói tới chuỗi các mức nối tiếp nhau theo thời gian.
🎨 Luồng 3 — Tô màu nến (mọi nến)
- shift_col = close < level ? color_shiftDn : color_shiftUp — một phép so sánh duy nhất, chạy lại ở từng nến. Giá đóng cửa dưới mức thì đỏ, bằng hoặc trên thì xanh.
- Màu này được áp bằng hai lệnh cùng lúc: barcolor() tô lại nến gốc của chart, và plotcandle() vẽ đè hẳn một bộ nến mới lên trên (cả thân, viền lẫn râu). Làm cả hai nghe có vẻ thừa, nhưng nó đảm bảo màu vẫn hiện đúng kể cả khi người dùng để chart ở dạng đường, Heikin Ashi hay bar thay vì nến Nhật.
- Lưu ý về độ trễ: phép so sánh dùng close, mà giá đóng cửa của nến đang chạy thì thay đổi liên tục. Nến hiện tại có thể nhấp nháy đổi màu qua lại trong phiên; chỉ khi nến đóng thì màu mới chốt cứng.
➖ Luồng 4 — Vẽ đường mức nét đứt (mọi nến)
- plot(level != level[1] ? na : level, style = plot.style_linebr) — đọc là: "nếu mức vừa thay đổi so với nến trước thì vẽ khoảng trống, còn không thì vẽ mức". Kiểu style_linebr cho phép đường có lỗ hổng. Mục đích: khi mức nhảy từ 2585 lên 2640, nếu vẽ liền thì sẽ có một đoạn dọc xấu xí nối hai độ cao; chèn một khoảng trống đúng tại nến đổi mức sẽ cắt đứt đoạn dọc đó. Hệ quả phụ: đoạn đường của mức mới chỉ bắt đầu hiện từ nến KẾ TIẾP sau cú bẻ dốc, chứ không phải ngay tại nến đó.
- Hiệu ứng nét đứt được tạo bằng một thủ thuật: màu của đường là bar_index % 2 == 0 ? color(na) : chart.fg_color — tức cứ một nến vẽ màu, một nến để trong suốt, xen kẽ nhau. Đây không phải kiểu đường gạch đứt có sẵn của Pine; nó là các đoạn hiện/ẩn luân phiên theo cột nến. Vì vậy độ dài mỗi gạch tự co giãn theo mức zoom của chart.
- chart.fg_color là màu chữ mặc định của chart, tự đổi theo theme sáng/tối. Điều này có nghĩa màu đường mức không nằm trong bất kỳ input nào — muốn đổi phải sửa code.
🏷️ Luồng 5 — Dò hình mẫu chọc-rồi-thất-bại và gắn nhãn (mọi nến)
-
Nhãn GIẢM (⬙ đỏ) — cần đủ cả 3 điều kiện trên 3 nến liên tiếp:
- ① high[2] < level — hai nến trước, đỉnh còn nằm dưới mức (chưa chạm).
- ② high[1] > level — nến giữa, đỉnh vượt lên trên mức (cú chọc).
- ③ high < level — nến hiện tại, đỉnh lại tụt xuống dưới mức (chọc thất bại).
- Thoả cả 3 → gắn nhãn tại nến giữa (bar_index − 1), ở độ cao high[1], kiểu label_down nên mũi nhãn chỉ xuống vào đỉnh nến.
- Nhãn TĂNG (⬘ xanh) — hoàn toàn đối xứng: low[2] > level (đáy còn trên mức), low[1] < level (chọc xuống dưới), low > level (rút về trên mức). Nhãn đặt tại low[1], kiểu label_up.
- Điểm mấu chốt cần hiểu: hình mẫu này yêu cầu cú chọc kéo dài đúng một nến. Nếu giá vượt mức và ở lại trên đó 2 nến trở lên thì điều kiện ① lập tức hỏng → không có nhãn nào. Nghĩa là nhãn KHÔNG đánh dấu các cú phá vỡ thật; nó chỉ đánh dấu các cú phá vỡ giả siêu ngắn.
- vol_sum = volume[2] + volume[1] + volume[0] — tổng khối lượng của đúng 3 nến trong hình mẫu, in lên nhãn khi để chế độ "Volume". Con số này đo "cú chọc thất bại vừa rồi tốn bao nhiêu lực".
- Ví dụ cụ thể: mức đang ở 2640. Nến 98 đỉnh 2635 (dưới mức ✓). Nến 99 đỉnh 2644 (chọc lên ✓). Nến 100 đỉnh 2637 (rút về dưới ✓) → tại nến 100, một nhãn ⬙ đỏ được gắn lên nến 99 tại độ cao 2644, kèm số tổng volume của ba nến 98+99+100.
Đầu ra & vai trò trong sử dụng
- Đường mức nét đứt: ranh giới kỹ thuật hiện hành — dùng làm mốc đặt Stop Loss và làm mức quan sát phá vỡ.
- Màu nến: bộ lọc hướng giao dịch, trả lời tức thì "đang là phe mua hay phe bán". Khoảnh khắc đổi màu chính là tín hiệu chuyển cục diện.
- Nhãn ⬘ / ⬙ kèm số: tín hiệu đảo chiều tại chỗ, đánh dấu một cú phá vỡ giả trong 1 nến; con số volume dùng để chấm điểm độ tin cậy.
- LỖI trong code: nhãn TĂNG hiển thị sai giá khi chọn chế độ "Price". Nhãn tăng được đặt tại low[1] (đáy nến giữa), nhưng dòng in chữ lại gọi str.tostring(lbl_data ? vol_sum : high[1], ...) — dùng high[1] chứ không phải low[1]. Kết quả: nhãn nằm ở đáy nến nhưng con số in ra là ĐỈNH của nến đó. Gần như chắc chắn đây là lỗi copy-paste từ khối nhãn giảm phía trên. Chế độ "Volume" (mặc định) không bị ảnh hưởng vì cả hai khối đều dùng chung vol_sum — nên nhiều người dùng sẽ không bao giờ phát hiện ra.
- Hai ô chọn màu KHÔNG điều khiển màu nhãn. Màu chữ của nhãn được viết cứng trong code là color.red và color.lime. Bạn đổi color_shiftUp sang xanh dương thì nến sẽ thành xanh dương nhưng nhãn vẫn cứ xanh lá tươi. Hai input màu chỉ tác động tới màu nến, không gì khác.
- Trước cú bẻ dốc đầu tiên, toàn bộ nến hiện màu XANH mà không mang ý nghĩa gì. Lúc đó level vẫn là na, và trong Pine mọi phép so sánh với na đều cho kết quả sai (false), nên nhánh close < level luôn không thoả → chỉ báo rơi vào nhánh màu tăng. Khoảng 60 nến đầu tiên của chart vì vậy luôn xanh lá bất kể giá đi lên hay đi xuống. Đừng đọc đoạn đó như tín hiệu.
- Mức mới có thể tạo ra nhãn ảo ngay sau khi vừa đổi. Điều kiện nhãn so sánh high[2], high[1] với giá trị level hiện tại. Nếu mức vừa nhảy sang chỗ khác ở nến này, thì hai nến quá khứ đang bị đem so với một ranh giới mà lúc đó chưa hề tồn tại. Một nhãn có thể xuất hiện mô tả cú "chọc-và-thất-bại" chưa từng thực sự diễn ra. Nên nhìn các nhãn nằm sát ngay sau một lần đổi mức với con mắt nghi ngờ.
- Nhãn có thể nhấp nháy trong phiên (repaint nhẹ). Điều kiện thứ ③ dùng high / low của nến ĐANG chạy. Giá còn động thì đỉnh/đáy nến hiện tại còn thay đổi, nên một nhãn có thể hiện ra rồi biến mất vài lần trước khi nến đóng. Chỉ nên tin nhãn sau khi cây nến thứ ba đã đóng hẳn.
- Đoạn đường mức luôn bắt đầu trễ 1 nến. Do thủ thuật level != level[1] ? na : level chèn một khoảng trống tại đúng nến đổi mức, đường nét đứt của mức mới chỉ xuất hiện từ nến kế tiếp. Nhìn trên chart sẽ thấy cây nến tạo ra mức lại là cây nến duy nhất không có đường chạy qua.
- Chỉ báo không lưu lịch sử các mức. Chỉ có đúng một biến level. Các mức cũ tồn tại trên chart thuần tuý dưới dạng nét vẽ đã render, chứ chương trình không còn truy cập được chúng. Nếu ở Phase B hoặc Phase D cần tham chiếu tới mức trước đó (ví dụ để đặt Take Profit tại mức cũ), sẽ phải tự bổ sung một mảng lưu trữ — code gốc không có sẵn.


