TP RSI v2.0 - Mô tả chỉ báo

1. Mô tả chỉ báo TP RSI v2.0

Công cụ phân tích xu hướng, động lượng và biến động 3-trong-1

1.1 Concept của chỉ báo

TP RSI v2.0 được xây dựng dựa trên nguyên lý tích hợp ba chiều trong phân tích kỹ thuật: Xu hướng (Trend), Động lượng (Momentum), và Biến động (Volatility). Thay vì phải chuyển đổi giữa nhiều chỉ báo khác nhau, TP RSI tập trung tất cả vào một màn hình duy nhất.

Ba trụ cột lý thuyết chính:

  • RSI (Relative Strength Index) - Đo lường động lượng: Dựa trên lý thuyết của J. Welles Wilder, RSI đo tốc độ và biên độ thay đổi giá để xác định khi nào thị trường "quá mua" (overbought) hay "quá bán" (oversold). Trong TP RSI, chỉ số RSI được tô màu động để nhận biết trạng thái ngay lập tức.
  • EMA Ribbon (Dải các đường EMA) - Xác định xu hướng: Sử dụng 10 đường trung bình động EMA với chu kỳ từ ngắn đến dài (21 đến 499), tạo thành 5 lớp "dải mây" (cloud). Khi các đường EMA ngắn nằm trên EMA dài và có màu xanh → xu hướng tăng mạnh; ngược lại màu đỏ → xu hướng giảm. Ý tưởng này lấy cảm hứng từ Ichimoku Cloud nhưng áp dụng trên RSI thay vì giá.
  • Bollinger Bands trên RSI - Đo biến động: Thay vì vẽ Bollinger Bands trên giá, chỉ báo này vẽ nó trên RSI để xác định vùng động lượng "bất thường". Khi RSI chạm hoặc vượt qua dải trên/dưới của Bollinger → tín hiệu động lượng mạnh hoặc sắp đảo chiều.

Tại sao kết hợp cả ba? Một chỉ báo riêng lẻ có thể cho tín hiệu sai. Ví dụ: RSI cao (quá mua) nhưng nếu xu hướng vẫn đang tăng mạnh (ribbon màu xanh) thì không nên vội bán. Hoặc Bollinger Bands hẹp lại → báo hiệu biến động sắp tăng → chuẩn bị cho breakout. Kết hợp cả ba giúp trader thấy được "bức tranh toàn cảnh" của thị trường.

💡 Điểm đặc biệt: Phiên bản 2.0 mới bổ sung tính năng phát hiện phân kỳ (Divergence Detection) - một công cụ mạnh mẽ để bắt đầu đảo chiều xu hướng. Khi giá tạo đỉnh cao hơn nhưng RSI tạo đỉnh thấp hơn (Bear Divergence) → cảnh báo xu hướng tăng sắp kết thúc.

1.2 Chức năng của chỉ báo

Các thành phần hiển thị và vai trò:

  • Đường RSI tô màu động (current_rsi): Đường chính hiển thị chỉ số RSI hiện tại. Màu xanh khi RSI vượt ngưỡng trên (disp_up) → động lượng tăng; màu đỏ khi RSI dưới ngưỡng dưới (disp_down) → động lượng giảm; màu trắng khi ở giữa → trung tính.
  • 5 dải mây EMA (EMA Ribbon): Được tạo bởi 10 đường EMA (5 cặp ngắn-dài). Mỗi cặp tạo thành một lớp "mây" với độ trong suốt khác nhau. Màu sắc thay đổi theo hai phong cách: "Gradient Fade" (xanh dương gradient cho tăng, đỏ gradient cho giảm) hoặc "Classic" (xanh/đỏ đơn giản). Vai trò: Cho biết xu hướng RSI đang trong giai đoạn nào - mạnh, yếu, hay đang chuyển đổi.
  • Bollinger Bands (upper1lower1): Hai đường giới hạn trên/dưới bao quanh RSI. Khi RSI chạm dải trên → động lượng rất mạnh (có thể quá mua trong ngắn hạn); chạm dải dưới → động lượng rất yếu (có thể quá bán). Khi hai dải hẹp lại → báo hiệu thị trường "lặng sóng" và sắp có biến động lớn.
  • Vạch mức 70, 50, 30: Ba đường ngang cơ bản. Mức 70 = vùng quá mua truyền thống; mức 30 = vùng quá bán truyền thống; mức 50 = trung điểm (đường giữa).
  • Nhãn phân kỳ (Divergence Labels): Khi chỉ báo phát hiện phân kỳ, sẽ xuất hiện nhãn ngay trên đường RSI:
    • "Bull Div" (màu xanh): Phân kỳ tăng thường - giá tạo đáy thấp hơn nhưng RSI tạo đáy cao hơn → tín hiệu đảo chiều tăng
    • "Bear Div" (màu đỏ): Phân kỳ giảm thường - giá tạo đỉnh cao hơn nhưng RSI tạo đỉnh thấp hơn → tín hiệu đảo chiều giảm
    • "H.Bull Div" (màu xanh nhạt): Phân kỳ tăng ẩn - xác nhận xu hướng tăng đang tiếp tục
    • "H.Bear Div" (màu đỏ nhạt): Phân kỳ giảm ẩn - xác nhận xu hướng giảm đang tiếp tục

