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

Bài 1 — Đường trung bình trên giá

Bạn sẽ học: vẽ đường trung bình đơn giản (SMA) và hàm mũ (EMA), chỉnh màu, độ dày, nét; đổi màu đường theo điều kiện; tô vùng giữa hai đường.

Cần biết trước: Script đầu tiên.

1.1. SMA và EMA​

Đường trung bình làm mượt giá để thấy xu hướng. SMA (trung bình cộng) coi mọi nến như nhau; EMA (trung bình hàm mũ) coi nến gần đây nặng hơn nên bám giá nhanh hơn.

indicator({
name: "SMA và EMA 20",
pane: "price",
plot: (d) => ({
"SMA 20": line(ta.sma(d.close, 20), { color: "ref" }),
"EMA 20": line(ta.ema(d.close, 20), { color: "accent" }),
}),
});
  • ta.sma(chuỗi, n) và ta.ema(chuỗi, n) nhận một chuỗi và chu kỳ n. Chuỗi thường là d.close, nhưng có thể là bất kỳ chuỗi nào: ta.sma(d.volume, 20) là khối lượng trung bình, ta.ema(d.hl2, 10) là EMA của giá giữa nến.
  • Cùng họ còn ta.wma (trọng số tuyến tính), ta.hma (Hull — rất ít trễ), ta.rma (làm trơn Wilder, dùng trong RSI, ATR). Hơn chục loại khác (KAMA, ALMA, T3, McGinley…) gọi qua ta.run — xem Tham chiếu › ta.

1.2. Màu, độ dày, nét​

indicator({
name: "Ba đường trung bình",
pane: "price",
plot: (d) => ({
"MA 20": line(ta.sma(d.close, 20), { color: "accent", width: 1 }),
"MA 50": line(ta.sma(d.close, 50), { color: "ref", width: 2 }),
"MA 200": line(ta.sma(d.close, 200), { color: "ceil", width: 3, dash: "dash" }),
}),
});
Tuỳ chọnGiá trịNghĩa
color"up", "down", "accent", "ref", "ceil", "floor", "ai", "text", "textMuted", "palette.0"…"palette.5", "#RRGGBB"Màu. Màu tên theo giao diện (đổi theo nền sáng / tối): tăng xanh, giảm đỏ, nhấn xanh dương, tham chiếu vàng, trần tím, sàn xanh lơ. Bỏ trống: màu tự chọn theo thứ tự
widthsố, mặc định 1,5Độ dày (điểm ảnh)
dash"solid", "dash", "dot"Nét liền / gạch / chấm
opacity0…1Độ đục (1 = đục hẳn)
steptrueVẽ bậc thang (hợp với mức hỗ trợ, trạng thái)
points"circles", "cross"Vẽ chấm / chữ thập tại từng nến thay vì nối
offsetsố nếnDời đường khi vẽ (dương sang phải) — chỉ ảnh hưởng hình, không ảnh hưởng tín hiệu
hiddentrueẨn mặc định (vẫn có trong chú giải để bật lại)

Bảng màu đầy đủ: Tham chiếu › Đầu ra.

1.3. Đổi màu theo điều kiện​

colors là danh sách luật { when: điều kiện, color: màu }. Ở mỗi nến, luật đầu tiên có điều kiện đúng quyết định màu; không luật nào đúng thì dùng color.

indicator({
name: "EMA đổi màu theo giá",
pane: "price",
params: { len: param.int(20, { min: 2, max: 200, label: "Chu kỳ" }) },
plot: (d, p) => {
const ema = ta.ema(d.close, p.len);
return {
EMA: line(ema, {
color: "textMuted",
width: 2,
colors: [
{ when: d.close.gt(ema), color: "up" },
{ when: d.close.lt(ema), color: "down" },
],
}),
};
},
});

Đường xanh khi giá đóng cửa trên EMA, đỏ khi dưới, xám khi bằng. Luật màu dùng được cho line, hist, area, shape, bgcolor, barcolor.

1.4. Tô vùng giữa hai đường​

