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

Mẫu xu hướng

Chỉ báo theo xu hướng: đường trung bình, dải, Supertrend, Ichimoku, ADX, SAR, hồi quy, xu hướng nhiều khung. Sao chép, dán vào trình soạn, Thêm vào biểu đồ, rồi chỉnh tham số.

Dải EMA Fibonacci​

Năm EMA 8 – 13 – 21 – 34 – 55. Dải xếp đúng thứ tự (ngắn trên dài) và toả rộng là xu hướng tăng khoẻ; xoắn vào nhau là đi ngang.

indicator({
name: "Dải EMA Fibonacci",
pane: "price",
plot: (d) => {
const e = [8, 13, 21, 34, 55].map((n) => ta.ema(d.close, n));
const tang = e[0].gt(e[1]).and(e[1].gt(e[2])).and(e[2].gt(e[3])).and(e[3].gt(e[4]));
const giam = e[0].lt(e[1]).and(e[1].lt(e[2])).and(e[2].lt(e[3])).and(e[3].lt(e[4]));
return {
"EMA 8": line(e[0], { color: "palette.0", width: 1 }),
"EMA 13": line(e[1], { color: "palette.1", width: 1 }),
"EMA 21": line(e[2], { color: "palette.2", width: 1 }),
"EMA 34": line(e[3], { color: "palette.3", width: 1 }),
"EMA 55": line(e[4], { color: "palette.4", width: 2 }),
"Xếp tăng": bgcolor(tang, { color: "up", opacity: 0.06 }),
"Xếp giảm": bgcolor(giam, { color: "down", opacity: 0.06 }),
};
},
});

Giao cắt vàng / giao cắt tử thần​

MA 50 cắt lên MA 200 (giao cắt vàng) và cắt xuống (giao cắt tử thần), có cảnh báo.

indicator({
name: "Giao cắt vàng / tử thần",
pane: "price",
params: {
fast: param.int(50, { min: 10, max: 100, label: "MA nhanh" }),
slow: param.int(200, { min: 100, max: 300, label: "MA chậm" }),
},
plot: (d, p) => {
const f = ta.sma(d.close, p.fast);
const s = ta.sma(d.close, p.slow);
return {
[`MA ${p.fast}`]: line(f, { color: "ref", width: 2 }),
[`MA ${p.slow}`]: line(s, { color: "ceil", width: 2 }),
"Giao cắt vàng": shape(f.crossAbove(s), { at: "below", shape: "label", text: "Vàng", color: "up" }),
"Giao cắt tử thần": shape(f.crossBelow(s), { at: "above", shape: "label", text: "Tử thần", color: "down" }),
};
},
alerts: (d, p) => ({
"Giao cắt vàng": ta.sma(d.close, p.fast).crossAbove(ta.sma(d.close, p.slow)),
"Giao cắt tử thần": ta.sma(d.close, p.fast).crossBelow(ta.sma(d.close, p.slow)),
}),
});

Supertrend hai màu​

Mẫu Supertrend hai màu của thư viện: đường xanh khi xu hướng tăng, đỏ khi giảm, mũi tên khi đổi chiều.

indicator({
name: "Supertrend hai màu",
pane: "price",
params: {
n: param.int(10, { min: 3, max: 50, label: "Chu kỳ ATR" }),
mult: param.num(3, { min: 1, max: 6, step: 0.5, label: "Hệ số ATR" }),
},
plot: (d, p) => {
const st = ta.supertrend(d, p.n, p.mult);
return {
"Xu hướng tăng": line(st.line.where(st.dir.gt(0)), { color: "up", width: 2 }),
"Xu hướng giảm": line(st.line.where(st.dir.lt(0)), { color: "down", width: 2 }),
"Đảo lên": shape(st.dir.crossAbove(0), { at: "below", shape: "arrowUp", color: "up" }),
"Đảo xuống": shape(st.dir.crossBelow(0), { at: "above", shape: "arrowDown", color: "down" }),
};
},
alerts: (d, p) => {
const st = ta.supertrend(d, p.n, p.mult);
return { "Supertrend đảo lên": st.dir.crossAbove(0), "Supertrend đảo xuống": st.dir.crossBelow(0) };
},
});

