1. Mô tả chỉ báo Spring & Upthrust Trap (Zeiierman)
Chỉ báo phát hiện bẫy thanh khoản theo phương pháp Wyckoff - khi giá "giả vờ" phá vỡ vùng giá rồi quay đầu ngay lập tức
1.1 Concept của chỉ báo
Chỉ báo này dựa trên lý thuyết Wyckoff về "bẫy thanh khoản" (liquidity trap). Ý tưởng cốt lõi là: những nhà đầu tư lớn (smart money) cố tình đẩy giá phá vỡ một vùng giá quan trọng để "kích hoạt" lệnh cắt lỗ (stop loss) của đám đông, sau đó lập tức quay đầu theo hướng ngược lại.
Có hai loại bẫy chính:
- Spring (Bẫy tăng giá): Giá giả vờ phá xuống dưới đáy vùng giá (để kích hoạt lệnh bán), nhưng ngay sau đó giá bật lên mạnh trở lại → tín hiệu tăng giá
- Upthrust (Bẫy giảm giá): Giá giả vờ phá lên trên đỉnh vùng giá (để kích hoạt lệnh mua), nhưng ngay sau đó giá lao xuống mạnh → tín hiệu giảm giá
Chỉ báo này tin rằng: khi một đợt phá vỡ thất bại nhanh chóng, đó là dấu hiệu cho thấy xu hướng sắp đảo chiều mạnh.
1.2 Chức năng của chỉ báo
- Hiển thị hình học X-A-B-C: Vẽ các đường thẳng nối 4 điểm quan trọng (X, A, B, C) tạo thành hình dạng bẫy. Đường màu xanh lá cho Spring (tăng giá), màu đỏ cho Upthrust (giảm giá).
- Hiển thị hộp vùng giá: Vẽ một hình chữ nhật (box) tô màu nhạt giữa điểm X và A, đại diện cho "vùng giá" mà giá đang dao động trước khi bị phá vỡ giả.
- Hiển thị đường biên vùng giá: Vẽ 2 đường ngang kéo dài sang phải (dotted lines) tại mức giá X và A, giúp bạn dễ dàng theo dõi các mức hỗ trợ/kháng cự quan trọng.
- Hiển thị biểu tượng tín hiệu: Khi phát hiện Spring, hiển thị mũi tên tam giác hướng lên màu xanh lá. Khi phát hiện Upthrust, hiển thị mũi tên tam giác hướng xuống màu đỏ.
- Alert (Cảnh báo): Gửi thông báo khi phát hiện Spring hoặc Upthrust, giúp bạn không bỏ lỡ cơ hội giao dịch ngay cả khi không theo dõi biểu đồ.
1.3 Cách dùng chỉ báo
- Giao dịch theo Spring (Bull): Khi xuất hiện tín hiệu Spring (mũi tên xanh lá hướng lên), đây là dấu hiệu giá có thể tăng mạnh. Bạn có thể cân nhắc vào lệnh MUA (Long) khi giá xác nhận quay trở lại vào vùng giá hoặc phá vỡ mức A. Đặt Stop Loss dưới điểm B (điểm thấp nhất của cú "sweep" giả). Take Profit có thể đặt ở các mức kháng cự tiếp theo hoặc theo tỷ lệ Risk:Reward phù hợp.
- Giao dịch theo Upthrust (Bear): Khi xuất hiện tín hiệu Upthrust (mũi tên đỏ hướng xuống), đây là dấu hiệu giá có thể giảm mạnh. Bạn có thể cân nhắc vào lệnh BÁN (Short) khi giá xác nhận quay trở lại vào vùng giá hoặc phá vỡ mức A. Đặt Stop Loss trên điểm B (điểm cao nhất của cú "sweep" giả). Take Profit có thể đặt ở các mức hỗ trợ tiếp theo.
- Kết hợp với các chỉ báo khác: Để tăng độ chính xác, nên kết hợp Spring & Upthrust với các chỉ báo khác như Volume (khối lượng giao dịch), RSI, hoặc các mô hình nến Nhật để xác nhận xu hướng.
- Chú ý đến kích thước "sweep": Chỉ báo có bộ lọc để loại bỏ các cú phá vỡ quá nhỏ (nhiễu) hoặc quá lớn (có thể là xu hướng thật). Bạn có thể điều chỉnh Min Sweep và Max Sweep để phù hợp với từng loại tài sản và khung thời gian.
- Theo dõi retest: Sau khi tín hiệu xuất hiện, giá thường quay lại "test" lại đường biên vùng giá (X hoặc A) từ phía bên trong. Đây là điểm vào lệnh an toàn hơn.
1.4 Cách hoạt động của chỉ báo
Đầu vào & vai trò
-
ZigZag Length (Độ dài ZigZag): Đây là một số nguyên (mặc định 12), quyết định độ nhạy của việc phát hiện các điểm "đỉnh" và "đáy" trên biểu đồ.
- Vai trò: Giá trị này kiểm soát khoảng cách tối thiểu (số nến) để một điểm được coi là đỉnh hoặc đáy. Ví dụ: nếu ZigZag Length = 12, thì một nến chỉ được coi là đỉnh khi nó là điểm cao nhất trong vòng 12 nến xung quanh.
- Nếu tăng giá trị (ví dụ: 20): Chỉ báo sẽ "mượt" hơn, ít phát hiện tín hiệu hơn, chỉ bắt các đỉnh/đáy lớn → phù hợp với khung thời gian dài hoặc tài sản ít biến động.
- Nếu giảm giá trị (ví dụ: 5): Chỉ báo sẽ "nhạy" hơn, phát hiện nhiều tín hiệu hơn, bắt cả các đỉnh/đáy nhỏ → có thể bị nhiễu nhiều hơn.
-
Show Patterns (Hiển thị mẫu hình): Đây là một lựa chọn dropdown với 3 tùy chọn: "All" (Tất cả), "Spring (Bull)" (Chỉ bẫy tăng giá), "Upthrust (Bear)" (Chỉ bẫy giảm giá).
- Vai trò: Lọc loại tín hiệu bạn muốn nhìn thấy. Nếu chọn "Spring (Bull)", chỉ báo sẽ chỉ hiển thị các tín hiệu tăng giá, bỏ qua tín hiệu giảm giá.
-
Min Sweep (Mức quét tối thiểu): Đây là một số thập phân từ 0.0 đến 1.0 (mặc định 0.05), đại diện cho tỷ lệ phần trăm tối thiểu mà giá phải "vượt qua" biên vùng giá để được coi là một cú "sweep" hợp lệ.
- Vai trò: Lọc bỏ các cú phá vỡ quá nhỏ (nhiễu). Ví dụ: nếu vùng giá cao 100 điểm (từ X đến A), và Min Sweep = 0.05, thì giá phải vượt qua biên ít nhất 5 điểm (100 × 0.05) mới được coi là sweep.
- Nếu tăng giá trị (ví dụ: 0.10): Chỉ chấp nhận các cú sweep lớn hơn → ít tín hiệu hơn nhưng chất lượng cao hơn.
- Nếu giảm giá trị (ví dụ: 0.02): Chấp nhận cả các cú sweep nhỏ → nhiều tín hiệu hơn nhưng có thể nhiễu.
-
Max Sweep (Mức quét tối đa): Đây là một số thập phân từ 0.01 đến 1.5 (mặc định 0.35), đại diện cho tỷ lệ phần trăm tối đa mà giá có thể "vượt qua" biên vùng giá.
- Vai trò: Lọc bỏ các cú phá vỡ quá lớn (có thể là xu hướng thật, không phải bẫy). Ví dụ: nếu vùng giá cao 100 điểm, và Max Sweep = 0.35, thì giá chỉ được vượt qua biên tối đa 35 điểm. Nếu vượt quá, chỉ báo sẽ không coi đó là bẫy.
- Nếu tăng giá trị (ví dụ: 0.50): Chấp nhận các cú sweep sâu hơn → nhiều tín hiệu hơn nhưng có thể bắt cả xu hướng thật.
- Nếu giảm giá trị (ví dụ: 0.20): Chỉ chấp nhận các cú sweep nông → ít tín hiệu hơn nhưng chính xác hơn.
-
Confirm Pad (Khoảng xác nhận): Đây là một số thập phân từ 0.0 đến 0.5 (mặc định 0.00), đại diện cho khoảng cách bổ sung mà giá phải vượt qua biên đối diện (điểm A) để xác nhận tín hiệu.
- Vai trò: Tăng độ chắc chắn của tín hiệu. Ví dụ: nếu vùng giá cao 100 điểm, và Confirm Pad = 0.10, thì sau khi sweep, giá phải quay đầu và vượt qua biên đối diện thêm 10 điểm nữa (100 × 0.10) mới được coi là tín hiệu hợp lệ.
- Nếu tăng giá trị (ví dụ: 0.20): Yêu cầu xác nhận mạnh hơn → ít tín hiệu hơn nhưng chất lượng cao hơn, tránh tín hiệu giả.
- Nếu giảm giá trị (ví dụ: 0.00): Không yêu cầu xác nhận bổ sung → nhiều tín hiệu hơn nhưng có thể có tín hiệu giả.
- Bull Fill / Bear Fill (Màu tô vùng giá): Đây là lựa chọn màu để tô màu hộp vùng giá. Màu xanh lá nhạt cho Spring, màu đỏ nhạt cho Upthrust.
- Bull Lines / Bear Lines (Màu đường): Đây là lựa chọn màu cho các đường nối X-A-B-C. Màu xanh lá cho Spring, màu đỏ cho Upthrust.
- Leg Style (Kiểu đường): Đây là lựa chọn dropdown với 3 tùy chọn: "Solid" (Liền), "Dashed" (Gạch ngang), "Dotted" (Chấm chấm).
- Leg Width (Độ dày đường): Đây là một số nguyên từ 1 đến 4 (mặc định 2), quyết định độ dày của các đường nối X-A-B-C.
- Level Width (Độ dày đường biên): Đây là một số nguyên từ 1 đến 4 (mặc định 2), quyết định độ dày của 2 đường ngang kéo dài (tại X và A).
- Extend Levels (bars) (Kéo dài đường biên): Đây là một số nguyên từ 1 đến 500 (mặc định 120), quyết định số nến mà 2 đường ngang sẽ kéo dài sang phải.
Các khối logic chính
🎯 Đầu ra cuối cùng: Tín hiệu Spring hoặc Upthrust
-
Khi chỉ báo phát hiện một mẫu hình bẫy hoàn chỉnh, nó sẽ:
- Vẽ 3 đường thẳng nối 4 điểm X → A → B → C (màu xanh lá cho Spring, màu đỏ cho Upthrust)
- Vẽ hộp vùng giá (box) giữa X và A
- Vẽ 2 đường ngang kéo dài tại mức X và A
- Hiển thị mũi tên tam giác (lên cho Spring, xuống cho Upthrust)
- Gửi cảnh báo (alert) nếu bạn đã bật
🔍 Cách phát hiện mẫu hình X-A-B-C
-
Chỉ báo cần ít nhất 4 điểm pivot (đỉnh/đáy) để tạo thành mẫu hình. Các điểm này được đặt tên theo thứ tự thời gian:
- X: Điểm pivot cũ nhất (điểm thứ 4 từ hiện tại)
- A: Điểm pivot thứ 3 từ hiện tại
- B: Điểm pivot thứ 2 từ hiện tại (điểm "sweep" - phá vỡ giả)
- C: Điểm pivot mới nhất (điểm "rejection" - quay đầu)
-
Điều kiện để phát hiện Spring (Bẫy tăng giá):
- Điểm A phải cao hơn điểm X (tạo thành vùng giá với A ở trên, X ở dưới)
- Điểm B phải thấp hơn điểm X (phá xuống dưới đáy vùng giá)
- Điểm C phải cao hơn điểm A (+ khoảng xác nhận nếu có) (quay đầu mạnh lên trên)
- Kích thước sweep (|B - X| / |A - X|) phải nằm trong khoảng [Min Sweep, Max Sweep]
Ví dụ cụ thể: Giả sử X = 100, A = 120 (vùng giá cao 20 điểm). Giá giảm xuống B = 98 (phá xuống dưới X 2 điểm). Sau đó giá bật lên C = 122 (vượt qua A 2 điểm). Kích thước sweep = |98 - 100| / |120 - 100| = 2/20 = 0.10 (10%). Nếu Min Sweep = 0.05 và Max Sweep = 0.35, thì đây là một Spring hợp lệ.
-
Điều kiện để phát hiện Upthrust (Bẫy giảm giá):
- Điểm A phải thấp hơn điểm X (tạo thành vùng giá với X ở trên, A ở dưới)
- Điểm B phải cao hơn điểm X (phá lên trên đỉnh vùng giá)
- Điểm C phải thấp hơn điểm A (- khoảng xác nhận nếu có) (quay đầu mạnh xuống dưới)
- Kích thước sweep (|B - X| / |A - X|) phải nằm trong khoảng [Min Sweep, Max Sweep]
Ví dụ cụ thể: Giả sử X = 120, A = 100 (vùng giá cao 20 điểm). Giá tăng lên B = 122 (phá lên trên X 2 điểm). Sau đó giá lao xuống C = 98 (vượt qua A xuống 2 điểm). Kích thước sweep = |122 - 120| / |120 - 100| = 2/20 = 0.10 (10%). Nếu Min Sweep = 0.05 và Max Sweep = 0.35, thì đây là một Upthrust hợp lệ.
📍 Cách tìm các điểm pivot (đỉnh/đáy)
- Chỉ báo sử dụng phương pháp ZigZag để tìm các điểm pivot. Đây là cách đơn giản hóa biểu đồ giá thành các đoạn thẳng nối các đỉnh và đáy quan trọng.
-
Cách hoạt động của ZigZag:
- Chỉ báo quét qua từng nến trên biểu đồ
- Một nến được coi là đỉnh (pivot high) nếu nó là điểm cao nhất trong vòng ZigZag Length nến xung quanh. Ví dụ: nếu ZigZag Length = 12, nến hiện tại phải cao hơn 12 nến bên trái và 12 nến bên phải.
- Một nến được coi là đáy (pivot low) nếu nó là điểm thấp nhất trong vòng ZigZag Length nến xung quanh.
- Chỉ báo lưu trữ tối đa 6 điểm pivot gần nhất trong một "danh sách" (array), với điểm mới nhất ở đầu danh sách.
- Xử lý đặc biệt: Nếu 2 đỉnh (hoặc 2 đáy) xuất hiện liên tiếp mà không có đáy (hoặc đỉnh) ở giữa, chỉ báo sẽ chỉ giữ lại điểm cao hơn (hoặc thấp hơn) và bỏ qua điểm còn lại. Điều này giúp tránh nhiễu và giữ cho cấu trúc ZigZag luôn xen kẽ đỉnh-đáy.
-
Hướng của pivot: Mỗi pivot được gán một "hướng" (direction):
- +1: Đỉnh thông thường
- -1: Đáy thông thường
- +2: Đỉnh cao hơn đỉnh trước đó (Higher High)
- -2: Đáy thấp hơn đáy trước đó (Lower Low)
🎨 Cách vẽ hình học và đường biên
-
Khi một mẫu hình mới được phát hiện, chỉ báo sẽ:
- Vẽ 3 đường thẳng: X → A, A → B, B → C (sử dụng màu và kiểu đường theo cài đặt)
- Vẽ hộp vùng giá (box) từ điểm X đến điểm A, kéo dài đến điểm B (hoặc điểm X nếu B gần hơn)
- Vẽ 2 đường ngang: một tại mức giá X, một tại mức giá A, kéo dài sang phải theo số nến đã cài đặt (Extend Levels)
- Xử lý chồng chéo: Nếu một mẫu hình mới xuất hiện trước khi các đường biên của mẫu hình cũ kết thúc kéo dài, chỉ báo sẽ tự động cắt ngắn các đường biên cũ để tránh chồng chéo lên nhau, giúp biểu đồ gọn gàng hơn.
Đầu ra & vai trò trong sử dụng
- Tín hiệu Spring (mũi tên xanh lá hướng lên): Đây là tín hiệu tăng giá. Bạn có thể cân nhắc vào lệnh MUA (Long) khi giá xác nhận quay trở lại vào vùng giá hoặc phá vỡ mức A.
- Tín hiệu Upthrust (mũi tên đỏ hướng xuống): Đây là tín hiệu giảm giá. Bạn có thể cân nhắc vào lệnh BÁN (Short) khi giá xác nhận quay trở lại vào vùng giá hoặc phá vỡ mức A.
- Đường biên vùng giá (X và A): Đây là các mức hỗ trợ/kháng cự quan trọng. Bạn có thể sử dụng chúng để đặt Stop Loss hoặc Take Profit.
- Hộp vùng giá: Giúp bạn dễ dàng nhận biết vùng giá mà giá đang dao động trước khi bị phá vỡ giả.
- Alert (Cảnh báo): Giúp bạn không bỏ lỡ cơ hội giao dịch ngay cả khi không theo dõi biểu đồ.
Kết Quả Backtest - Chiến Lược Spring & Upthrust Trap
Phân tích hiệu suất và cài đặt tối ưu cho chiến lược giao dịch
Phát Triển Chiến Lược
Để tìm ra phương án tối ưu nhất khi vào lệnh và quản lý rủi ro cho chỉ báo này, mình đã chuyển đổi chỉ báo thành chiến lược/strategy trên TradingView với đầy đủ các chức năng quản lý vốn và rủi ro chuyên nghiệp.
Các Tính Năng Chính Của Strategy
🎯 Quản Lý Vào Lệnh
- Bật/Tắt Strategy: Bật hoặc tắt thực thi chiến lược
- Kiểm Soát Hướng: Cho phép vị thế LONG, SHORT, hoặc cả hai
- Loại Lệnh Vào: Chọn giữa lệnh Market hoặc Limit tại các mức giá khác nhau (Market, Giữa Range, Line Gần, Line Xa)
- Thoát Khi Tín Hiệu Ngược: Tự động đóng vị thế khi có tín hiệu ngược chiều xuất hiện
💰 Quản Lý Kích Thước Vị Thế
- Loại Kích Thước: Fixed Amount (số lượng cố định) hoặc Percentage of Equity (phần trăm vốn)
- Phần Trăm Vốn: Đặt phần trăm vốn sử dụng cho mỗi giao dịch
🛡️ Quản Lý Stop Loss
- Loại Stop Loss: Swing Point (điểm swing gần nhất) hoặc Line Xa (đường biên xa)
- Nhìn Lại Swing: Số nến nhìn lại để phát hiện điểm swing
- Spread Điều Chỉnh: Khoảng cách đệm bổ sung cho stop loss
🎯 Quản Lý Take Profit
- Tỷ Lệ Risk:Reward: Đặt TP dựa trên khoảng cách SL (ví dụ: RR = 4 nghĩa là TP gấp 4 lần SL)
⚡ Bảo Vệ Break Even
- Kích Hoạt BE Tại RR: Tự động chuyển SL về break even khi giá đạt mức RR nhất định
- Offset Từ Entry: Khoảng cách đệm từ giá vào lệnh
📊 Trực Quan Hóa
- Hiển Thị Box TP/SL: Hiển thị các hộp trực quan cho mức take profit và stop loss
- Màu Tùy Chỉnh: Màu riêng biệt cho hộp TP và SL
Kết Quả Hiệu Suất
Sau khi backtest kỹ lưỡng, chiến lược đã đạt được các chỉ số hiệu suất ấn tượng:
Cài Đặt Tối Ưu
Các cài đặt sau đây đã chứng minh hiệu quả nhất qua quá trình backtest:
Phát Hiện Mẫu Hình
Cài Đặt Strategy
Kích Thước Vị Thế
Stop Loss
Take Profit
Break Even
Trực Quan Hóa
Tài Nguyên
📚 Tài Nguyên Hữu Ích
Khám phá thêm công cụ và khóa học để nâng cao kỹ năng giao dịch
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © STEEL-CITY-CREATORS
//@version=5
indicator("Elliott Wave (rules-based, compile-safe)", overlay=true, max_lines_count=500, max_labels_count=500)
// ── Inputs ────────────────────────────────────────────────────────────────────
left = input.int(5, "Pivot Left", minval=1)
right = input.int(5, "Pivot Right", minval=1)
useATR = input.bool(true, "Use ATR filter for swing threshold?")
atrLen = input.int(14, "ATR Length", minval=1)
atrMult = input.float(1.0, "ATR Multiplier", step=0.1)
minPct = input.float(0.5, "Min % swing (if ATR off)", step=0.1)
maxBack = input.int(2000, "Max bars back for drawing", minval=300)
showABC = input.bool(true, "Attempt A–B–C after 5 waves?")
showZig = input.bool(true, "Show ZigZag Lines?")
colorUp = color.new(color.lime, 0)
colorDn = color.new(color.red, 0)
// ── Globals (declare BEFORE any function uses them) ───────────────────────────
var pivotBars = array.new_int()
var pivotPrice = array.new_float()
var pivotType = array.new_int() // +1 = high, -1 = low
var lineArr = array.new_line()
var labelArr = array.new_label()
var int lastImpulseBar = na
var int lastABCBar = na
var bool impulseFound = false
var bool impulseUp = false
// ── Helpers ───────────────────────────────────────────────────────────────────
atr = ta.atr(atrLen)
toPctMove(a, b) =>
math.abs(b - a) / a * 100.0
isSwingBigEnough(prev, curr) =>
useATR ? math.abs(curr - prev) >= atrMult * atr : toPctMove(prev, curr) >= minPct
// Pivots (confirmed by right bars)
ph = ta.pivothigh(high, left, right)
pl = ta.pivotlow(low, left, right)
// Add pivot if large enough
addPivot(b, p, t) =>
bool pushed = false
if array.size(pivotPrice) == 0
array.push(pivotBars, b)
array.push(pivotPrice, p)
array.push(pivotType, t)
pushed := true
else
last = array.get(pivotPrice, array.size(pivotPrice) - 1)
if isSwingBigEnough(last, p)
array.push(pivotBars, b)
array.push(pivotPrice, p)
array.push(pivotType, t)
pushed := true
pushed
drawZigZag() =>
if showZig
sz = array.size(pivotBars)
if sz >= 2
b1 = array.get(pivotBars, sz - 2)
p1 = array.get(pivotPrice, sz - 2)
b2 = array.get(pivotBars, sz - 1)
p2 = array.get(pivotPrice, sz - 1)
ln = line.new(b1, p1, b2, p2, extend=extend.none, width=2, color = p2 > p1 ? colorUp : colorDn)
array.push(lineArr, ln)
makeLabel(txt, b, p, col) =>
lb = label.new(b, p, txt, textcolor=color.white, color=col, style=label.style_label_center, size=size.tiny)
array.push(labelArr, lb)
lb
// Basic impulse validation using six prices (not arrays)
isUpImpulse(p0, p1, p2, p3, p4, p5) =>
// L0, H1, HL2, HH3, HL4, HH5
(p0 < p2 and p2 < p4) and (p1 < p3 and p3 < p5) and (p1 > p0 and p3 > p2 and p5 > p4)
isDnImpulse(p0, p1, p2, p3, p4, p5) =>
// H0, L1, LH2, LL3, LH4, LL5
(p0 > p2 and p2 > p4) and (p1 > p3 and p3 > p5) and (p1 < p0 and p3 < p2 and p5 < p4)
// A–B–C check given three prices (A,B,C) and whether prior impulse was up
isABC(pa, pb, pc, uptrend) =>
uptrend ? (pa > pb and pc < pa and pc < pb) : (pa < pb and pc > pa and pc > pb)
// ── Collect pivots on confirmation ────────────────────────────────────────────
newHigh = not na(ph)
newLow = not na(pl)
if newHigh
addPivot(bar_index - right, ph, +1)
drawZigZag()
if newLow
addPivot(bar_index - right, pl, -1)
drawZigZag()
// ── Wave detection & labeling ─────────────────────────────────────────────────
tryLabelImpulse() =>
// Returns (found, uptrend)
bool found = false, bool up = false
sz = array.size(pivotBars)
if sz >= 6
// Gather last 6 pivots
b0 = array.get(pivotBars, sz - 6)
b1 = array.get(pivotBars, sz - 5)
b2 = array.get(pivotBars, sz - 4)
b3 = array.get(pivotBars, sz - 3)
b4 = array.get(pivotBars, sz - 2)
b5 = array.get(pivotBars, sz - 1)
p0 = array.get(pivotPrice, sz - 6)
p1 = array.get(pivotPrice, sz - 5)
p2 = array.get(pivotPrice, sz - 4)
p3 = array.get(pivotPrice, sz - 3)
p4 = array.get(pivotPrice, sz - 2)
p5 = array.get(pivotPrice, sz - 1)
t0 = array.get(pivotType, sz - 6)
t1 = array.get(pivotType, sz - 5)
t2 = array.get(pivotType, sz - 4)
t3 = array.get(pivotType, sz - 3)
t4 = array.get(pivotType, sz - 2)
t5 = array.get(pivotType, sz - 1)
// Alternation (+1/-1) and pattern checks
altUp = (t0 == -1 and t1 == +1 and t2 == -1 and t3 == +1 and t4 == -1 and t5 == +1)
altDown = (t0 == +1 and t1 == -1 and t2 == +1 and t3 == -1 and t4 == +1 and t5 == -1)
upOk = altUp and isUpImpulse(p0, p1, p2, p3, p4, p5)
dnOk = altDown and isDnImpulse(p0, p1, p2, p3, p4, p5)
if (upOk or dnOk)
col = upOk ? color.new(color.teal, 0) : color.new(color.orange, 0)
// Label 1..5 at pivots 1..5
makeLabel("1", b1, p1, col)
makeLabel("2", b2, p2, col)
makeLabel("3", b3, p3, col)
makeLabel("4", b4, p4, col)
makeLabel("5", b5, p5, col)
found := true
up := upOk
[found, up]
// On any new pivot, try to detect impulse (tuple destructuring!)
if (newHigh or newLow)
[found, up] = tryLabelImpulse()
if found and (na(lastImpulseBar) or bar_index > lastImpulseBar)
impulseFound := true
impulseUp := up
lastImpulseBar := bar_index
alert("Elliott impulse (1–5) completed: " + (impulseUp ? "UP" : "DOWN"), alert.freq_once_per_bar_close)
// ── Try A–B–C after impulse ───────────────────────────────────────────────────
if showABC and impulseFound and (newHigh or newLow)
sz = array.size(pivotBars)
if sz >= 9
pa = array.get(pivotPrice, sz - 3)
pb = array.get(pivotPrice, sz - 2)
pc = array.get(pivotPrice, sz - 1)
ba = array.get(pivotBars, sz - 3)
bb = array.get(pivotBars, sz - 2)
bc = array.get(pivotBars, sz - 1)
if isABC(pa, pb, pc, impulseUp)
ccol = color.new(color.fuchsia, 0)
makeLabel("A", ba, pa, ccol)
makeLabel("B", bb, pb, ccol)
makeLabel("C", bc, pc, ccol)
if na(lastABCBar) or bar_index > lastABCBar
lastABCBar := bar_index
alert("Elliott correction (A–B–C) detected", alert.freq_once_per_bar_close)
// ── Housekeeping ──────────────────────────────────────────────────────────────
trimOldDrawings() =>
for i = array.size(lineArr) - 1 to 0
ln = array.get(lineArr, i)
x1 = line.get_x1(ln)
if bar_index - x1 > maxBack
line.delete(ln)
array.remove(lineArr, i)
for i = array.size(labelArr) - 1 to 0
lb = array.get(labelArr, i)
xb = label.get_x(lb)
if bar_index - xb > maxBack
label.delete(lb)
array.remove(labelArr, i)
if barstate.islast
trimOldDrawings()
// ── Visual hints ──────────────────────────────────────────────────────────────
plotshape(newHigh, title="New Pivot High", style=shape.triangledown, color=colorDn, location=location.abovebar, size=size.tiny, text="PH")
plotshape(newLow, title="New Pivot Low", style=shape.triangleup, color=colorUp, location=location.belowbar, size=size.tiny, text="PL")
Indicator Insider

Volume Phân Kỳ là Rác, Vứt nó đi!!
Khắc phục volume phân kỳ truyền thống từ mặt lý thuyết đến code.

04/02/026 Cup & Handle
Cup & Handle Strategy – Advanced TradingView Trading Bot with Automated Risk Management
Discover the Cup & Handle Pattern Strategy, a professional PineScript trading bot for TradingView that automatically identifies classic cup and handle chart patterns. This automated trading strategy combines technical pattern recognition with comprehensive risk management features including

27/01/026 Spring & Upthrust Trap
Phân tích backtest chiến lược Spring & Upthrust Trap với winrate 34.9%, lợi nhuận +4.95%, profit factor 2.021. Hướng dẫn cài đặt tối ưu và quản lý rủi ro hiệu quả.






