SEPA Masterclass Việt Nam — Phần VI: Công Cụ Và Hệ Thống Hóa
Thư Viện Pine Script Cho Trend Template Và Nhận Diện Nền Giá Việt Nam
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ế.
//@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ẻ.
//@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)
Đặ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)
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.
Đố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.