Hệ thống cảnh báo (Alerts):

  • RSI Bullish Signal: Khi RSI vượt lên trên ngưỡng disp_up (động lượng chuyển tăng)
  • RSI Bearish Signal: Khi RSI giảm xuống dưới ngưỡng disp_down (động lượng chuyển giảm)
  • Bullish/Bearish Divergence: Khi phát hiện phân kỳ tăng/giảm thường
  • Hidden Bullish/Bearish Divergence: Khi phát hiện phân kỳ ẩn
  • RSI Overbought/Oversold: Khi RSI cắt ngang qua mức 70 hoặc 30

1.3 Cách dùng chỉ báo trong trading thực chiến

🎯 Chiến lược 1: Xác nhận xu hướng trước khi vào lệnh

  • Tín hiệu mua (Long): RSI màu xanh + Ribbon toàn màu xanh (các EMA ngắn trên EMA dài) + RSI nằm phía trên ribbon → Xu hướng tăng đang mạnh. Đợi RSI pullback về chạm ribbon rồi nảy lên lại → điểm vào lệnh an toàn.
  • Tín hiệu bán (Short): RSI màu đỏ + Ribbon toàn màu đỏ + RSI nằm phía dưới ribbon → Xu hướng giảm đang mạnh. Đợi RSI rally lên chạm ribbon rồi bị đẩy xuống → điểm vào short.
  • Tránh giao dịch: Khi RSI màu trắng (trung tính) hoặc RSI nằm bên trong ribbon (các dải mây chồng chéo nhiều màu) → thị trường đang không rõ ràng, chưa nên vào lệnh.

🎯 Chiến lược 2: Bắt breakout với Bollinger Bands

  • Bollinger Squeeze: Khi khoảng cách giữa dải trên và dải dưới hẹp lại bất thường → biến động thấp, thị trường đang "nén lò xo". Chuẩn bị cho một cú breakout mạnh sắp tới.
  • Breakout tăng: Sau giai đoạn squeeze, nếu RSI bứt phá lên trên dải Bollinger trên + Ribbon chuyển xanh → vào lệnh Long ngay sau breakout.
  • Breakout giảm: Sau giai đoạn squeeze, nếu RSI thủng xuống dưới dải Bollinger dưới + Ribbon chuyển đỏ → vào lệnh Short.
  • Stop Loss: Đặt SL phía dưới/trên vùng squeeze vừa rồi (vùng tích lũy) hoặc dưới/trên EMA dài nhất trong ribbon.

🎯 Chiến lược 3: Trading phân kỳ (Divergence Trading)

  • Phân kỳ giảm (Bear Divergence): Khi nhãn "Bear Div" xuất hiện → giá đang tạo đỉnh cao hơn nhưng RSI yếu đi (đỉnh RSI thấp hơn). Đây là cảnh báo mạnh rằng xu hướng tăng đang kiệt sức → Chuẩn bị vào lệnh Short khi RSI xác nhận đảo chiều (chuyển màu đỏ và phá vỡ ribbon).
  • Phân kỳ tăng (Bull Divergence): Khi nhãn "Bull Div" xuất hiện → giá đang tạo đáy thấp hơn nhưng RSI mạnh lên (đáy RSI cao hơn). Tín hiệu xu hướng giảm sắp kết thúc → Chuẩn bị vào lệnh Long khi RSI xác nhận (chuyển màu xanh và vượt ribbon).
  • Phân kỳ ẩn (Hidden Divergence): "H.Bull Div" xác nhận xu hướng tăng vẫn khỏe → có thể mua thêm trong pullback. "H.Bear Div" xác nhận xu hướng giảm vẫn mạnh → có thể short thêm trong rally.

🎯 Chiến lược 4: Quản lý rủi ro và chốt lời

  • Take Profit dựa trên mức 70/30: Nếu đang Long và RSI chạm mức 70 (quá mua) + bắt đầu chuyển màu trắng hoặc đỏ → cân nhắc chốt lời một phần hoặc trailing stop. Tương tự cho Short ở mức 30.
  • Trailing Stop với Ribbon: Khi đã vào lệnh, dùng EMA dài nhất (hoặc cả dải ribbon) làm "support động" cho lệnh Long, "resistance động" cho lệnh Short. Khi RSI phá vỡ ribbon ngược chiều → thoát lệnh ngay.
  • Xác nhận bằng alert: Bật các alert quan trọng như "RSI Bullish/Bearish Signal" và "Divergence" để không bỏ lỡ cơ hội khi không theo dõi biểu đồ liên tục.
⚠️ Lưu ý quan trọng: Đừng chỉ dựa vào một yếu tố duy nhất. Tín hiệu tốt nhất là khi cả ba yếu tố đồng thuận: RSI có màu rõ ràng (xanh/đỏ) + Ribbon cùng màu + Bollinger Bands xác nhận (hoặc breakout hoặc đang ở vùng hợp lý). Tránh giao dịch khi RSI trắng hoặc nằm lộn xộn trong ribbon.