st.line.where(st.dir.gt(0)) giữ đường ở nến xu hướng tăng, để trống ở nến khác — hai đầu ra ghép lại thành một đường hai màu.

Mây Ichimoku có dời​

Tenkan, Kijun, mây Senkou A / B vẽ dời 26 nến về phía trước như cách đọc truyền thống (offset chỉ dời hình; tín hiệu dùng giá trị chưa dời nên không nhìn trước), và đường Chikou (giá dời lùi).

indicator({
name: "Ichimoku có dời",
pane: "price",
params: { kijunN: param.int(26, { min: 10, max: 60, label: "Kijun / độ dời" }) },
plot: (d, p) => {
const ich = ta.ichimoku(d, 9, p.kijunN, 52);
return {
Tenkan: line(ich.tenkan, { color: "accent" }),
Kijun: line(ich.kijun, { color: "down" }),
"Senkou A": line(ich.spanA, { color: "up", offset: p.kijunN, opacity: 0.6 }),
"Senkou B": line(ich.spanB, { color: "down", offset: p.kijunN, opacity: 0.6 }),
"Mây": fill("Senkou A", "Senkou B", { color: "up", below: "down", opacity: 0.1 }),
Chikou: line(d.close, { color: "textMuted", offset: -p.kijunN, hidden: true }),
"Giá trên mây": shape(d.close.crossAbove(ich.spanA.shift(p.kijunN).max(ich.spanB.shift(p.kijunN))), { at: "below", shape: "triangleUp", color: "up" }),
};
},
});

"Giá trên mây" so giá với mây đang hiện ở nến này — tức giá trị mây tính từ 26 nến trước (shift(p.kijunN)).

Sức mạnh xu hướng ADX / DMI​

ADX trên 25 là có xu hướng; +DI trên −DI là xu hướng tăng. Tô nền theo trạng thái.

indicator({
name: "ADX / DMI có trạng thái",
scale: { levels: [20, 25, 40] },
params: {
n: param.int(14, { min: 5, max: 50, label: "Chu kỳ" }),
nguong: param.int(25, { min: 10, max: 50, label: "Ngưỡng có xu hướng" }),
},
plot: (d, p) => {
const a = ta.adx(d, p.n);
const coXuHuong = a.adx.gt(p.nguong);
return {
ADX: line(a.adx, { color: "text", width: 2 }),
"+DI": line(a.plusDI, { color: "up" }),
"-DI": line(a.minusDI, { color: "down" }),
"Tăng có xu hướng": bgcolor(coXuHuong.and(a.plusDI.gt(a.minusDI)), { color: "up", opacity: 0.08 }),
"Giảm có xu hướng": bgcolor(coXuHuong.and(a.minusDI.gt(a.plusDI)), { color: "down", opacity: 0.08 }),
};
},
alerts: (d, p) => ({ "ADX vượt ngưỡng": ta.adx(d, p.n).adx.crossAbove(p.nguong) }),
});

Parabolic SAR và điểm đảo chiều​

indicator({
name: "Parabolic SAR",
pane: "price",
params: {
step: param.num(0.02, { min: 0.005, max: 0.1, step: 0.005, label: "Bước" }),
max: param.num(0.2, { min: 0.1, max: 0.5, step: 0.05, label: "Tối đa" }),
},
plot: (d, p) => {
const sar = ta.psar(d, p.step, p.max);
const duoiGia = sar.lt(d.close);
return {
SAR: line(sar, { points: "circles", colors: [{ when: duoiGia, color: "up" }], color: "down" }),
"Đảo lên": shape(duoiGia.and(duoiGia.shift(1).fillna(1).not()), { at: "below", shape: "arrowUp", color: "up" }),
"Đảo xuống": shape(duoiGia.not().and(duoiGia.shift(1).fillna(0)), { at: "above", shape: "arrowDown", color: "down" }),
};
},
});

Kênh hồi quy tuyến tính​

Đường hồi quy 100 nến và kênh ± 2 độ lệch chuẩn (chỉ báo linreg-channel của thư viện), kèm độ dốc để biết xu hướng mạnh hay yếu.

