SEPA Masterclass Việt Nam — Phần VI: Công Cụ Và Hệ Thống Hóa

CHƯƠNG 41

Thư Viện Pine Script Cho Trend Template Và Nhận Diện Nền Giá Việt Nam


41.1 Mục Tiêu Của Thư Viện Chỉ Báo

Chương này trình bày cấu trúc của một bộ chỉ báo Pine Script gốc, được thiết kế riêng để hiển thị trực quan các tín hiệu SEPA-VN trực tiếp trên biểu đồ TradingView — bổ sung cho bộ lọc đã trình bày ở Chương 39. Toàn bộ mã trong chương này là mã minh họa nguyên bản, viết riêng cho mục đích giáo dục của cuốn sách; người dùng cần tự kiểm tra và điều chỉnh theo phiên bản Pine Script hiện hành cũng như test kỹ trên dữ liệu demo trước khi áp dụng cho quyết định giao dịch thực tế.


41.2 Chỉ Báo 1 — Trend Template Việt Nam (Hiển Thị Trạng Thái)

//@version=5
indicator("SEPA-VN Trend Template", overlay=true)

ma50  = ta.sma(close, 50)
ma150 = ta.sma(close, 150)
ma200 = ta.sma(close, 200)

cond1 = close > ma150 and close > ma200
cond2 = ma150 > ma200
cond3 = ma200 > ma200[20]
cond4 = ma50 > ma150 and ma50 > ma200
cond5 = close > ma50 * 0.98

high52 = ta.highest(high, 252)
low52  = ta.lowest(low, 252)
cond6 = close > low52 * 1.25
cond7 = close > high52 * 0.75

passCount = (cond1?1:0)+(cond2?1:0)+(cond3?1:0)+(cond4?1:0)+(cond5?1:0)+(cond6?1:0)+(cond7?1:0)
allPass = passCount == 7

plot(ma50, color=color.blue, title="MA50")
plot(ma150, color=color.orange, title="MA150")
plot(ma200, color=color.red, title="MA200")

bgcolor(allPass ? color.new(color.green, 90) : na)

var table statusTable = table.new(position.top_right, 1, 1)
if barstate.islast
    table.cell(statusTable, 0, 0,
      allPass ? "TREND TEMPLATE: ĐẠT (" + str.tostring(passCount) + "/7)" :
                "TREND TEMPLATE: CHƯA ĐẠT (" + str.tostring(passCount) + "/7)",
      bgcolor = allPass ? color.green : color.red, text_color = color.white)

Lưu ý: chỉ báo này thể hiện 7 điều kiện kỹ thuật thuần túy (điều kiện 1–7 theo Chương 22, Mục 22.3); điều kiện thứ 8 (sức mạnh tương đối) và các điều kiện bổ sung Việt Nam (thanh khoản, room ngoại, bối cảnh Stage thị trường chung) cần được kiểm tra riêng theo quy trình ở Chương 39, Mục 39.5–39.6, vì chúng đòi hỏi dữ liệu hoặc bối cảnh không thể tính toán đầy đủ chỉ từ một biểu đồ giá đơn lẻ.


41.3 Chỉ Báo 2 — Đánh Dấu Khối Lượng Khô Cạn Và Đột Biến

//@version=5
indicator("SEPA-VN Volume Signals", overlay=false)

volMA50 = ta.sma(volume, 50)
volRatio = volume / volMA50

isDryUp = volRatio < 0.5
isSpike = volRatio > 2.5

plot(volume, style=plot.style_columns,
     color = isSpike ? color.red : (isDryUp ? color.blue : color.gray))
plot(volMA50, color=color.black, title="MA50 Khối Lượng")

// Đánh dấu Pocket Pivot (Chương 29, Mục 29.6):
// khối lượng phiên tăng vượt khối lượng lớn nhất của
// mọi phiên giảm trong 10 phiên gần nhất
maxDownVol = ta.highest(close < close[1] ? volume : 0, 10)
isPocketPivot = close > close[1] and volume > maxDownVol and volume > maxDownVol[1]