1.4 Cách hoạt động của chỉ báo

📥 Đầu vào và vai trò của chúng:

  • Nguồn giá (Source) - src = close: Giá đóng cửa của mỗi nến. Đây là dữ liệu gốc để tính RSI. Bạn có thể thay bằng open, high, low, hoặc hlc3 nếu muốn thử nghiệm.
  • Chu kỳ RSI (RSI Period) - for_rsi = 50: Số nến dùng để tính RSI. Mặc định là 50 (trung bình). Giá trị càng nhỏ → RSI nhạy hơn với thay đổi giá ngắn hạn; giá trị càng lớn → RSI mượt mà hơn, ít nhiễu hơn.
  • Chu kỳ Bollinger Bands (BB Period) - for_ma = 50: Số nến dùng để tính đường trung bình (basis) của Bollinger Bands trên RSI.
  • Hệ số nhân BB (BB Band) - for_mult = 1.0: Độ rộng của dải Bollinger so với độ lệch chuẩn. Giá trị lớn hơn → dải rộng hơn → ít khi chạm dải; giá trị nhỏ hơn → dải hẹp hơn → hay chạm dải.
  • 10 chu kỳ EMA cho Ribbon - ma_len1 đến ma_len10: Từ 21, 48, 51... đến 499. Các giá trị này tạo ra 5 cặp EMA ngắn-dài, mỗi cặp tạo một lớp mây. Các EMA này được tính trên chính RSI (không phải trên giá).
  • Loại MA (MA Type) - matype = 'EMA': Có thể chọn EMA, SMA, WMA, HMA, RMA, hoặc ALMA. Mỗi loại có đặc tính khác nhau (EMA nhanh nhạy, SMA mượt, HMA giảm độ trễ...).
  • Cài đặt phân kỳ:
    • i_pivot_lookback = 5: Số nến nhìn sang trái và phải để xác định một pivot (đỉnh/đáy của RSI). Giá trị càng lớn → ít pivot hơn nhưng chắc chắn hơn.
    • i_max_lookback = 60: Khoảng cách tối đa (số nến) giữa hai pivot để so sánh phân kỳ. Nếu hai pivot cách nhau quá xa → không tính phân kỳ.

