Đi tới nội dung chính
Chuyển tới nội dung chính

Bài 2 — Chỉ báo ngăn riêng và mức

Bạn sẽ học: vẽ chỉ báo ở ngăn riêng (RSI, MACD, Stochastic), cố định thang, kẻ mức ngang, tô vùng quá mua / quá bán, vẽ cột histogram hai màu, đặt nhiều ngăn trong một chỉ báo.

2.1. RSI ở ngăn riêng​

indicator({
name: "RSI của tôi",
pane: "new",
scale: { range: [0, 100], levels: [30, 70] },
plot: (d) => ({
RSI: line(ta.rsi(d.close, 14), { color: "accent", width: 2 }),
"Quá mua": hline(70, { color: "down", dash: "dash" }),
"Quá bán": hline(30, { color: "up", dash: "dash" }),
}),
});
  • pane: "new" — ngăn riêng dưới biểu đồ giá (đây cũng là mặc định khi bỏ pane).
  • scale.range: [0, 100] — thang luôn từ 0 tới 100 thay vì tự co giãn theo dữ liệu; scale.levels kẻ thêm vạch mờ ở các mức.
  • hline(giá trị, { … }) — đường ngang cố định. Tuỳ chọn: color (mặc định xám), dash (mặc định nét gạch; "solid" để liền), width. Tên đầu ra ("Quá mua") hiện ở chú giải.

2.2. Tô vùng quá mua / quá bán​

fill nhận tên của cả đường lẫn mức ngang. Mẹo: cho below trong suốt ("#00000000") để chỉ tô khi RSI vượt mức.

indicator({
name: "RSI tô vùng",
scale: { range: [0, 100] },
plot: (d) => ({
RSI: line(ta.rsi(d.close, 14), { color: "accent", width: 2 }),
"70": hline(70, { color: "down" }),
"30": hline(30, { color: "up" }),
"Vùng giữa": band(70, 30, { color: "accent", opacity: 0.05 }),
"Trên 70": fill("RSI", "70", { color: "down", below: "#00000000", opacity: 0.35 }),
"Dưới 30": fill("30", "RSI", { color: "up", below: "#00000000", opacity: 0.35 }),
}),
});
  • band(70, 30, …) — dải giữa hai số cố định (nền mờ cho vùng 30–70).
  • fill("RSI", "70", …) tô giữa đường RSI và mức 70: màu color khi RSI trên 70; khi RSI dưới 70 dùng below (trong suốt).
  • fill("30", "RSI", …) đảo thứ tự: tô khi 30 nằm trên RSI, tức RSI dưới 30.

RSI có vùng 30–70 và phần vượt ra ngoài được tô

2.3. MACD với histogram hai màu​

ta.macd trả ba chuỗi trong một đối tượng: macd, signal, hist. hist(chuỗi, { up, down }) vẽ cột quanh 0: cột dương màu up, âm màu down.

indicator({
name: "MACD của tôi",
plot: (d) => {
const m = ta.macd(d.close, 12, 26, 9);
return {
Histogram: hist(m.hist, { up: "up", down: "down", opacity: 0.6 }),
MACD: line(m.macd, { color: "accent" }),
"Tín hiệu": line(m.signal, { color: "ref" }),
"0": hline(0, { color: "textMuted", dash: "dot" }),
};
},
});

Histogram bốn màu kiểu "tăng mạnh / tăng yếu / giảm yếu / giảm mạnh" dùng colors:

indicator({
name: "MACD histogram 4 màu",
plot: (d) => {
const h = ta.macd(d.close).hist;
const len = h.gt(h.shift(1));
return {
Histogram: hist(h, {
color: "down",
colors: [
{ when: h.gte(0).and(len), color: "up" },
{ when: h.gte(0), color: "#16C78480" },
{ when: len, color: "#F6465D80" },
],
}),
};
},
});

ta.macd(d.close) không ghi số là dùng mặc định 12, 26, 9. Màu #16C78480 là xanh với độ đục 50 % (hai số cuối 80 là kênh trong suốt theo hệ 16).

2.4. Stochastic: hai đường và vùng giữa​

indicator({
name: "Stochastic 14-3-3",
scale: { range: [0, 100], levels: [20, 80] },
plot: (d) => {
const st = ta.stoch(d, 14, 3, 3);
return {
"%K": line(st.k, { color: "accent" }),
"%D": line(st.d, { color: "ref" }),
"Khoảng K–D": fill("%K", "%D", { color: "up", below: "down", opacity: 0.15 }),
"80": hline(80),
"20": hline(20),
};
},
});

ta.stoch nhận cả d (vì cần cao, thấp, đóng) thay vì một chuỗi. Các chỉ báo cần nhiều giá — ta.atr, ta.adx, ta.cci, ta.mfi, ta.supertrend… — đều nhận d.

2.5. Nhiều ngăn trong một chỉ báo​

Đặt pane cho từng đầu ra: cùng tên ngăn thì chung ngăn; "price" là ngăn giá.

indicator({
name: "Khối lượng và OBV",
plot: (d) => ({
"Khối lượng": columns(d.volume, { color: "accent", opacity: 0.5, pane: "Khối lượng", format: "volume" }),
"KL TB 20": line(ta.sma(d.volume, 20), { color: "ref", pane: "Khối lượng", format: "volume" }),
OBV: line(ta.obv(d), { color: "ai", pane: "OBV", format: "compact" }),
}),
});
  • columns vẽ cột từ 0 (hợp với khối lượng); hist vẽ cột quanh một mức gốc base (mặc định 0) với hai màu tăng / giảm.
  • format đổi cách hiện số ở chú giải và thang: "volume" (1,2 Tr), "compact", "percent", "integer", "price"…

Bài tập​

  1. Vẽ CCI 20 ở ngăn riêng, mức +100 / −100, tô đỏ phần trên +100, xanh phần dưới −100.
  2. Vẽ %B của Bollinger (vị trí giá trong dải, 0 = dải dưới, 1 = dải trên) với mức 0 và 1.
Lời giải 1
indicator({
name: "CCI tô vùng",
plot: (d) => ({
CCI: line(ta.cci(d, 20), { color: "accent" }),
"+100": hline(100, { color: "down" }),
"-100": hline(-100, { color: "up" }),
"Trên +100": fill("CCI", "+100", { color: "down", below: "#00000000", opacity: 0.3 }),
"Dưới -100": fill("-100", "CCI", { color: "up", below: "#00000000", opacity: 0.3 }),
}),
});
Lời giải 2
indicator({
name: "Bollinger %B",
plot: (d) => ({
"%B": line(ta.bb(d.close, 20, 2).pctB, { color: "accent" }),
"Dải trên": hline(1, { color: "down" }),
"Dải dưới": hline(0, { color: "up" }),
}),
});

ta.bb trả upper, mid, lower, pctB, width — xem Tham chiếu › ta.

Tiếp theo: Bài 3 — Tín hiệu, mũi tên, tô màu