fill("Tên đầu ra A", "Tên đầu ra B", { … }) tô vùng giữa hai đầu ra theo tên (tên là khoá trong plot). below là màu khi A nằm dưới B — màu tự đổi tại điểm cắt.

indicator({
name: "Dải EMA 20 / 50",
pane: "price",
plot: (d) => ({
"EMA 20": line(ta.ema(d.close, 20), { color: "up" }),
"EMA 50": line(ta.ema(d.close, 50), { color: "down" }),
"Vùng": fill("EMA 20", "EMA 50", { color: "up", below: "down", opacity: 0.12 }),
}),
});
  • fill đặt sau hai đầu ra nó nhắc tên.
  • Muốn một dải có cả hai đường biên trong một đầu ra, dùng band(trên, dưới, { color, fill }) — như kênh trung bình của giá cao nhất và thấp nhất:
indicator({
name: "Kênh trung bình cao / thấp",
pane: "price",
params: { len: param.int(10, { min: 2, max: 100, label: "Chu kỳ" }) },
plot: (d, p) => ({
"Kênh": band(ta.sma(d.high, p.len), ta.sma(d.low, p.len), { color: "accent", opacity: 0.1 }),
"Giữa": line(ta.sma(d.hl2, p.len), { color: "accent", dash: "dot" }),
}),
});

Dải EMA 20 / 50 tô xanh khi EMA 20 trên EMA 50, đỏ khi dưới

1.5. Đường trung bình dời (displaced)​

Một số phương pháp dời đường trung bình sang phải vài nến để lọc nhiễu. offset chỉ dời hình vẽ:

indicator({
name: "SMA 20 dời 5 nến",
pane: "price",
plot: (d) => ({
"SMA 20 dời": line(ta.sma(d.close, 20), { color: "ai", offset: 5 }),
}),
});
offset không làm tín hiệu nhìn trước

Muốn dùng giá trị của 5 nến trước để tính (ví dụ so giá với đường đã dời), dùng ta.sma(d.close, 20).shift(5) — đó mới là chuỗi dời thật. offset âm (dời trái) chỉ là hình vẽ, không mang dữ liệu tương lai vào tín hiệu.

Bài tập​

  1. Vẽ đường Hull MA 55 dày 2, màu tím trần.
  2. Vẽ EMA 34 của giá đóng cửa, tô xanh khi EMA đi lên so với nến trước, đỏ khi đi xuống.
  3. Vẽ "dải Guppy rút gọn": EMA 3, 5, 8 màu xanh, EMA 30, 35, 40 màu đỏ, nét mảnh.
Lời giải 1
indicator({
name: "Hull MA 55",
pane: "price",
plot: (d) => ({ "HMA 55": line(ta.hma(d.close, 55), { color: "ceil", width: 2 }) }),
});
Lời giải 2
indicator({
name: "EMA 34 theo chiều",
pane: "price",
plot: (d) => {
const ema = ta.ema(d.close, 34);
return {
"EMA 34": line(ema, {
width: 2,
colors: [
{ when: ema.gt(ema.shift(1)), color: "up" },
{ when: ema.lt(ema.shift(1)), color: "down" },
],
}),
};
},
});

ema.shift(1) là EMA của nến trước, nên ema.gt(ema.shift(1)) là "EMA đang đi lên".

Lời giải 3
indicator({
name: "Guppy rút gọn",
pane: "price",
plot: (d) => ({
"EMA 3": line(ta.ema(d.close, 3), { color: "up", width: 1 }),
"EMA 5": line(ta.ema(d.close, 5), { color: "up", width: 1 }),
"EMA 8": line(ta.ema(d.close, 8), { color: "up", width: 1 }),
"EMA 30": line(ta.ema(d.close, 30), { color: "down", width: 1 }),
"EMA 35": line(ta.ema(d.close, 35), { color: "down", width: 1 }),
"EMA 40": line(ta.ema(d.close, 40), { color: "down", width: 1 }),
}),
});

Bản đầy đủ 12 đường có sẵn: ta.run("gmma", {}) — xem Tham chiếu › ta.run.

Tiếp theo: Bài 2 — Chỉ báo ngăn riêng và mức