⚙️ Các khối logic chính và vai trò:

  • Logic 1: Tính RSI cơ bản
    • current_rsi = ta.rsi(src, for_rsi): Sử dụng hàm RSI chuẩn của Pine Script. Hàm này tính tỷ lệ giữa mức tăng trung bình và mức giảm trung bình trong for_rsi nến gần nhất, rồi chuyển thành thang điểm 0-100.
    • Vai trò: Cung cấp giá trị RSI thô để các logic khác xử lý tiếp.
  • Logic 2: Xây dựng Bollinger Bands trên RSI
    • basis = ta.ema(current_rsi, for_ma): Đường trung bình của RSI.
    • dev = for_mult * ta.stdev(current_rsi, for_ma): Độ lệch chuẩn của RSI, nhân với hệ số for_mult.
    • upper = basis + devlower = basis - dev: Dải trên và dải dưới.
    • disp_up = basis + (upper - lower) * for_sigmadisp_down = basis - (upper - lower) * for_sigma: Hai ngưỡng động để xác định khi nào RSI "vượt lên" (màu xanh) hoặc "giảm xuống" (màu đỏ). for_sigma = 0.1 là hệ số nhỏ để tạo vùng đệm, tránh chuyển màu quá nhạy.
    • Vai trò: Tạo vùng biến động động cho RSI, giúp xác định động lượng bất thường và tô màu cho đường RSI.
  • Logic 3: Quyết định màu sắc cho RSI
    • color_rsi = current_rsi >= disp_up ? i_bull_color : current_rsi <= disp_down ? i_bear_color : i_neutral_color
    • Nếu RSI ≥ disp_up → màu xanh (tăng); nếu RSI ≤ disp_down → màu đỏ (giảm); nếu ở giữa → màu trắng (trung tính).
    • Vai trò: Giúp trader nhìn thấy ngay trạng thái động lượng qua màu sắc, không cần đọc số.
  • Logic 4: Tính toán hệ thống EMA Ribbon
    • Hàm f_ma(malen): Tính các loại MA (EMA, SMA, WMA, HMA, RMA, ALMA) dựa trên lựa chọn của user.
    • 10 đường MA được tính: mashort1 = f_ma(ma_len1), malong1 = f_ma(ma_len2)... đến mashort5, malong5.
    • Hàm f_get_ribbon_colors(): Quyết định màu sắc cho mỗi lớp ribbon dựa trên việc EMA ngắn nằm trên hay dưới EMA dài. Có hai phong cách: "Gradient Fade" (5 sắc độ xanh/đỏ gradient) hoặc "Classic" (chỉ một màu xanh/đỏ đơn giản).
    • Vai trò: Tạo ra các lớp "mây" màu sắc giúp nhận biết xu hướng RSI rõ ràng hơn. Khi tất cả các lớp cùng màu xanh → xu hướng tăng mạnh; cùng màu đỏ → xu hướng giảm mạnh; lộn xộn → thị trường đang sideway.
  • Logic 5: Phát hiện Pivot Points (đỉnh và đáy của RSI)
    • ph = ta.pivothigh(current_rsi, i_pivot_lookback, i_pivot_lookback): Tìm đỉnh RSI. Một đỉnh hợp lệ là khi RSI ở nến hiện tại cao hơn i_pivot_lookback nến trước và sau nó.
    • pl = ta.pivotlow(current_rsi, i_pivot_lookback, i_pivot_lookback): Tìm đáy RSI. Một đáy hợp lệ là khi RSI ở nến hiện tại thấp hơn i_pivot_lookback nến trước và sau.
    • Tương tự, ph_pricepl_price lưu các pivot của giá (high/low) để so sánh với pivot của RSI.
    • Các pivot này được lưu vào các mảng (arrays): rsi_highs, rsi_lows, price_highs, price_lows cùng với vị trí thanh (bar_index).
    • Vai trò: Xác định các điểm đỉnh/đáy quan trọng của RSI và giá để làm cơ sở cho việc so sánh phân kỳ.
  • Logic 6: Phát hiện phân kỳ (Divergence Detection)
    • Hàm f_check_divergence() so sánh hai pivot gần nhất:
      • Phân kỳ tăng thường (Bullish Regular): Nếu giá tạo đáy thấp hơn (curr_price_low < prev_price_low) nhưng RSI tạo đáy cao hơn (curr_rsi_low > prev_rsi_low) → bull_regular = true.
      • Phân kỳ giảm thường (Bearish Regular): Nếu giá tạo đỉnh cao hơn (curr_price_high > prev_price_high) nhưng RSI tạo đỉnh thấp hơn (curr_rsi_high < prev_rsi_high) → bear_regular = true.
      • Phân kỳ tăng ẩn (Bullish Hidden): Giá tạo đáy cao hơn nhưng RSI tạo đáy thấp hơn.
      • Phân kỳ giảm ẩn (Bearish Hidden): Giá tạo đỉnh thấp hơn nhưng RSI tạo đỉnh cao hơn.
    • Điều kiện: Hai pivot phải cách nhau trong khoảng i_max_lookback nến và phải cách nhau ít nhất i_pivot_lookback nến.
    • Vai trò: Bắt sớm tín hiệu đảo chiều xu hướng hoặc xác nhận xu hướng đang tiếp tục, giúp trader có lợi thế thời gian.

📤 Đầu ra và cách hiển thị:

  • Đường RSI có màu: Vẽ bằng plot(current_rsi, color=color_rsi, linewidth=1). Màu thay đổi theo logic đã tính ở trên.
  • 10 đường EMA và 5 lớp fill (ribbon clouds): plot(mashort1, ...) đến plot(malong5, ...). Sử dụng fill() để tô màu vùng giữa EMA ngắn và EMA dài, tạo hiệu ứng "dải mây". Độ trong suốt của mỗi lớp khác nhau (từ i_cloud_transparency - 10 đến i_cloud_transparency + 10) tạo hiệu ứng chiều sâu.
  • Hai đường Bollinger Bands: plot(upper1, ...)plot(lower1, ...) với màu tím/xanh nhạt, độ trong suốt cao (70%).
  • Ba đường ngang: hline(70, ...), hline(50, ...), hline(30, ...) để đánh dấu vùng quá mua/quá bán.
  • Nhãn phân kỳ: label.new(bar_index, current_rsi, "Bull\nDiv", ...) xuất hiện khi phát hiện phân kỳ. Màu xanh cho bull, đỏ cho bear, có độ trong suốt cho hidden divergence.
💡 Ví dụ minh họa flow hoạt động:
Giả sử: Giá BTC đang ở $50,000. Trong 50 nến vừa qua, giá tăng từ $48,000 lên $50,000.
Bước 1 (Input): Lấy giá đóng cửa của 50 nến gần nhất: [48000, 48200, 48500, ... , 49800, 50000].
Bước 2 (Logic RSI): Hàm ta.rsi(close, 50) tính: Mức tăng trung bình = 40 điểm/nến; mức giảm trung bình = 10 điểm/nến → RS = 40/10 = 4 → RSI = 100 - 100/(1+4) = 80.
Bước 3 (Logic Bollinger): Tính EMA của RSI = 75; độ lệch chuẩn = 5 → upper = 75 + 5 = 80, lower = 75 - 5 = 70. RSI hiện tại (80) đang chạm dải trên → động lượng rất mạnh.
Bước 4 (Logic màu): disp_up = 75 + (80-70)*0.1 = 76. RSI = 80 > 76 → màu xanh (tăng mạnh).
Bước 5 (Logic Ribbon): Tính EMA21 của RSI = 78, EMA48 = 75. EMA21 > EMA48 → lớp mây thứ nhất màu xanh. Tương tự cho các lớp khác → toàn bộ ribbon xanh.
Bước 6 (Pivot & Divergence): Tìm pivot: 5 nến trước RSI = [72, 74, 76, 78, 80], 5 nến sau giả sử RSI giảm xuống [79, 77, 75, 73, 71] → nến hiện tại (RSI=80) là một pivot high. So sánh với pivot high trước đó (giả sử RSI=82 ở $49,500): Giá tăng ($50,000 > $49,500) nhưng RSI giảm (80 < 82) → Phân kỳ giảm (Bear Divergence) → nhãn "Bear Div" xuất hiện.
Bước 7 (Output): Hiển thị đường RSI màu xanh ở mức 80, ribbon toàn xanh, Bollinger Band dải trên chạm RSI, và nhãn "Bear Div" → Cảnh báo: Động lượng đang mạnh nhưng có dấu hiệu kiệt sức (phân kỳ), cần cẩn thận với khả năng đảo chiều.
Zoom/Pan Layered Image
Background Overlay
+

