1. Mô tả Log Regression Oscillator Channel Strategy
Chỉ báo dựng một kênh nghiêng trên 150 nến gần nhất (đường hồi quy logarit cộng trừ một dải 1,5 độ lệch chuẩn mỗi phía), rồi vẽ một chỉ báo dao động (mặc định RSI) cùng đường tín hiệu của nó BÊN TRONG kênh đó, nghiêng theo kênh: dao động 30 nằm trên đường dưới, 70 nằm trên đường trên, 50 nằm trên đường giữa.
1.1 Concept của chỉ báo
Chỉ báo trả lời hai câu hỏi bằng một bức tranh: "Xu hướng đang đi về đâu, và giá đang bị kéo căng tới đâu bên trong xu hướng đó?" Thay vì đặt chỉ báo dao động ở một cửa sổ riêng, nó uốn chỉ báo dao động cho vừa với kênh xu hướng, nên hướng xu hướng và mức quá mua / quá bán hiện ra cùng một chỗ trên chart giá.
- Đường xu hướng: hồi quy logarit. Đường hồi quy là đường thẳng khớp nhất với một đám điểm. Ở đây các điểm là logarit của giá đóng cửa của 150 nến gần nhất. Khớp trên logarit nghĩa là đường này đại diện cho xu hướng tăng trưởng theo phần trăm đều đặn (như lãi kép) chứ không phải tăng đều theo số đô — hợp hơn với các thị trường di chuyển theo phần trăm.
- Kênh: ± 1,5 độ lệch chuẩn. Độ lệch chuẩn đo mức giá đóng cửa trong cửa sổ bị rải rộng đến đâu. Đường trên và đường dưới nằm cách đường hồi quy 1,5 × độ rải đó, một lên một xuống. Thị trường êm cho kênh hẹp, thị trường dao động mạnh cho kênh rộng.
- Chỉ báo dao động nằm trong kênh. RSI (hoặc Stochastic, Stochastic RSI, MFI) thường sống trong cửa sổ 0–100. Ở đây khoảng 30 đến 70 được kéo giãn ra bằng chiều cao của kênh: giá trị dao động 30 được vẽ trên đường dưới, 70 trên đường trên, và 50 đúng trên đường giữa. Giá trị trên 70 hoặc dưới 30 được vẽ ra ngoài kênh. Vì khung bám theo độ dốc của xu hướng, đường dao động cũng nghiêng theo.
- Đường tín hiệu. Một đường trung bình (SMA, mặc định 14) của chính chỉ báo dao động đó, vẽ theo cùng cách ánh xạ. Khi dao động cắt qua nó là động lượng đang đổi chiều.
Niềm tin nền tảng: giá có xu hướng dao động quanh đường xu hướng của nó, và một chỉ báo dao động chạm tới mép kênh — ngay tại chỗ mà chính giá cũng đang bị kéo căng — là tín hiệu quá mua / quá bán có ý nghĩa hơn cùng con số đó ở một cửa sổ tách rời. Lưu ý đây là ảnh chụp nhanh tại thời điểm hiện tại: kênh và đường dao động chỉ tồn tại cho 150 nến gần nhất, ở mép phải của chart.
1.2 Chức năng của chỉ báo
-
Hiển thị:
- Đường kênh trên và dưới: hai đường liền, dày (độ dày 2) màu xám xanh nhạt (#a7abb9), nghiêng theo xu hướng. Chúng bắt đầu từ 150 nến trước và kết thúc ở nến mới nhất.
- Đường giữa: một đường mảnh nét đứt màu xám, chính là đường hồi quy, nằm giữa hai đường ngoài (có thể tắt).
- Tô nền: một lớp tô rất trong suốt (90%) màu tím giữa đường trên và đường dưới (có thể tắt). Màu của nó theo màu chỉ báo dao động chứ không theo màu các đường.
- Đường dao động: một đường tím (độ dày 2) bám theo chỉ báo dao động trong 150 nến gần nhất, đặt trong / quanh kênh như mô tả ở trên.
- Đường tín hiệu: một đường vàng mảnh hơn (độ dày 1) cho đường trung bình của chỉ báo dao động (có thể tắt).
- Ba nhãn chữ ở đầu phải của kênh: tên chỉ báo dao động và giá trị hiện tại trên đường dao động (ví dụ RSI: 55.3), số thang dưới (30) ở đường dưới và số thang trên (70) ở đường trên.
- Alert: Chỉ báo KHÔNG có lệnh alertcondition() hay alert() nào, và không có mũi tên mua / bán. Nó thuần túy là công cụ vẽ; bạn tự đọc tín hiệu hoặc tự tạo cảnh báo.
1.3 Cách dùng chỉ báo
- Đọc độ nghiêng của kênh như xu hướng. Kênh dốc lên về bên phải = xu hướng tăng trong 150 nến gần nhất, dốc xuống = xu hướng giảm, gần như ngang = đi ngang. Khoảng cách giữa hai đường ngoài cho biết giá đã dao động rộng đến đâu.
- Đọc chỉ báo dao động so với mép kênh. Đường tím chạm hoặc chọc ra khỏi đường trên nghĩa là chỉ báo dao động đang ở hoặc trên giá trị thang trên (70): "bị kéo căng lên". Ở hoặc dưới đường dưới (30): "bị kéo căng xuống". Cắt qua đường giữa nghĩa là chỉ báo dao động cắt qua mức 50.
- Kết hợp hai cách đọc (một cách dùng phổ biến, không có sẵn trong code). Trong kênh dốc lên, chỉ báo dao động rơi xuống đường dưới rồi quay lên là hình ảnh "mua nhịp chỉnh trong xu hướng tăng"; trong kênh dốc xuống, chỉ báo dao động leo lên đường trên rồi quay xuống là hình ảnh "bán nhịp hồi trong xu hướng giảm". Trong kênh ngang, hai mép có thể coi là hai đầu của vùng đi ngang.
- Dùng đường tín hiệu vàng để canh thời điểm. Chỉ báo dao động cắt lên trên đường vàng = động lượng quay lên; cắt xuống dưới = quay xuống. Các lần cắt gần mép kênh mạnh nhất, các lần cắt gần đường giữa yếu nhất.
- Chọn loại chỉ báo dao động hợp phong cách. RSI (mặc định) mượt; STOCHASTIC phản ứng nhanh hơn và hay lắc giữa hai đầu hơn; STOCHASTIC RSI nhạy nhất; MFI có tính cả khối lượng nên cần mã có dữ liệu khối lượng thật.
- Dùng "Scale" để quyết định thế nào là cực trị. Ở 70, hai mép nghĩa là 30 / 70. Ở 80, hai mép nghĩa là 20 / 80, nên chỉ báo dao động phải đi xa hơn mới chạm được (ít lần chạm hơn nhưng mạnh hơn). Ở 100, toàn bộ khoảng 0–100 được kéo giãn ra bằng kênh.
- Chỉnh "Lookback Period" cho hợp khung thời gian. Mặc định 150 trên M15 bao khoảng 37 giờ giao dịch; trên H1 khoảng 6 ngày; trên H4 khoảng 25 ngày. Lookback dài cho kênh mượt, ổn định hơn; ngắn thì bám sát giá gần đây và nghiêng nhanh.
- Đừng đọc đường dao động như một mức giá. Độ cao của nó cho biết chỉ báo dao động đang đứng ở đâu so với kênh, không phải một mức giá. Cắt qua mép kênh là nói về chỉ báo dao động, không phải giá phá vỡ.
- Nhớ rằng bức tranh bị vẽ lại. Mọi thứ được dựng lại cho 150 nến gần nhất ở mỗi nến mới, nên hình dạng đường tím trong kênh thay đổi khi kênh dịch chuyển, dù bản thân giá trị chỉ báo dao động không đổi. Hãy dùng nó cho tình huống hiện tại, đừng dùng để nghiên cứu nó từng trông ra sao trong quá khứ.
1.4 Cách hoạt động của chỉ báo
Đầu vào & vai trò
- length (hiện là "Lookback Period", số nguyên, mặc định 150, nhóm "Channel"): số nến trong cửa sổ. Nó quyết định cửa sổ cho hồi quy, cho độ lệch chuẩn, cho đường dao động được vẽ, và điểm bắt đầu của các đường. Ví dụ: ở 150 kênh được khớp trên 150 giá đóng cửa gần nhất; ở 50 chỉ trên 50 giá gần nhất, nên kênh hẹp hơn và nghiêng nhanh hơn. Trần thực tế: script khai báo max_bars_back = 500, nên các giá trị gần hoặc vượt ~500 nhiều khả năng gây lỗi "too far back in history".
- channel_width (hiện là "Channel Width", số thập phân, mặc định 1,5, bước 0,1): hệ số nhân của độ lệch chuẩn. Ví dụ: nếu độ lệch chuẩn là 58 điểm giá, các đường nằm cách đường giữa 87 điểm (58 × 1,5) lên và xuống; ở 2,0 sẽ cách 116 điểm, ở 1,0 chỉ 58. Kênh rộng hơn cũng làm chỉ báo dao động bị nén dẹt theo chiều dọc (xem Flow 4).
- mid_disp ("Mid Line", ô tick, mặc định bật) và fill_band ("Fill Background", ô tick, mặc định bật): hai ô tick này nằm chung một hàng trong Settings (inline = "s"). Chúng chỉ bật / tắt đường giữa và lớp tô; không đổi phép tính nào. (Xem ghi chú về ô tick Mid Line.)
- col_up / col_mid / col_low ("Channel Lines Color: Upper", "Mid", "Lower", ô chọn màu, mặc định xám xanh nhạt / xám / xám xanh nhạt): ba ô màu nằm chung một hàng (inline = "Col"). Chỉ đổi màu.
- osc (hiện là "Type:", danh sách chọn RSI / STOCHASTIC / STOCHASTIC RSI / MFI, mặc định RSI, nhóm "Oscillator"): chỉ báo dao động nào được vẽ. Công thức chính xác ở Flow 3.
- lengtht (ô số không có tên nằm cùng hàng với "Type:", số nguyên, mặc định 14): chu kỳ của chỉ báo dao động. Ví dụ: RSI(14) nhìn vào 14 nến gần nhất; RSI(7) sẽ giật hơn. Với STOCHASTIC RSI nó được dùng hai lần (chu kỳ RSI và chu kỳ stochastic).
- osc_col (ô màu cùng hàng đó, mặc định tím #7e57c2): màu của đường dao động và của lớp tô nền (độ trong suốt 90%).
- upper_threshold (hiện là "Scale", số nguyên, mặc định 70): giá trị dao động được vẽ trên đường trên. Giá trị thang dưới được tính tự động là 100 − Scale (30 ở mặc định). Ví dụ: Scale 80 → đường dưới = 20, đường trên = 80. Hãy giữ lớn hơn 50 (xem ghi chú).
- sig_disp ("Signal Line", ô tick, mặc định bật), length_sig (ô số không có tên, số nguyên, mặc định 14) và sig_line (ô màu, mặc định vàng): ba thứ này nằm chung một hàng (inline = "sig"). Chúng bật / tắt đường tín hiệu, đặt độ dài đường trung bình của chỉ báo dao động và đặt màu của nó. Ví dụ: độ dài 14 lấy trung bình 14 giá trị dao động gần nhất; độ dài 5 làm đường vàng bám sát đường tím hơn nhiều.
Hằng số cố định trong code (KHÔNG phải input)
- Hồi quy chỉ chạy trên giá đóng cửa và độ lệch là độ lệch chuẩn thông thường của các giá đóng cửa (không phải của phần dư hồi quy, cũng không phải của logarit).
- Làm mượt STOCHASTIC RSI: kết quả được lấy trung bình bằng SMA 3 nến; STOCHASTIC thường không được làm mượt. MFI được tính trên hlc3 (trung bình của cao, thấp và đóng).
- Chi tiết vẽ: hai đường ngoài độ dày 2, đường giữa độ dày 1 nét đứt, đường dao động độ dày 2, đường tín hiệu độ dày 1, lớp tô trong suốt 90%.
- max_bars_back = 500: script được phép nhìn ngược lịch sử tối đa bao xa.
Các khối logic chính
🧭 Flow 0 — Cái gì chạy khi nào
- Ở mọi nến script tính hồi quy, các mức giá của kênh, chỉ báo dao động và đường tín hiệu của nó, và dời ba đối tượng đường (hai đường ngoài và đường giữa) sang toạ độ mới. "Đối tượng đường" là một hình vẽ mà script tạo ra một lần rồi liên tục đặt lại vị trí.
- Chỉ ở nến cuối cùng (barstate.islast, vẫn đúng ở mọi lần giá nhảy của nến đang chạy) nó mới vẽ đường dao động và ba nhãn chữ, và xóa các bản cũ trước khi vẽ bản mới.
- Kết quả là một ảnh chụp nhanh trượt: bạn thấy một kênh và một đường dao động cho 150 nến gần nhất. Các nến trước đó không mang kênh hay đường nào, vì cùng vài hình vẽ đó chỉ đơn giản được dời về phía trước mỗi lần.
📐 Flow 1 — Hồi quy logarit (mọi nến)
- Code duyệt qua length nến gần nhất. Với nến cách đây i nến (i = 0 là nến mới nhất) nó lấy logarit tự nhiên của giá đóng cửa và gán cho nó số thứ tự vị trí per = i + 1 (nên nến mới nhất là 1 và nến cũ nhất là 150). Lưu ý các số vị trí đếm ngược theo thời gian.
- Nó cộng bốn tổng trên cửa sổ — tổng các số vị trí, tổng các logarit, tổng bình phương vị trí, và tổng vị trí × logarit — rồi đưa vào công thức "bình phương tối thiểu" chuẩn để có độ dốc (ln(giá) đổi nhanh thế nào mỗi nến khi lùi về quá khứ) và hệ số chặn (giá trị khởi đầu). Vì vị trí chạy ngược, ở thị trường tăng độ dốc âm (nến cũ thấp hơn).
- Đổi đường thành giá: reg_start = exp(intercept + slope × length) là giá hồi quy ở đầu cũ nhất của cửa sổ, reg_end = exp(intercept) là giá ở đầu mới nhất. (exp hoàn tác phép logarit.)
- Ví dụ cụ thể: trong 150 nến, giá đóng cửa leo đều từ khoảng 2.500 lên khoảng 2.700. Phép khớp cho reg_start ≈ 2.500 và reg_end ≈ 2.700, và độ dốc khoảng −0,0005 (ln(2500 / 2700) ÷ 150, âm vì đầu cũ thấp hơn).
📏 Flow 2 — Các đường kênh (mọi nến)
- deviation = ta.stdev(close, length): độ lệch chuẩn của 150 giá đóng cửa gần nhất, tính bằng đơn vị giá. Ví dụ: với giá đóng cửa rải đều giữa 2.500 và 2.700 nó khoảng 58.
- Bốn mức giá của kênh: đường trên đầu / cuối = reg_start / reg_end + deviation × channel_width; đường dưới đầu / cuối = tương tự nhưng − deviation × channel_width. Ví dụ cụ thể (58 × 1,5 = 87): trên 2.587 → 2.787; giữa 2.500 → 2.700; dưới 2.413 → 2.613.
- Đường thẳng: mỗi đường là một đoạn thẳng thông thường từ nến cách đây 150 nến (giá đầu) tới nến mới nhất (giá cuối). Cùng một lượng được cộng ở hai đầu, nên ba đường song song. Hồi quy logarit thật là một đường cong nhẹ; chỉ báo chỉ vẽ đoạn thẳng nối hai đầu của nó, nên khi xu hướng tăng tốc mạnh, đường cong thật sẽ võng ra xa đường giữa đã vẽ.
- Tạo một lần, rồi dời: nếu một đường chưa tồn tại thì nó được tạo; nếu đã có thì hai đầu của nó được cập nhật ở mọi nến. Đường giữa chỉ được tạo khi ô "Mid Line" được tick.
- Tô nền: khi "Fill Background" được tick, một lớp tô giữa đường trên và đường dưới được tạo ở mọi nến với màu của chỉ báo dao động ở độ trong suốt 90%.
📊 Flow 3 — Chỉ báo dao động và đường tín hiệu (mọi nến)
- Tùy "Type:" mà chỉ báo dao động là một trong:
- RSI: ta.rsi(close, lengtht) — chỉ số sức mạnh tương đối chuẩn, 0–100.
- MFI: ta.mfi(hlc3, lengtht) — Money Flow Index, một chỉ số giống RSI nhưng cân nhắc mỗi nến theo khối lượng, 0–100.
- STOCHASTIC: ta.stoch(close, high, low, lengtht) — giá đóng cửa đang nằm ở đâu giữa đáy thấp nhất và đỉnh cao nhất của lengtht nến gần nhất, 0–100, không làm mượt.
- STOCHASTIC RSI: cùng công thức stochastic nhưng áp lên RSI thay vì giá, rồi làm mượt bằng SMA 3 nến.
- Đường tín hiệu: sma_osc = ta.sma(Oscillator, length_sig) — trung bình đơn giản của 14 giá trị dao động gần nhất (mặc định).
- Ví dụ cụ thể: RSI(14) của 14 nến gần nhất = 60; trung bình của 14 giá trị RSI gần nhất = 55 → dao động 60, tín hiệu 55.
🧲 Flow 4 — Ép chỉ báo dao động vào kênh (nến cuối)
- lower_threshold = 100 − upper_threshold (30 ở Scale mặc định 70).
- step = (upper_end − lower_end) ÷ (upper_threshold − lower_threshold): một điểm dao động đáng giá bao nhiêu điểm giá. Chiều cao kênh là tử số, 40 điểm dao động (30 → 70) là mẫu số. Ví dụ: chiều cao kênh ở nến mới nhất 2.787 − 2.613 = 174 → step = 174 ÷ 40 = 4,35 điểm giá cho mỗi điểm dao động.
- slope_ = (reg_start − reg_end) ÷ length: giá của kênh giảm bao nhiêu mỗi nến khi lùi về quá khứ. Ví dụ: (2.500 − 2.700) ÷ 150 = −1,33 mỗi nến.
- Với mỗi nến trong cửa sổ (i = 0 mới nhất … 149 cũ nhất) một điểm của đường được đặt tại: y = lower_end + slope_ × i + step × (oscillator[i] − lower_threshold). Nói bằng lời: lấy giá của đường dưới tại nến đó (lower_end + slope_ × i bám đúng đường dưới) rồi đi lên (dao động − 30) × step.
- Ví dụ cụ thể (nến mới nhất, i = 0): RSI = 60 → 2.613 + (60 − 30) × 4,35 = 2.743,5. RSI = 50 → 2.613 + 20 × 4,35 = 2.700 = đúng đường giữa. RSI = 30 → 2.613 (đường dưới). RSI = 70 → 2.787 (đường trên). RSI = 80 → 2.613 + 50 × 4,35 = 2.830,5, nằm trên đường trên (2.787).
- Ví dụ cụ thể (nến cũ hơn, i = 75): đường dưới ở đó là 2.613 − 1,33 × 75 ≈ 2.513 (đúng giữa đường dưới như mong đợi). RSI bằng 40 ở nến đó được vẽ tại 2.513 + 10 × 4,35 = 2.556,5.
- Hệ quả: độ cao của đường tại mỗi nến là vị trí của nó so với kênh tại nến đó, nên đường nghiêng theo kênh. Và vì step phụ thuộc chiều cao kênh, kênh rộng làm đường dẹt đi, kênh hẹp làm nó bị phóng đại.
🖌️ Flow 5 — Vẽ đường và nhãn (chỉ nến cuối)
- Với chỉ báo dao động và (nếu được tick) đường tín hiệu, script dựng một danh sách 150 điểm (vị trí nến + giá từ Flow 4) và vẽ chúng thành một đường gấp khúc liền với màu đã chọn (dao động độ dày 2, tín hiệu độ dày 1). Đường gấp khúc trước đó bị xóa trước.
- Chỉ đường dao động mới có nhãn. Ba nhãn được đặt ở nến mới nhất, neo về bên phải: tên và giá trị chỉ báo dao động (RSI: 60.0) ở cuối đường, giá trị thang dưới (30) ở cuối đường dưới, giá trị thang trên (70) ở cuối đường trên. Các nhãn trước bị xóa nên chỉ còn một bộ.
Đầu ra & vai trò trong sử dụng
- Kênh (hai đường ngoài + đường giữa + lớp tô): hướng xu hướng (độ nghiêng), tâm của nó (đường giữa) và biên độ dao động bình thường quanh tâm.
- Đường dao động: động lượng đo trong cùng khung với giá — chạm mép cho thấy cực trị, cắt đường giữa cho thấy mức 50.
- Đường tín hiệu: canh thời điểm động lượng quay đầu qua các lần cắt với đường dao động.
- Ba nhãn: giá trị chính xác của chỉ báo dao động và các số thang mà hai đường ngoài đại diện.
- Chỉ báo là ảnh chụp nhanh, không phải lịch sử. Kênh, các đường và các nhãn chỉ tồn tại ở mép phải, dựng lại ở mỗi nến mới. Bạn không thể cuộn lại để xem các kênh cũ hay tín hiệu cũ như lúc nó đã xảy ra, và ở đây không có gì để backtest có thể phát lại từng nến. Đường dao động cũng bị chiếu lại mỗi lần: khi kênh dịch chuyển, đường tím đổi hình dạng dù bản thân giá trị chỉ báo dao động không đổi.
- Kênh "log" được vẽ bằng đường thẳng. Chỉ hai điểm đầu cuối đến từ hồi quy logarit; đoạn giữa chúng là thẳng. Đường giữa vì vậy là một dây cung của đường cong thật, không phải chính đường cong.
- Độ rộng kênh đo trên giá, không đo trên hồi quy. Độ lệch là độ rải của giá đóng cửa quanh trung bình của chính chúng trong cửa sổ, không phải quanh đường xu hướng. Trong xu hướng mạnh độ rải đó lớn chỉ vì giá đã đi xa, nên kênh rộng ra dù giá bám sát đường xu hướng. Trong vùng đi ngang thì kênh hẹp. (Ví dụ: một nhịp leo thẳng 200 điểm đã cho độ lệch gần 58, tức kênh ±87 ở độ rộng mặc định, dù nhịp leo đó sạch đến đâu.)
- "Scale" phải giữ lớn hơn 50. Giá trị dưới là 100 − Scale, nên ở Scale = 50 cả hai đầu cùng là 50 và step thành phép chia cho 0 (đường hỏng); dưới 50 thì giá trị dưới lớn hơn giá trị trên và đường bị vẽ ngược. Hãy dùng các giá trị từ 51 đến 100.
- Bỏ tick "Mid Line": nhiều khả năng lỗi lúc chạy (chưa kiểm thử). Code chỉ tạo đường giữa khi ô tick bật, nhưng trường hợp còn lại vẫn cố dời nó. Khi tắt tick, đường giữa không bao giờ tồn tại, và việc dời một đường không tồn tại được dự đoán sẽ làm script dừng với lỗi. Nếu muốn ẩn đường giữa, an toàn hơn là đặt màu của nó trong suốt thay vì bỏ tick.
- Một lớp tô mới ở mỗi nến. Lớp tô nền được tạo lại ở mọi nến và code không bao giờ xóa các lớp cũ. Chúng đều nằm trên cùng hai đường, nên giới hạn số hình vẽ của TradingView chỉ giữ lại các lớp mới nhất, và các bản trong suốt chồng lên nhau có thể làm lớp tô trông đục hơn mức trong suốt 90% gợi ý.
- Lệch một nến. Cửa sổ dao động tính nến mới nhất là vị trí 1 và nến cũ nhất là 150, trong khi đường được vẽ từ nến thứ 151 trở lại (bar_index[length]) tới nến mới nhất, với giá cuối lấy ở vị trí 0. Hệ quả là lệch khoảng một nến và gần như không nhìn thấy được.
- Nến đang chạy làm mọi thứ dịch chuyển. Cửa sổ gồm cả nến hiện tại chưa hoàn thành, nên ở mỗi lần giá nhảy, hồi quy, kênh, giá trị dao động và các nhãn đều được tính lại và có thể dịch chuyển cho tới khi nến đóng.
- MFI cần khối lượng. Trên mã không có dữ liệu khối lượng thật, MFI vô nghĩa (phẳng hoặc trống).


