1. Mô Tả Bollinger Bands Regression Forecast Strategy
Bollinger Bands tiêu chuẩn cộng thêm một "hình nón dự báo" ngoại suy về phía tương lai, một đường giá minh hoạ dạng zigzag+random walk xuyên qua hình nón đó, và một bộ tín hiệu mean-reversion độc lập khi giá bị từ chối tại dải trên/dưới.
1.1 Khái Niệm Chỉ Báo
Cốt lõi chỉ báo là Bollinger Bands tiêu chuẩn (basis = SMA, dải = basis ± hệ số nhân × độ lệch chuẩn). Trên nền đó, chỉ báo thêm một "hình nón dự báo": bằng cách ước tính độ dốc (trend) của basis, độ lệch chuẩn, và ATR qua hồi quy tuyến tính (linear regression) trên một khung nhìn lại riêng, rồi ngoại suy các độ dốc đó về phía tương lai với một đường cong làm mượt (easing) thay vì một đường thẳng thô, tạo ra dự đoán về việc dải Bollinger có thể trông như thế nào trong N nến tới.
Chỉ báo cho phép chọn giữa 5 triết lý dự báo khác nhau - từ tiếp diễn xu hướng thô (Trend), tới chuyển tiếp mượt hình chữ S (Curved), hiệu ứng "hít thở" theo gia tốc biến động kèm một phần kéo về giá trị hiện tại (Bollinger style), độ rộng dẫn dắt hoàn toàn bởi ATR thay vì độ lệch chuẩn (ATR style), tới phiên bản làm mượt nhiều nhất (Smoothed).
- Đường giá minh hoạ (Price Path): một đường zigzag đơn, tuỳ chọn trộn thêm một random walk giả-ngẫu-nhiên xác định (deterministic, có thể tái lập với cùng seed), xuyên qua hình nón dự báo - đây CHỈ LÀ một trong vô số con đường minh hoạ có thể xảy ra, KHÔNG phải một dự đoán có cơ sở thống kê.
- Tín hiệu mean-reversion độc lập: một bộ máy tín hiệu hoàn toàn tách biệt với phần dự báo, phát hiện mẫu hình cổ điển "giá thò qua dải rồi bị từ chối, đóng cửa quay lại bên trong, vẫn ở đúng phía của basis" - đây mới là phần đầu ra có thể dùng trực tiếp để giao dịch của chỉ báo.
1.2 Chức Năng Chỉ Báo
- Bollinger Bands hiện tại: basis/dải trên/dải dưới + vùng tô màu giữa 2 dải, giống một chỉ báo BB tiêu chuẩn.
- Hình Nón Dự Báo: basis dự báo (đường cong easing hoặc thẳng tuỳ mode) + độ rộng/hệ số nhân dự báo, vẽ dưới dạng CHUỖI đoạn thẳng nối tiếp nhau (mỗi bước dự báo là 1 đoạn line riêng, không phải 1 đường liền mạch) - 5 chế độ chọn được, kèm tô màu vùng tuỳ chọn.
- Đường Giá Dự Báo (Price Path): một đường zigzag đơn (tuỳ chọn trộn random walk) xuyên qua hình nón, số nhịp/biên độ/độ suy giảm cấu hình được, kiểu đường và màu riêng biệt với các dải dự báo.
- Nhãn Tín Hiệu: tam giác lên/xuống xếp lớp (1 nhỏ đặc + 1 lớn mờ tạo hiệu ứng "hào quang"), đặt phía trên/dưới dải với khoảng đệm theo EMA(ATR,200), có cooldown chung cho cả 2 hướng và bộ lọc MA bias tuỳ chọn; MA lọc có thể hiện lên biểu đồ.
1.3 Cách Dùng Chỉ Báo
- Dùng dải Bollinger HIỆN TẠI (không phải hình nón dự báo) để ra quyết định giao dịch thực tế: hình nón + đường giá chỉ vẽ lại tại nến cuối cùng và mang tính minh hoạ, không phải một dự báo có cơ sở thống kê được kiểm chứng.
- Chọn "Forecast Band Mode" theo giả định chế độ thị trường bạn muốn hình dung: "Trend" cho tiếp diễn thô; "Curved" cho chuyển tiếp mượt giảm tốc dần; "Bollinger style" nếu muốn thấy hiệu ứng "hít thở" biến động kèm lực kéo về mean; "ATR style" để tách hoàn toàn độ rộng dự báo khỏi độ lệch chuẩn, dùng ATR thay thế; "Smoothed" cho hình ảnh ít giật cục, mượt nhất (nhưng trễ nhất).
- Coi đường giá zigzag/random walk là MỘT con đường minh hoạ, không phải dự báo có edge: nó được dựng từ zigzag suy giảm + random walk có seed, không dựa trên mô hình dự đoán nào cả; đổi "Random Walk Seed" sẽ ra một đường trông khác hẳn nhưng "hợp lệ" y hệt (tức là cũng ngẫu nhiên như nhau).
- Dùng nhãn tam giác làm đầu ra thực sự để giao dịch: chúng kích hoạt theo mẫu hình "thò qua dải rồi bị từ chối, đóng cửa quay lại đúng phía basis", có cooldown = "Length" nến áp dụng chung cho cả 2 hướng.
- Bật "Filter Signals" để chỉ chấp nhận tín hiệu cùng chiều với MA bias chậm hơn - giảm việc bắt dao rơi ngược xu hướng khi thị trường đang trend mạnh.
- Vì mEnd (hệ số nhân tại điểm cuối dự báo) bị ép cứng trong khoảng [2.0, 5.0], nên đặt "Multiplier" trong (hoặc gần) khoảng đó nếu muốn độ rộng cuối hình nón bám sát hệ số nhân bạn chọn, tránh một cú "nhảy" ở điểm nối giữa dải hiện tại và đoạn dự báo đầu tiên.
1.4 Cách Hoạt Động Của Chỉ Báo
Đầu vào & vai trò
- src ("Source", mặc định: close): chuỗi giá làm nền cho basis Bollinger VÀ toàn bộ phần dự báo.
- length ("Length", Số nguyên, mặc định: 20): độ dài lookback của Bollinger (SMA + stdev). Cũng chính là số nến cooldown tối thiểu giữa 2 tín hiệu (xem Luồng 8).
- baseMult ("Multiplier", Số thập phân, mặc định: 2.0): hệ số nhân độ lệch chuẩn cho dải Bollinger HIỆN TẠI, và cũng là điểm bắt đầu (step=0) cho hệ số nhân dự báo.
- projBars ("Forecast Bars", Số nguyên, mặc định: 50, 5-100): số nến vẽ hình nón dự báo về tương lai.
- trendLen ("Trend Length", Số nguyên, mặc định: 50, tối thiểu 10): độ dài lookback dùng để tính độ dốc (qua hồi quy tuyến tính ta.linreg) của basis/độ lệch chuẩn/ATR.
- projMode ("Forecast Band Mode", tuỳ chọn: Trend/Curved/ Bollinger style/ATR style/Smoothed, mặc định: "Curved"): chọn công thức tính độ rộng dự báo (xem Luồng 5 - basis dự báo giống nhau ở 4/5 mode).
- projStyleOpt / projWidth: kiểu & độ dày đường cho các dải dự báo.
- projBasisCol/projUpperCol/projLowerCol/projFillCol/projFillOn: màu + bật/tắt tô nền cho hình nón dự báo.
- swings ("Price ZigZags", Số nguyên, mặc định: 3, 1-10): số nhịp zigzag của đường giá minh hoạ (số đỉnh = swings×2+1).
- zzAmpUnits ("Amplitude", Số thập phân, mặc định: 1.1): biên độ zigzag tính theo đơn vị nửa-độ-rộng dải dự báo tại điểm đó.
- zzDecay ("Decay", Số thập phân, mặc định: 0.75): hệ số suy giảm hình học của biên độ zigzag qua mỗi nhịp (nhịp sau = nhịp trước × zzDecay).
- pathStyleOpt/pathWidth/pathCol: kiểu/độ dày/màu đường giá minh hoạ, tách biệt hoàn toàn với style của các dải dự báo.
- rwOn ("Blend Random Walk into ZigZag", Boolean, mặc định: true): bật/tắt trộn thêm random walk giả-ngẫu-nhiên vào đường zigzag.
- rwMix ("(0=none, 1=strong)", Số thập phân, mặc định: 0.8): trọng số của phần random walk trong đường giá cuối cùng.
- rwStepUnits ("Amplitude", Số thập phân, mặc định: 0.35): kích thước mỗi bước random walk, tính theo đơn vị độ rộng dải.
- rwStepDecay ("Decay", Số thập phân, mặc định: 0.90): hệ số suy giảm kích thước bước random walk qua mỗi nhịp.
- rwSeed ("Random Walk Seed", Số nguyên, mặc định: 1337): seed cho chuỗi giả-ngẫu-nhiên - cùng seed + cùng bar_index luôn cho ra CÙNG một đường (xem Lưu Ý bên dưới về phạm vi "ổn định" thực sự).
- sigShow/sigFilterMA/sigMaType/sigMaLen: bật/tắt tín hiệu, bật/tắt lọc theo MA bias, loại và độ dài MA lọc.
- sigBullCol/sigBearCol/sigShowMA/sigMaCol: màu tín hiệu tăng/giảm, và bật/tắt + màu đường MA lọc hiển thị trên biểu đồ.
Các Khối Logic Chính
🎯 Luồng 1: Bollinger Bands Hiện Tại
- bbBasis = SMA(src, length), bbDev = stdev(src, length), bbW = baseMult × bbDev, bbUpper/bbLower = bbBasis ± bbW - Bollinger Bands tiêu chuẩn, vẽ + tô màu như một chỉ báo BB thông thường.
📐 Luồng 2: Ước Tính Độ Dốc Qua Hồi Quy Tuyến Tính
- Với mỗi trong 3 chuỗi (basis, độ lệch chuẩn, ATR14): lấy giá trị hồi quy tuyến tính (ta.linreg, không phải giá trị thô) tại bar hiện tại và 1 bar trước, hiệu số là độ dốc (bSlope/dSlope/aSlope) - dùng linreg thay vì hiệu số thô giúp độ dốc mượt hơn, ít nhiễu hơn.
- Riêng độ lệch chuẩn còn có thêm devAccel - đạo hàm bậc 2 xấp xỉ (chênh lệch của chênh lệch liên tiếp) - đo xem TỐC ĐỘ THAY ĐỔI của biến động có đang tự nó tăng tốc hay không, dùng riêng cho mode "Bollinger style".
🎚️ Luồng 3: Điểm Cuối & Nội Suy Hệ Số Nhân
- bEnd/dEnd = ngoại suy tuyến tính basis/độ lệch chuẩn tới hết projBars nến (dEnd sàn tại 0). ratio = dEnd/bbDev (mức biến động dự kiến giãn/co bao nhiêu %). mEndRaw = baseMult × (1 + ratio - 1) - hệ số nhân TẠI ĐIỂM CUỐI cũng được scale theo đúng % biến động dự kiến thay đổi.
- mEnd = clamp(mEndRaw, 2.0, 5.0) - LUÔN bị ép vào khoảng [2, 5] bất kể baseMult là bao nhiêu. multAt(step) nội suy mượt (easeInOut) từ baseMult (step=0) tới mEnd (step=projBars), và re-clamp vào [2,5] ở MỌI bước trung gian, không chỉ điểm cuối.
- Ví dụ: bbBasis=1.2600, bSlope=0.0002/nến, projBars=50 → bEnd=1.2600+0.0002×50=1.2700. bbDev=0.0050, dSlope=0.00005/nến → dEnd=0.0050+0.00005×50=0.0075. ratio=0.0075/0.0050=1.5. Nếu baseMult=1.0 → mEndRaw=1.0×1.5=1.5 → mEnd=clamp(1.5,2,5)=2.0 (bị ép TĂNG lên, tạo một cú nhảy rõ rệt so với baseMult=1.0 của dải hiện tại).
📈 Luồng 4: Basis Dự Báo
- basisAt(step): nếu mode="Trend" → đường thẳng bbBasis + bSlope×step. Mọi mode khác → đường cong bbBasis + (bEnd-bbBasis)×easeInOut(step/projBars) - một đường S-curve mượt từ basis hiện tại tới bEnd, tăng tốc rồi giảm tốc dần (không tuyến tính).
📏 Luồng 5: Độ Rộng Dự Báo Theo Từng Mode
- "ATR style": BỎ QUA hoàn toàn bbDev/multAt - ngoại suy + easing riêng cho ATR14 tới aEnd, độ rộng = aF × 2.0 (hệ số cố định, không liên quan baseMult).
- "Bollinger style": accelTerm = 0.25×devAccel×step² (số hạng bậc 2 theo gia tốc biến động - càng xa tương lai, ảnh hưởng càng tăng theo bình phương); dBreathe = dTrend + accelTerm (sàn 0); sau đó KÉO NGƯỢC một phần (tối đa 90% khi t=1) về lại bbDev hiện tại - kết hợp "thở phình" theo gia tốc VÀ lực kéo về mean; nhân với multAt(step).
- "Curved": độ lệch chuẩn cũng được easing mượt (giống công thức basis) từ bbDev tới dEnd, nhân với multAt(step).
- "Trend" và "Smoothed": dùng chung công thức đơn giản nhất - ngoại suy tuyến tính bbDev tới dTrend tại step đó, nhân với multAt(step) (không easing riêng cho độ rộng - độ mượt của "Smoothed" đến từ Luồng 6, không phải ở đây).
- Ví dụ ("Bollinger style"): step=25/50, devAccel=0.00002 → accelTerm=0.25×0.00002×625=0.003125. Giả sử dTrend tại step 25 = 0.0060 → dBreathe=0.009125. t=0.5 → dMR=0.009125-(0.009125-0.0050)×0.45≈0.007269. Kết quả nhân tiếp với multAt(25).
🖊️ Luồng 6: Vẽ Hình Nón Dự Báo (chỉ tại nến cuối cùng)
- Chạy trong khối if barstate.islast: xoá sạch toàn bộ đường/tô màu dự báo cũ trước, sau đó lặp step = 1 to projBars, mỗi bước vẽ 1 ĐOẠN line riêng (không phải đường liền) nối từ điểm cuối bước trước tới điểm mới - tổng cộng 3×projBars đoạn line cho 3 dải (basis/trên/dưới), lý do max_lines_count=500 được khai báo ở đầu file.
- Nếu mode="Bollinger style": áp thêm 1 lớp làm mượt EMA 50% CHỈ cho độ rộng (smW := smW + (wRaw-smW)×0.5), cơ số là giá trị smW đã làm mượt ở BƯỚC TRƯỚC (đệ quy, tích luỹ qua các bước). Nếu mode="Smoothed": áp lớp làm mượt EMA 35% cho CẢ basis lẫn độ rộng, cũng đệ quy tương tự - đây chính là nơi "Smoothed" trở nên khác biệt so với "Trend" dù dùng chung công thức raw.
- Nếu projFillOn: tạo thêm 1 linefill giữa đoạn trên/dưới của MỖI bước (vùng tô cũng bị chia đoạn theo từng bước, không phải 1 khối liền).
〰️ Luồng 7: Vẽ Đường Giá Minh Hoạ (ZigZag + Random Walk)
- pts = swings×2+1 đỉnh, trải đều theo tỷ lệ vị trí (stepK) dọc theo trục projBars. Điểm xuất phát = giá src HIỆN TẠI (không phải bbBasis) tại bar_index hiện tại.
- Mỗi đỉnh: z = zigOffset(k-1) = hướng luân phiên (+1/-1) × biên độ suy giảm hình học (zzAmpUnits × zzDecay^(k-1)). pZ = bA + wA×z (điểm zigzag thuần tuý, dùng basis/độ rộng dự báo TẠI stepK đó - có áp cùng loại làm mượt như Luồng 6 nếu mode="Bollinger style"/"Smoothed", nhưng lần này neo theo bbBasis/bbW CỐ ĐỊNH hiện tại, KHÔNG phải một biến đệ quy tích luỹ qua các đỉnh như trong Luồng 6 - đây là 2 cơ chế làm mượt khác nhau dù công thức trông tương tự).
- Nếu rwOn bật: tính 1 giá trị giả-ngẫu-nhiên xác định từ rwSeed + bar_index×0.001 + k×17.0 + stepK×0.13 qua hàm hashSigned() (dựa trên sin()), nhân với biên độ và suy giảm, rồi CỘNG DỒN vào rwAcc (một random walk thật sự - mỗi bước cộng thêm vào tổng chạy, không phải nhiễu độc lập từng lần). Giá cuối = pZ + rwMix×rwAcc×wA.
- Ví dụ minh hoạ (giá trị hash chỉ mang tính minh hoạ): rwSeed=1337, bar_index=10000, k=1, stepK=17 → key≈1366.21. Giả sử hashSigned(key)≈0.42 → step=0.42×0.35×0.90⁰=0.147 → rwAcc=0.147. Giá đỉnh này lệch thêm 0.8×0.147×wA so với điểm zigzag thuần tuý.
🎯 Luồng 8: Phát Hiện Tín Hiệu Mean-Reversion (mọi nến)
- bearHit: high hiện tại < bbUpper (đã tụt lại vào trong) VÀ high[1] ≥ bbUpper[1] (nến trước đã chạm/vượt dải trên của CHÍNH NÓ) VÀ close > bbBasis (vẫn ở nửa trên) VÀ đã đủ length nến kể từ tín hiệu gần nhất (CẢ 2 HƯỚNG dùng chung 1 bộ đếm cooldown lastSigBar). bullHit đối xứng với dải dưới.
- Nếu sigFilterMA bật: bearHit cần thêm close < sigMA; bullHit cần thêm close > sigMA.
- Ví dụ: bbUpper=1.2650 tại bar 500. Bar 499: high[1]=1.2655 ≥ bbUpper[1]=1.2648. Bar 500: high=1.2645 < 1.2650, close=1.2620 > bbBasis=1.2600, và 500-450=50 ≥ length=20 → bearHit=true. Nếu sigFilterMA bật và close(1.2620) < sigMA(1.2630) → xác nhận, sigDn=true, lastSigBar:=500.
🔺 Luồng 9: Vẽ Nhãn Tín Hiệu
- sigOffset = EMA(ATR14, 200) - một khoảng đệm rất chậm (200 nến), dùng để đặt tam giác lệch ra khỏi đường dải, tránh chồng lấn.
- Mỗi hướng vẽ 2 lớp plotshape chồng nhau tại CÙNG toạ độ: 1 tam giác nhỏ, đặc màu + 1 tam giác lớn hơn, mờ hơn (60% trong suốt) - tạo hiệu ứng "hào quang" mềm quanh tín hiệu. Down đặt tại bbUpper+sigOffset, Up đặt tại bbLower-sigOffset.
Đầu ra & vai trò trong sử dụng
- Bollinger Bands hiện tại: nền tảng chuẩn để đọc vị trí giá tương đối.
- Hình nón dự báo: minh hoạ trực quan "dải có thể trông ra sao" nếu xu hướng hiện tại của basis/biến động tiếp diễn theo công thức đã chọn - KHÔNG phải cam kết hay xác suất thống kê.
- Đường giá zigzag/random walk: MỘT con đường minh hoạ khả dĩ xuyên qua hình nón, không mang thông tin dự đoán độc lập.
- Nhãn tam giác tín hiệu: đầu ra tradeable thực sự - đánh dấu chính xác thời điểm mẫu hình từ chối tại dải xảy ra, có cooldown và bộ lọc bias tuỳ chọn.