indicator({
name: "Kênh hồi quy",
pane: "price",
params: {
n: param.int(100, { min: 20, max: 300, label: "Số nến" }),
dev: param.num(2, { min: 1, max: 4, step: 0.5, label: "Độ lệch chuẩn" }),
},
plot: (d, p) => {
const k = ta.run("linreg-channel", { n: p.n, dev: p.dev });
const doc = ta.slope(d.close, p.n).div(d.close).mul(100);
return {
"Kênh": band(k.upper, k.lower, { color: "accent", opacity: 0.06 }),
"Hồi quy": line(k.mid, { color: "accent", dash: "dash" }),
"Độ dốc %/nến": line(doc, { pane: "Độ dốc", color: "ai", format: "number" }),
"0": hline(0, { pane: "Độ dốc" }),
};
},
});

Aroon​

Aroon Up / Down đo số nến kể từ đỉnh / đáy n nến. Up trên 70 và Down dưới 30 là xu hướng tăng rõ.

indicator({
name: "Aroon",
scale: { range: [0, 100], levels: [30, 70] },
params: { n: param.int(25, { min: 5, max: 100, label: "Chu kỳ" }) },
plot: (d, p) => {
const a = ta.run("aroon", { n: p.n });
return {
"Aroon Up": line(a.up, { color: "up" }),
"Aroon Down": line(a.down, { color: "down" }),
"Up cắt lên Down": shape(a.up.crossAbove(a.down), { at: "bottom", shape: "triangleUp", color: "up" }),
};
},
});

Kênh Donchian và bứt phá​

Mẫu Kênh Donchian và bứt phá của thư viện: kênh đỉnh / đáy n nến trước (không tính nến hiện tại) và cờ khi đóng cửa vượt đỉnh kênh.

indicator({
name: "Kênh Donchian và bứt phá",
pane: "price",
params: { n: param.int(20, { min: 5, max: 200, label: "Số nến" }) },
plot: (d, p) => {
const hi = d.high.highest(p.n).shift(1);
const lo = d.low.lowest(p.n).shift(1);
return {
Kênh: band(hi, lo, { color: "ref", opacity: 0.08 }),
"Đỉnh kênh": line(hi, { color: "up", dash: "dash" }),
"Đáy kênh": line(lo, { color: "down", dash: "dash" }),
"Bứt phá": shape(d.close.crossAbove(hi), { at: "below", shape: "flag", color: "up" }),
};
},
alerts: (d, p) => ({ "Giá vượt đỉnh kênh": d.close.crossAbove(d.high.highest(p.n).shift(1)) }),
});

Xu hướng ba khung: ngày, tuần, tháng​

Một ngăn nhỏ ba hàng chấm: xanh nếu giá trên EMA 20 của khung đó, đỏ nếu dưới. Đọc nhanh "các khung có đồng thuận không".

indicator({
name: "Xu hướng ba khung",
scale: { range: [0, 4] },
plot: (d) => {
const tren = (b) => b.close.gt(ta.ema(b.close, 20));
const hang = (dk, muc) => d.const(muc).where(dk.notNaN());
const ngay = tren(d);
const tuan = tren(d.tf("1W"));
const thang = tren(d.tf("1M"));
return {
"Ngày": shape(ngay.notNaN(), { at: "value", value: hang(ngay, 3), shape: "circle", size: "s", colors: [{ when: ngay, color: "up" }], color: "down" }),
"Tuần": shape(tuan.notNaN(), { at: "value", value: hang(tuan, 2), shape: "circle", size: "s", colors: [{ when: tuan, color: "up" }], color: "down" }),
"Tháng": shape(thang.notNaN(), { at: "value", value: hang(thang, 1), shape: "circle", size: "s", colors: [{ when: thang, color: "up" }], color: "down" }),
};
},
alerts: (d) => {
const tren = (b) => b.close.gt(ta.ema(b.close, 20));
return { "Cả ba khung trên EMA 20": tren(d).and(tren(d.tf("1W"))).and(tren(d.tf("1M"))) };
},
});

tren là một hàm của bạn nhận dữ liệu (ngày, tuần hay tháng) và trả điều kiện — viết một lần, dùng ba lần.