Dùng phân tích trên + Code phía dưới để ra lệnh cho AI chỉnh sửa chỉ báo, chuyển thành bot trade mà không cần biết code!

Cách làm tại đây -> 👉ZERO2HERO👈

				
					// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TrendlineProject
// Last update: October 2024 - v2.0: Fixed MA bug, added divergences, enhanced visuals, alert system

//@version=5
indicator('TP RSI v2.0', overlay=false)

// === RSI SETTINGS ===
i_rsi_group = "═══════ RSI Settings ═══════"
src = input(close, 'Source', group=i_rsi_group)
for_rsi = input.int(50, 'RSI Period', minval=2, group=i_rsi_group)
for_ma = input.int(50, 'BB Period', minval=2, group=i_rsi_group)
for_mult = input.float(1.0, 'BB Band', minval=0.1, step=0.1, group=i_rsi_group)

// === RIBBON SETTINGS ===
i_ribbon_group = "═══════ Ribbon Settings ═══════"
matype = input.string('EMA', 'MA Type', options=['EMA', 'SMA', 'WMA', 'HMA', 'RMA', 'ALMA'], group=i_ribbon_group)

ma_len1 = input.int(21, "Short EMA1 Length", group=i_ribbon_group)
ma_len2 = input.int(48, "Long EMA1 Length", group=i_ribbon_group)
ma_len3 = input.int(51, "Short EMA2 Length", group=i_ribbon_group)
ma_len4 = input.int(98, "Long EMA2 Length", group=i_ribbon_group)
ma_len5 = input.int(103, "Short EMA3 Length", group=i_ribbon_group)
ma_len6 = input.int(149, "Long EMA3 Length", group=i_ribbon_group)
ma_len7 = input.int(155, "Short EMA4 Length", group=i_ribbon_group)
ma_len8 = input.int(199, "Long EMA4 Length", group=i_ribbon_group)
ma_len9 = input.int(206, "Short EMA5 Length", group=i_ribbon_group)
ma_len10 = input.int(499, "Long EMA5 Length", group=i_ribbon_group)

showLine = input.bool(false, "Display EMA Lines", group=i_ribbon_group)

// === DIVERGENCE SETTINGS ===
i_div_group = "═══════ Divergence Settings ═══════"
i_show_divergence = input.bool(true, "Show Divergences", group=i_div_group)
i_show_regular = input.bool(true, "Show Regular Divergence", group=i_div_group)
i_show_hidden = input.bool(true, "Show Hidden Divergence", group=i_div_group)
i_pivot_lookback = input.int(5, "Pivot Lookback", minval=1, maxval=20, group=i_div_group)
i_max_lookback = input.int(60, "Max Lookback Range", minval=10, maxval=200, group=i_div_group)

// === STYLE SETTINGS ===
i_style_group = "═══════ Style Settings ═══════"
i_ribbon_style = input.string("Gradient Fade", "Ribbon Color Style", options=["Gradient Fade", "Classic"], group=i_style_group)
i_cloud_transparency = input.int(40, "Cloud Transparency", minval=20, maxval=90, step=5, group=i_style_group)
i_show_bb = input.bool(true, "Show Bollinger Bands", group=i_style_group)
i_show_ob_os = input.bool(true, "Show Overbought/Oversold Levels", group=i_style_group)

