Chỉ báo ta.*
- 🇻🇳 Tiếng Việt
- 🇬🇧 English
- 🇰🇷 한국어
- 🇨🇳 中文
ta là bộ chỉ báo kỹ thuật dựng sẵn, cùng công thức trên biểu đồ, máy chủ cảnh báo và Quant AI Studio. Có hai lớp:
- 25 hàm gọi trực tiếp (
ta.ema,ta.rsi,ta.macd…) — công thức của Quant AI Studio: EMA khởi tạo bằng SMA, RSI / ATR / ADX làm trơn Wilder. ta.run(id, …)— gọi theo id 162 chỉ báo của thư viện chỉ báo FireAnt Chart (cùng gi á trị với chỉ báo dựng sẵn trên biểu đồ): KAMA, Vortex, Aroon, Fisher, Connors RSI, Klinger, mẫu nến, phân kỳ, harmonic… — danh mục.
Hàm nhận một chuỗi (x: d.close, d.hl2, chuỗi tự tính…) hoặc cả d (khi cần cao, thấp, đóng, khối lượng). Chỉ báo đệ quy (EMA, RSI, ATR…) cần đoạn khởi động khoảng 20 × chu kỳ nến để ổn định — biểu đồ tự nạp thêm.
Trung bình
| Hàm | Kết quả | Ghi chú |
|---|---|---|
ta.sma(x, n = 20) | Trung bình cộng n nến | = x.rolling(n).mean() |
ta.ema(x, n = 20) | Trung bình hàm mũ, hệ số 2 ÷ (n + 1) | Khởi tạo bằng SMA n giá trị đầu |
ta.wma(x, n = 20) | Trung bình trọng số tuyến tính (nến gần nặng hơn) | |
ta.hma(x, n = 20) | Hull MA: wma(2 × wma(x, n/2) − wma(x, n), √n) | Rất ít trễ |
ta.rma(x, n = 14) | Làm trơn Wilder, hệ số 1 ÷ n | Dùng trong RSI, ATR, ADX |
indicator({
name: "Năm đường trung bình",
pane: "price",
plot: (d) => ({
SMA: line(ta.sma(d.close, 30), { color: "ref" }),
EMA: line(ta.ema(d.close, 30), { color: "accent" }),
WMA: line(ta.wma(d.close, 30), { color: "ceil" }),
HMA: line(ta.hma(d.close, 30), { color: "ai" }),
RMA: line(ta.rma(d.close, 30), { color: "floor" }),
}),
});
Động lượng, dao động
| Hàm | Kết quả | Thang |
|---|---|---|
ta.rsi(x, n = 14) | RSI (Wilder) | 0–100 |
ta.roc(x, n = 12) | % thay đổi so với n nến trước | % (5 = 5 %) |
ta.slope(x, n = 20) | Độ dốc đường hồi quy tuyến tính n nến (giá mỗi nến) | đơn vị của x |
ta.macd(x, fast = 12, slow = 26, signal = 9) | { macd, signal, hist }: macd = EMA nhanh − EMA chậm; signal = EMA(signal) của macd; hist = macd − signal | đơn vị giá |
ta.stoch(d, k = 14, dN = 3, smooth = 3) | { k, d }: %K = (đóng − thấp nhất k) ÷ (cao nhất k − thấp nhất k) × 100, làm mượt smooth; %D = SMA(dN) của %K | 0–100 |
ta.cci(d, n = 20) | CCI trên giá điển hình (hlc3) | quanh ±100 |
ta.williamsR(d, n = 14) | Williams %R | −100–0 |
ta.mfi(d, n = 14) | Money Flow Index (RSI có khối lượng) | 0–100 |
Xu hướng
| Hàm | Kết quả | Ghi chú |
|---|---|---|
ta.adx(d, n = 14) | { adx, plusDI, minusDI } | Wilder; ADX > 25 thường coi là có xu hướng. Độ dài DI, ADX khác nhau: ta.run("dmi", { di, adx }) |
ta.supertrend(d, n = 10, mult = 3) | { line, dir }: line mức Supertrend; dir 1 xu hướng tăng, −1 giảm | ATR Wilder n nến × mult |
ta.psar(d, step = 0.02, max = 0.2) | Parabolic SAR | |
ta.ichimoku(d, tenkan = 9, kijun = 26, spanB = 52) | { tenkan, kijun, spanA, spanB } tại nến hiện tại | Không dời mây về tương lai (dời là nhìn trước); muốn vẽ dời dùng offset của line |
Biến động, kênh
| Hàm | Kết quả | Ghi chú |
|---|---|---|
ta.atr(d, n = 14) | ATR (Wilder) | Đơn vị giá; ATR ÷ giá là biến động % |
ta.trueRange(d.high, d.low, d.close) | True range từng nến | Nến đầu NaN |
ta.bb(x, n = 20, k = 2) | { mid, upper, lower, pctB, width }: dải Bollinger; pctB = (x − dưới) ÷ (trên − dưới); width = (trên − dưới) ÷ giữa | Độ lệch chuẩn tổng thể |
ta.donchian(d, n = 20) | { upper, lower, mid }: cao / thấp nhất n nến (kể cả nến này) | Bứt phá: so với upper.shift(1) |
ta.keltner(d, n = 20, mult = 2, atrN = 10) | { mid, upper, lower }: EMA n ± mult × ATR(atrN) |
Khối lượng
| Hàm | Kết quả |
|---|---|
ta.obv(d) | On-Balance Volume — cộng dồn khối lượng có dấu theo chiều giá |
ta.vwap(d, n = 20) | VWAP trượt n nến: Σ(hlc3 × KL) ÷ Σ KL của n nến gần nhất. VWAP neo theo phiên: ta.run("vwap", {}).v |
ta.mfi(d, n = 14) | Money Flow Index (xem trên) |
indicator({
name: "Bộ ta.* dao động và khối lượng",
plot: (d) => {
const m = ta.macd(d.close);
const st = ta.stoch(d, 14, 3, 3);
const adx = ta.adx(d, 14);
return {
RSI: line(ta.rsi(d.close, 14), { pane: "Dao động 0–100" }),
"%K": line(st.k, { pane: "Dao động 0–100" }),
"%D": line(st.d, { pane: "Dao động 0–100", dash: "dash" }),
MFI: line(ta.mfi(d, 14), { pane: "Dao động 0–100" }),
ADX: line(adx.adx, { pane: "Dao động 0–100", width: 2 }),
"+DI": line(adx.plusDI, { pane: "Dao động 0–100", color: "up" }),
"-DI": line(adx.minusDI, { pane: "Dao động 0–100", color: "down" }),
"%R": line(ta.williamsR(d, 14), { pane: "Williams %R" }),
CCI: line(ta.cci(d, 20), { pane: "CCI" }),
ROC: line(ta.roc(d.close, 12), { pane: "ROC / độ dốc" }),
"Độ dốc": line(ta.slope(d.close, 20), { pane: "ROC / độ dốc" }),
"MACD hist": hist(m.hist, { pane: "MACD" }),
MACD: line(m.macd, { pane: "MACD" }),
"Tín hiệu": line(m.signal, { pane: "MACD" }),
OBV: line(ta.obv(d), { pane: "Khối lượng", format: "compact" }),
"VWAP 20 / giá": line(ta.vwap(d, 20).div(d.close), { pane: "VWAP" }),
};
},
});
indicator({
name: "Bộ ta.* trên giá",
pane: "price",
plot: (d) => {
const bb = ta.bb(d.close, 20, 2);
const dc = ta.donchian(d, 20);
const kc = ta.keltner(d, 20, 2, 10);
const st = ta.supertrend(d, 10, 3);
const ich = ta.ichimoku(d, 9, 26, 52);
return {
Bollinger: band(bb.upper, bb.lower, { color: "accent", opacity: 0.06 }),
Donchian: band(dc.upper, dc.lower, { color: "ref", opacity: 0.04 }),
Keltner: band(kc.upper, kc.lower, { color: "ai", opacity: 0.04 }),
Supertrend: line(st.line, { colors: [{ when: st.dir.gt(0), color: "up" }, { when: st.dir.lt(0), color: "down" }] }),
PSAR: line(ta.psar(d, 0.02, 0.2), { points: "circles", color: "textMuted" }),
Tenkan: line(ich.tenkan, { color: "accent", hidden: true }),
Kijun: line(ich.kijun, { color: "ref", hidden: true }),
"Mây": band(ich.spanA, ich.spanB, { color: "up", opacity: 0.05, hidden: true }),
"ATR %": line(ta.atr(d, 14).div(d.close).mul(100), { pane: "ATR %" }),
"True range": hist(ta.trueRange(d.high, d.low, d.close), { pane: "ATR %", color: "textMuted", hidden: true }),
};
},
});
Mẫu hình giá: ta.patterns
ta.patterns(d, { th?, only?, minVol?, near?, recent? }) nhận diện 8 mẫu hình giá kinh điển (cốc tay cầm, hai đáy, tam giác tăng, vai đầu vai ngược, cờ tăng, nền co hẹp dần VCP, hai đỉnh, vai đầu vai), không nhìn trước: đỉnh / đáy theo ZigZag chỉ được biết khi giá đã quay đầu đủ ngưỡng.
| Tuỳ chọn | Nghĩa | Mặc định |
|---|---|---|
th | Ngưỡng ZigZag xác nhận đỉnh / đáy (tỷ lệ) | 0,08 |
only | Chỉ quét các mẫu: "cup", "doubleBottom", "ascTriangle", "invHeadShoulders", "flag", "vcp", "doubleTop", "headShoulders" | tất cả |
minVol | Phá vỡ của mẫu tăng chỉ tính khi KL ≥ minVol × TB 20 | 1,5 |
near | "Sát điểm phá vỡ": cách mức tối đa near | 0,05 |
recent | "Vừa phá vỡ": trong recent nến gần nhất | 5 |
| Trả về | Nội dung |
|---|---|
breakout | 1 ở nến phá vỡ đủ khối lượng (mẫu giảm: nến thủng) |
pattern | Mã số mẫu đang có (0 = cup … 7 = headShoulders; NaN khi không có); tên: names[k] |
stage | 0 không có, 1 sát điểm phá vỡ, 2 vừa phá vỡ; tên: stages[k] |
level, distance | Mức phá vỡ; đóng cửa ÷ mức − 1 |
since, volRatio | Số nến từ khi phá vỡ; KL nến phá vỡ ÷ TB 20 |
indicator({
name: "Mẫu hình giá phá vỡ",
pane: "price",
plot: (d) => {
const pt = ta.patterns(d, { th: 0.06, minVol: 1.2 });
return {
"Mức phá vỡ": line(pt.level, { color: "ref", dash: "dash", step: true }),
"Phá vỡ": shape(pt.breakout, { at: "below", shape: "flag", color: "up" }),
"Sát điểm phá vỡ": bgcolor(pt.stage.eq(1), { color: "ref", opacity: 0.06 }),
};
},
});
ta.zigzag(d, th) (danh sách đỉnh / đáy tính ngay) chỉ có trong Studio; trên biểu đồ dùng ta.run("zigzag", { deviation, depth }) — đường ZigZag vẽ lại đoạn cuối khi có đỉnh / đáy mới, chỉ dùng để nhìn, không làm tín hiệu.
ta.run — mọi chỉ báo của thư viện
ta.run(id, thamSo = {}, nguon?) → { tênĐầuRa: chuỗi, … }
| Đối số | Nghĩa |
|---|---|
id | Id chỉ báo trong danh mục, ví dụ "kama", "dmi", "candle-patterns". Sai id: ta.run: không có chỉ báo "…" trong thư viện ta |
thamSo | Đối tượng tham số theo tên của chỉ báo; thiếu thì dùng mặc định. Tham số dạng danh sách (periods: [20, 50]) cho nhiều đường |
nguon | Tuỳ chọn. d.tf("1W") → tính trên nến tuần; một chuỗi → thay nguồn giá của chỉ báo (chỉ chỉ báo có tham số source) |
Kết quả là đối tượng các đầu ra theo khoá trong cột Đầu ra của danh mục. Khoá là số ("0", "1") thì đọc bằng ngoặc vuông: ta.run("ma", { periods: [20, 50] })["1"].
indicator({
name: "Gọi chỉ báo thư viện bằng ta.run",
plot: (d) => {
const dmi = ta.run("dmi", { di: 14, adx: 20 });
const ma = ta.run("ma", { periods: [20, 50] });
const kama = ta.run("kama", { n: 10 });
const rsiHl2 = ta.run("rsi", { periods: [14] }, d.hl2);
const ichTuan = ta.run("ichimoku", {}, d.tf("1W"));
const nen = ta.run("candle-patterns", {});
return {
ADX: line(dmi.adx, { pane: "DMI" }),
"+DI": line(dmi.plus, { pane: "DMI", color: "up" }),
"-DI": line(dmi.minus, { pane: "DMI", color: "down" }),
"MA 20": line(ma["0"], { pane: "price", color: "accent" }),
"MA 50": line(ma["1"], { pane: "price", color: "ref" }),
KAMA: line(kama.kama, { pane: "price", color: "ai" }),
"RSI của HL2": line(rsiHl2["0"], { pane: "RSI" }),
"Kijun tuần": line(ichTuan.base, { pane: "price", color: "ceil", step: true }),
"Nến tăng": shape(nen.bull.gt(0), { pane: "price", at: "below", shape: "circle", color: "up", size: "s" }),
};
},
});
Các chỉ báo mẫu hình (candle-patterns, price-patterns, harmonic, divergence, fractal, script:wyckoff…) trả đầu ra dạng sự kiện: khác 0 ở nến có sự kiện (thường là số mẫu / mức độ), 0 hoặc NaN ở nến khác. Dùng .gt(0) hoặc .notNaN() để thành điều kiện.