bgcolor(isPocketPivot ? color.new(color.yellow, 70) : na)

41.4 Chỉ Báo 3 — Đánh Dấu Chuỗi Phiên Trần/Sàn

Đặc thù riêng của thị trường Việt Nam, hỗ trợ trực quan hóa khái niệm chuỗi breakout đã học ở Chương 3, Mục 3.3:

//@version=5
indicator("SEPA-VN Ceiling/Floor Streak", overlay=true)

// Ngưỡng biên độ tham khảo cho HOSE; điều chỉnh theo sàn niêm yết
ceilingThreshold = 0.0680   // gần +7%, chừa dung sai làm tròn
floorThreshold   = -0.0680

pctChange = (close - close[1]) / close[1]
isCeiling = pctChange >= ceilingThreshold
isFloor   = pctChange <= floorThreshold

// Đếm số phiên trần liên tiếp
var int ceilingStreak = 0
ceilingStreak := isCeiling ? ceilingStreak[1] + 1 : 0

var int floorStreak = 0
floorStreak := isFloor ? floorStreak[1] + 1 : 0

plotshape(isCeiling, style=shape.triangleup, location=location.belowbar,
          color=color.green, size=size.tiny)
plotshape(isFloor, style=shape.triangledown, location=location.abovebar,
          color=color.red, size=size.tiny)

plotchar(ceilingStreak >= 2 ? ceilingStreak : na, char="●",
          location=location.abovebar, color=color.green, size=size.tiny)
Lưu ý: ngưỡng biên độ trong đoạn mã trên minh họa cho HOSE (±7%). Cần điều chỉnh theo sàn niêm yết cụ thể (HNX ±10%, UPCOM ±15% — Chương 2, Mục 2.2) và theo các quy định biên độ hiện hành tại thời điểm sử dụng, vì các thông số này có thể được điều chỉnh bởi cơ quan quản lý theo thời gian.

41.5 Kết Hợp Các Chỉ Báo Thành Một Bảng Điều Khiển Duy Nhất

Trong thực hành, ba chỉ báo trên có thể được hợp nhất thành một chỉ báo duy nhất với bảng trạng thái tổng hợp (table), hiển thị đồng thời trạng thái Trend Template, tín hiệu khối lượng gần nhất, và số phiên trần/sàn liên tiếp hiện tại — giảm số lượng chỉ báo cần quản lý trên biểu đồ và cung cấp một cái nhìn tổng quan nhanh chóng khi rà soát danh sách theo dõi.


41.6 Tóm Tắt Chương

41.7 Bài Tập

  1. Cài đặt chỉ báo Trend Template ở Mục 41.2 trên một biểu đồ TradingView và kiểm tra kết quả với vài cổ phiếu đã biết trạng thái Trend Template từ bài tập Chương 22.
  2. Điều chỉnh ngưỡng biên độ trong chỉ báo ở Mục 41.4 cho một cổ phiếu niêm yết trên HNX hoặc UPCOM.
  3. Thử kết hợp hai trong ba chỉ báo thành một chỉ báo duy nhất theo gợi ý ở Mục 41.5.

41.8 Câu Hỏi Ôn Tập

41.9 Checklist Chuyên Nghiệp

41.10 Lỗi Thường Gặp

41.11 Ghi Chú Nâng Cao

Đối với nhà phát triển: để mở rộng các chỉ báo này thành thuật toán nhận diện VCP/Cup with Handle đầy đủ như đã trình bày ở Chương 40, cần triển khai logic phân đoạn đợt sóng bằng mảng (array) trong Pine Script — một tác vụ phức tạp hơn đáng kể so với các chỉ báo trạng thái đơn giản ở chương này, và trong nhiều trường hợp thực tế sẽ hiệu quả hơn khi triển khai bên ngoài TradingView (ví dụ bằng Python) rồi xuất kết quả cảnh báo trở lại, theo kiến trúc pipeline đã đề xuất ở Chương 39, Mục 39.12.