// Custom colors
i_bull_color = input.color(#5b9cf6, "Bullish RSI Color", group=i_style_group)
i_bear_color = input.color(#f7525f, "Bearish RSI Color", group=i_style_group)
i_neutral_color = input.color(#fdfdfd, "Neutral RSI Color", group=i_style_group)

// === CALCULATIONS ===
for_sigma = 0.1
current_rsi = ta.rsi(src, for_rsi)
basis = ta.ema(current_rsi, for_ma)
dev = for_mult * ta.stdev(current_rsi, for_ma)
upper = basis + dev
lower = basis - dev
disp_up = basis + (upper - lower) * for_sigma
disp_down = basis - (upper - lower) * for_sigma

// RSI color logic
color_rsi = current_rsi >= disp_up ? i_bull_color : current_rsi <= disp_down ? i_bear_color : i_neutral_color
rsi_Green = ta.crossover(current_rsi, disp_up)
rsi_Red = ta.crossunder(current_rsi, disp_down)

// === MA FUNCTION (FIXED) ===
f_alma(src_alma, length, offset, sigma) =>
    m = math.floor(offset * (length - 1))
    s = length / sigma
    norm = 0.0
    sum = 0.0
    for i = 0 to length - 1
        weight = math.exp(-1 * math.pow(i - m, 2) / (2 * math.pow(s, 2)))
        norm := norm + weight
        sum := sum + src_alma[length - 1 - i] * weight
    sum / norm

f_ma(malen) =>
    float result = na
    if matype == 'EMA'
        result := ta.ema(current_rsi, malen)
    else if matype == 'SMA'
        result := ta.sma(current_rsi, malen)
    else if matype == 'WMA'
        result := ta.wma(current_rsi, malen)
    else if matype == 'HMA'
        result := ta.hma(current_rsi, malen)
    else if matype == 'RMA'
        result := ta.rma(current_rsi, malen)
    else if matype == 'ALMA'
        result := f_alma(current_rsi, malen, 0.85, 6)
    result

// Calculate MAs
mashort1 = f_ma(ma_len1)
malong1 = f_ma(ma_len2)
mashort2 = f_ma(ma_len3)
malong2 = f_ma(ma_len4)
mashort3 = f_ma(ma_len5)
malong3 = f_ma(ma_len6)
mashort4 = f_ma(ma_len7)
malong4 = f_ma(ma_len8)
mashort5 = f_ma(ma_len9)
malong5 = f_ma(ma_len10)

// === RIBBON COLORS (QUANTUM STYLE) ===
f_get_ribbon_colors(style, is_bullish, layer) =>
    if style == "Gradient Fade"
        bull_colors = array.from(#00d4ff, #00b8e6, #0099cc, #007fb3, #006699)
        bear_colors = array.from(#ff0066, #e6005c, #cc0052, #b30047, #99003d)
        is_bullish ? array.get(bull_colors, layer - 1) : array.get(bear_colors, layer - 1)
    else
        is_bullish ? #026a9e : #8d3e68

cloudcolour1 = f_get_ribbon_colors(i_ribbon_style, mashort1 >= malong1, 1)
cloudcolour2 = f_get_ribbon_colors(i_ribbon_style, mashort2 >= malong2, 2)
cloudcolour3 = f_get_ribbon_colors(i_ribbon_style, mashort3 >= malong3, 3)
cloudcolour4 = f_get_ribbon_colors(i_ribbon_style, mashort4 >= malong4, 4)
cloudcolour5 = f_get_ribbon_colors(i_ribbon_style, mashort5 >= malong5, 5)

mashortcolor1 = f_get_ribbon_colors(i_ribbon_style, mashort1 >= mashort1[1], 1)
mashortcolor2 = f_get_ribbon_colors(i_ribbon_style, mashort2 >= mashort2[1], 2)
mashortcolor3 = f_get_ribbon_colors(i_ribbon_style, mashort3 >= mashort3[1], 3)
mashortcolor4 = f_get_ribbon_colors(i_ribbon_style, mashort4 >= mashort4[1], 4)
mashortcolor5 = f_get_ribbon_colors(i_ribbon_style, mashort5 >= mashort5[1], 5)

malongcolor1 = f_get_ribbon_colors(i_ribbon_style, malong1 >= malong1[1], 1)
malongcolor2 = f_get_ribbon_colors(i_ribbon_style, malong2 >= malong2[1], 2)
malongcolor3 = f_get_ribbon_colors(i_ribbon_style, malong3 >= malong3[1], 3)
malongcolor4 = f_get_ribbon_colors(i_ribbon_style, malong4 >= malong4[1], 4)
malongcolor5 = f_get_ribbon_colors(i_ribbon_style, malong5 >= malong5[1], 5)

// === DIVERGENCE DETECTION ===
ph = ta.pivothigh(current_rsi, i_pivot_lookback, i_pivot_lookback)
pl = ta.pivotlow(current_rsi, i_pivot_lookback, i_pivot_lookback)

ph_price = ta.pivothigh(high, i_pivot_lookback, i_pivot_lookback)
pl_price = ta.pivotlow(low, i_pivot_lookback, i_pivot_lookback)

// Store pivot points
var float[] rsi_highs = array.new_float(0)
var int[] rsi_high_bars = array.new_int(0)
var float[] rsi_lows = array.new_float(0)
var int[] rsi_low_bars = array.new_int(0)

var float[] price_highs = array.new_float(0)
var int[] price_high_bars = array.new_int(0)
var float[] price_lows = array.new_float(0)
var int[] price_low_bars = array.new_int(0)

// Store RSI pivots
if not na(ph)
    array.unshift(rsi_highs, ph)
    array.unshift(rsi_high_bars, bar_index - i_pivot_lookback)
    if array.size(rsi_highs) > 10
        array.pop(rsi_highs)
        array.pop(rsi_high_bars)

if not na(pl)
    array.unshift(rsi_lows, pl)
    array.unshift(rsi_low_bars, bar_index - i_pivot_lookback)
    if array.size(rsi_lows) > 10
        array.pop(rsi_lows)
        array.pop(rsi_low_bars)

// Store price pivots
if not na(ph_price)
    array.unshift(price_highs, ph_price)
    array.unshift(price_high_bars, bar_index - i_pivot_lookback)
    if array.size(price_highs) > 10
        array.pop(price_highs)
        array.pop(price_high_bars)

if not na(pl_price)
    array.unshift(price_lows, pl_price)
    array.unshift(price_low_bars, bar_index - i_pivot_lookback)
    if array.size(price_lows) > 10
        array.pop(price_lows)
        array.pop(price_low_bars)

// Divergence detection function
f_check_divergence() =>
    bool bull_regular = false
    bool bear_regular = false
    bool bull_hidden = false
    bool bear_hidden = false
    
    // Only check on new pivot formation
    is_new_low = not na(pl)
    is_new_high = not na(ph)
    
    // Bullish Regular: Price LL, RSI HL
    if is_new_low and array.size(rsi_lows) >= 2 and array.size(price_lows) >= 2
        curr_rsi_low = array.get(rsi_lows, 0)
        prev_rsi_low = array.get(rsi_lows, 1)
        curr_price_low = array.get(price_lows, 0)
        prev_price_low = array.get(price_lows, 1)
        
        curr_bar = array.get(rsi_low_bars, 0)
        prev_bar = array.get(rsi_low_bars, 1)
        
        if (bar_index - prev_bar) <= i_max_lookback and (bar_index - prev_bar) > i_pivot_lookback
            if curr_price_low < prev_price_low and curr_rsi_low > prev_rsi_low
                bull_regular := true
    
    // Bearish Regular: Price HH, RSI LH
    if is_new_high and array.size(rsi_highs) >= 2 and array.size(price_highs) >= 2
        curr_rsi_high = array.get(rsi_highs, 0)
        prev_rsi_high = array.get(rsi_highs, 1)
        curr_price_high = array.get(price_highs, 0)
        prev_price_high = array.get(price_highs, 1)
        
        curr_bar = array.get(rsi_high_bars, 0)
        prev_bar = array.get(rsi_high_bars, 1)
        
        if (bar_index - prev_bar) <= i_max_lookback and (bar_index - prev_bar) > i_pivot_lookback
            if curr_price_high > prev_price_high and curr_rsi_high < prev_rsi_high
                bear_regular := true
    
    // Bullish Hidden: Price HL, RSI LL
    if is_new_low and array.size(rsi_lows) >= 2 and array.size(price_lows) >= 2
        curr_rsi_low = array.get(rsi_lows, 0)
        prev_rsi_low = array.get(rsi_lows, 1)
        curr_price_low = array.get(price_lows, 0)
        prev_price_low = array.get(price_lows, 1)
        
        curr_bar = array.get(rsi_low_bars, 0)
        prev_bar = array.get(rsi_low_bars, 1)
        
        if (bar_index - prev_bar) <= i_max_lookback and (bar_index - prev_bar) > i_pivot_lookback
            if curr_price_low > prev_price_low and curr_rsi_low < prev_rsi_low
                bull_hidden := true
    
    // Bearish Hidden: Price LH, RSI HH
    if is_new_high and array.size(rsi_highs) >= 2 and array.size(price_highs) >= 2
        curr_rsi_high = array.get(rsi_highs, 0)
        prev_rsi_high = array.get(rsi_highs, 1)
        curr_price_high = array.get(price_highs, 0)
        prev_price_high = array.get(price_highs, 1)
        
        curr_bar = array.get(rsi_high_bars, 0)
        prev_bar = array.get(rsi_high_bars, 1)
        
        if (bar_index - prev_bar) <= i_max_lookback and (bar_index - prev_bar) > i_pivot_lookback
            if curr_price_high < prev_price_high and curr_rsi_high > prev_rsi_high
                bear_hidden := true
    
    [bull_regular, bear_regular, bull_hidden, bear_hidden]

[div_bull_reg, div_bear_reg, div_bull_hid, div_bear_hid] = f_check_divergence()

// Display divergences
if i_show_divergence and i_show_regular and div_bull_reg
    label.new(bar_index, current_rsi, "Bull\nDiv", style=label.style_label_up, color=color.new(color.green, 0), textcolor=color.white, size=size.small)

if i_show_divergence and i_show_regular and div_bear_reg
    label.new(bar_index, current_rsi, "Bear\nDiv", style=label.style_label_down, color=color.new(color.red, 0), textcolor=color.white, size=size.small)

if i_show_divergence and i_show_hidden and div_bull_hid
    label.new(bar_index, current_rsi, "H.Bull\nDiv", style=label.style_label_up, color=color.new(color.green, 50), textcolor=color.white, size=size.small)

if i_show_divergence and i_show_hidden and div_bear_hid
    label.new(bar_index, current_rsi, "H.Bear\nDiv", style=label.style_label_down, color=color.new(color.red, 50), textcolor=color.white, size=size.small)

// === VISUALIZATION ===
// RSI line
plot(current_rsi, color=color_rsi, linewidth=1, title="RSI")

// Ribbon
mashortline1 = plot(mashort1, color=showLine ? color.new(mashortcolor1, 0) : na, linewidth=1, title="Short EMA1")
mashortline2 = plot(mashort2, color=showLine ? color.new(mashortcolor2, 0) : na, linewidth=1, title="Short EMA2")
mashortline3 = plot(mashort3, color=showLine ? color.new(mashortcolor3, 0) : na, linewidth=1, title="Short EMA3")
mashortline4 = plot(mashort4, color=showLine ? color.new(mashortcolor4, 0) : na, linewidth=1, title="Short EMA4")
mashortline5 = plot(mashort5, color=showLine ? color.new(mashortcolor5, 0) : na, linewidth=1, title="Short EMA5")

malongline1 = plot(malong1, color=showLine ? color.new(malongcolor1, 0) : na, linewidth=3, title="Long EMA1")
malongline2 = plot(malong2, color=showLine ? color.new(malongcolor2, 0) : na, linewidth=3, title="Long EMA2")
malongline3 = plot(malong3, color=showLine ? color.new(malongcolor3, 0) : na, linewidth=3, title="Long EMA3")
malongline4 = plot(malong4, color=showLine ? color.new(malongcolor4, 0) : na, linewidth=3, title="Long EMA4")
malongline5 = plot(malong5, color=showLine ? color.new(malongcolor5, 0) : na, linewidth=3, title="Long EMA5")

fill(mashortline1, malongline1, color=color.new(cloudcolour1, i_cloud_transparency - 10), title="Cloud1")
fill(mashortline2, malongline2, color=color.new(cloudcolour2, i_cloud_transparency - 5), title="Cloud2")
fill(mashortline3, malongline3, color=color.new(cloudcolour3, i_cloud_transparency), title="Cloud3")
fill(mashortline4, malongline4, color=color.new(cloudcolour4, i_cloud_transparency + 5), title="Cloud4")
fill(mashortline5, malongline5, color=color.new(cloudcolour5, i_cloud_transparency + 10), title="Cloud5")

// Bollinger Bands
length = input.int(50, 'BB Period', group='BB Settings')
mult = input.float(2.0, 'BB Band', group='BB Settings')
basi = ta.sma(current_rsi, length)
dev1 = mult * ta.stdev(current_rsi, length)
upper1 = basi + dev1
lower1 = basi - dev1

p1 = plot(i_show_bb ? upper1 : na, "Upper BB", color=color.new(#ec40f9, 70), linewidth=1)
p2 = plot(i_show_bb ? lower1 : na, "Lower BB", color=color.new(#3179f5, 70), linewidth=1)

// OB/OS levels (Quantum style)
h1 = hline(i_show_ob_os ? 70 : na, color=color.new(color.red, 70), linewidth=1, linestyle=hline.style_dotted, title="Overbought")
h2 = hline(i_show_ob_os ? 30 : na, color=color.new(color.green, 70), linewidth=1, linestyle=hline.style_dotted, title="Oversold")
hline(50, color=color.new(color.gray, 80), linewidth=1, linestyle=hline.style_solid, title="Midline")

// === ALERTS ===
alertcondition(rsi_Green, "RSI Bullish Signal", "TP RSI: RSI crossed above upper threshold")
alertcondition(rsi_Red, "RSI Bearish Signal", "TP RSI: RSI crossed below lower threshold")

alertcondition(div_bull_reg, "Bullish Divergence", "TP RSI: Regular bullish divergence detected")
alertcondition(div_bear_reg, "Bearish Divergence", "TP RSI: Regular bearish divergence detected")

alertcondition(div_bull_hid, "Hidden Bullish Divergence", "TP RSI: Hidden bullish divergence detected")
alertcondition(div_bear_hid, "Hidden Bearish Divergence", "TP RSI: Hidden bearish divergence detected")

alertcondition(ta.cross(current_rsi, 70), "RSI Overbought", "TP RSI: RSI crossed overbought level (70)")
alertcondition(ta.cross(current_rsi, 30), "RSI Oversold", "TP RSI: RSI crossed oversold level (30)")
				
			

Các chỉ báo khác

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ả.

3 HẠN CHẾ CỦA AI ĐÃ CẢI THIỆN ĐỂ DÙNG TRONG TRADING

1. Trade với AI – Bình CŨ rượu MỚI !? Nói bình CŨ rượu MỚI bởi lẽ, quant trading (giao dịch định lượng) ứng dụng trí tuệ nhân tạo (AI), máy học (Machine Learning), mô hình học sâu (deep learning) và học tăng cường (reinforcement learning) được ứng dụng từ