Mẫu dao động và mẫu nến
- 🇻🇳 Tiếng Việt
- 🇬🇧 English
- 🇰🇷 한국어
- 🇨🇳 中文
Chỉ báo dao động (RSI, Stochastic, MACD, CCI…), phân kỳ, và nhận diện mẫu nến.
RSI + tín hiệu
Mẫu RSI + tín hiệu của thư viện: mức quá mua / quá bán, dấu khi RSI cắt lên quá bán / cắt xuống quá mua, hai điều kiện cảnh báo.
indicator({
name: "RSI + tín hiệu",
pane: "new",
scale: { range: [0, 100], levels: [30, 70] },
params: {
len: param.int(14, { min: 2, max: 50, label: "Chu kỳ" }),
upper: param.int(70, { min: 50, max: 95, label: "Quá mua" }),
lower: param.int(30, { min: 5, max: 50, label: "Quá bán" }),
},
plot: (d, p) => {
const r = ta.rsi(d.close, p.len);
return {
RSI: line(r, { color: "accent" }),
"Quá mua": hline(p.upper, { color: "down", dash: "dash" }),
"Quá bán": hline(p.lower, { color: "up", dash: "dash" }),
"Cắt lên quá bán": shape(r.crossAbove(p.lower), { at: "below", shape: "triangleUp", color: "up" }),
"Cắt xuống quá mua": shape(r.crossBelow(p.upper), { at: "above", shape: "triangleDown", color: "down" }),
};
},
alerts: (d, p) => ({
"RSI cắt lên quá bán": ta.rsi(d.close, p.len).crossAbove(p.lower),
"RSI cắt xuống quá mua": ta.rsi(d.close, p.len).crossBelow(p.upper),
}),
});
RSI có đường trung bình và phân kỳ
RSI kèm đường trung bình của RSI, và đánh dấu phân kỳ (giá lập đáy thấp hơn mà RSI lập đáy cao hơn — và ngược lại) bằng chỉ báo divergence của thư viện. Phân kỳ chỉ xác nhận sau right nến kể từ đáy / đỉnh.
indicator({
name: "RSI, trung bình và phân kỳ",
scale: { range: [0, 100], levels: [30, 50, 70] },
params: {
len: param.int(14, { min: 2, max: 50, label: "Chu kỳ RSI" }),
ma: param.int(9, { min: 2, max: 50, label: "Trung bình RSI" }),
},
plot: (d, p) => {
const r = ta.rsi(d.close, p.len);
const pk = ta.run("divergence", { osc: "rsi", n: p.len, left: 5, right: 5 });
return {
RSI: line(r, { color: "accent", width: 2 }),
"TB RSI": line(ta.sma(r, p.ma), { color: "ref" }),
"Phân kỳ tăng": shape(pk.bull.gt(0), { at: "bottom", shape: "triangleUp", color: "up", text: "PK" }),
"Phân kỳ giảm": shape(pk.bear.gt(0), { at: "top", shape: "triangleDown", color: "down", text: "PK" }),
};
},
alerts: (d, p) => {
const pk = ta.run("divergence", { osc: "rsi", n: p.len, left: 5, right: 5 });
return { "Phân kỳ tăng RSI": pk.bull.gt(0), "Phân kỳ giảm RSI": pk.bear.gt(0) };
},
});
Stochastic RSI
indicator({
name: "Stochastic RSI",
scale: { range: [0, 100], levels: [20, 80] },
plot: () => {
const s = ta.run("stoch-rsi", { rsi: 14, stoch: 14, k: 3, d: 3 });
return {
K: line(s.k, { color: "accent" }),
D: line(s.d, { color: "ref" }),
"Cắt lên dưới 20": shape(s.k.crossAbove(s.d).and(s.k.lt(20)), { at: "bottom", shape: "triangleUp", color: "up" }),
"Cắt xuống trên 80": shape(s.k.crossBelow(s.d).and(s.k.gt(80)), { at: "top", shape: "triangleDown", color: "down" }),
};
},
});
ta.run không cần d — nó tự lấy nến của biểu đồ (hoặc dữ liệu ở đối số thứ ba).
MACD hai màu
Mẫu MACD hai màu của thư viện.
indicator({
name: "MACD hai màu",
pane: "new",
params: {
fast: param.int(12, { min: 2, max: 50, label: "Nhanh" }),
slow: param.int(26, { min: 5, max: 100, label: "Chậm" }),
signal: param.int(9, { min: 2, max: 50, label: "Tín hiệu" }),
},
plot: (d, p) => {
const m = ta.macd(d.close, p.fast, p.slow, p.signal);
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" }),
"Cắt lên": shape(m.macd.crossAbove(m.signal), { at: "below", shape: "triangleUp", color: "up" }),
};
},
alerts: (d, p) => {
const m = ta.macd(d.close, p.fast, p.slow, p.signal);
return { "MACD cắt lên tín hiệu": m.macd.crossAbove(m.signal), "MACD cắt xuống tín hiệu": m.macd.crossBelow(m.signal) };
},
});
CCI với vùng ±100
indicator({
name: "CCI vùng ±100",
scale: { levels: [-100, 0, 100] },
params: { n: param.int(20, { min: 5, max: 100, label: "Chu kỳ" }) },
plot: (d, p) => {
const c = ta.cci(d, p.n);
return {
CCI: line(c, { color: "accent", colors: [{ when: c.gt(100), color: "up" }, { when: c.lt(-100), color: "down" }] }),
"+100": hline(100),
"-100": hline(-100),
"Vào vùng mạnh": shape(c.crossAbove(100), { at: "top", shape: "circle", color: "up", size: "s" }),
};
},
});
Williams %R
indicator({
name: "Williams %R",
scale: { range: [-100, 0], levels: [-80, -20] },
params: { n: param.int(14, { min: 5, max: 50, label: "Chu kỳ" }) },
plot: (d, p) => {
const w = ta.williamsR(d, p.n);
return {
"%R": line(w, { color: "accent" }),
"Thoát quá bán": shape(w.crossAbove(-80), { at: "bottom", shape: "triangleUp", color: "up" }),
"Thoát quá mua": shape(w.crossBelow(-20), { at: "top", shape: "triangleDown", color: "down" }),
};
},
});
Connors RSI
Connors RSI kết hợp RSI 3, RSI của chuỗi tăng / giảm liên tiếp và hạng phần trăm của thay đổi giá — hay dùng cho chiến lược hồi về ngắn hạn.
indicator({
name: "Connors RSI",
scale: { range: [0, 100], levels: [10, 90] },
plot: () => {
const c = ta.run("crsi", { rsi: 3, streak: 2, rank: 100 }).v;
return {
CRSI: line(c, { color: "accent" }),
"Dưới 10": bgcolor(c.lt(10), { color: "up", opacity: 0.15 }),
"Trên 90": bgcolor(c.gt(90), { color: "down", opacity: 0.15 }),
};
},
});
Mẫu nến dựng sẵn
Chỉ báo candle-patterns của thư viện nhận diện hơn 30 mẫu nến (búa, người treo cổ, nhấn chìm, sao mai, sao hôm, ba chàng lính, doji…). Đầu ra bull / bear / neutral khác 0 ở nến có mẫu tăng / giảm / trung tính.
indicator({
name: "Mẫu nến (thư viện)",
pane: "price",
plot: (d) => {
const m = ta.run("candle-patterns", {});
const xuHuongTang = d.close.gt(ta.sma(d.close, 50));
return {
"Mẫu tăng": shape(m.bull.gt(0), { at: "below", shape: "triangleUp", color: "up", size: "s" }),
"Mẫu giảm": shape(m.bear.gt(0), { at: "above", shape: "triangleDown", color: "down", size: "s" }),
"Mẫu tăng trong xu hướng tăng": barcolor(m.bull.gt(0).and(xuHuongTang), { color: "ai" }),
};
},
alerts: () => ({ "Có mẫu nến tăng": ta.run("candle-patterns", {}).bull.gt(0) }),
});
Doji, búa, sao băng tự định nghĩa
Tự viết định nghĩa để kiểm soát ngưỡng: doji (thân ≤ 10 % biên độ), búa (bóng dưới ≥ 2 thân, bóng trên nhỏ, sau 3 nến giảm), sao băng (ngược lại).
indicator({
name: "Doji, búa, sao băng",
pane: "price",
params: { than: param.pct(0.1, { min: 0.02, max: 0.3, label: "Thân doji tối đa" }) },
plot: (d, p) => {
const bienDo = d.high.sub(d.low);
const than = d.close.sub(d.open).abs();
const tren = d.high.sub(d.open.max(d.close));
const duoi = d.open.min(d.close).sub(d.low);
const giam3 = d.close.lt(d.close.shift(3));
const tang3 = d.close.gt(d.close.shift(3));
return {
Doji: shape(than.lte(bienDo.mul(p.than)).and(bienDo.gt(0)), { at: "above", char: "+", color: "textMuted" }),
"Búa": shape(duoi.gte(than.mul(2)).and(tren.lte(than.mul(0.5))).and(than.gt(0)).and(giam3), { at: "below", char: "B", color: "up" }),
"Sao băng": shape(tren.gte(than.mul(2)).and(duoi.lte(than.mul(0.5))).and(than.gt(0)).and(tang3), { at: "above", char: "S", color: "down" }),
};
},
});
Nến trong / nến bao (inside bar, outside bar)
indicator({
name: "Nến trong và nến bao",
pane: "price",
plot: (d) => {
const trong = d.high.lte(d.high.shift(1)).and(d.low.gte(d.low.shift(1)));
const bao = d.high.gt(d.high.shift(1)).and(d.low.lt(d.low.shift(1)));
const pha = d.close.gt(d.high.shift(1)).and(trong.shift(1));
return {
"Nến trong": barcolor(trong, { color: "ref" }),
"Nến bao": barcolor(bao, { color: "ceil" }),
"Phá lên sau nến trong": shape(pha, { at: "below", shape: "arrowUp", color: "up" }),
};
},
alerts: (d) => ({
"Phá lên sau nến trong": d.close.gt(d.high.shift(1)).and(d.high.shift(1).lte(d.high.shift(2))).and(d.low.shift(1).gte(d.low.shift(2))),
}),
});