Bài 8 — Khung lớn hơn và dữ liệu khác
- 🇻🇳 Tiếng Việt
- 🇬🇧 English
- 🇰🇷 한국어
- 🇨🇳 中文
Bạn sẽ học: dùng nến tuần / tháng trên biểu đồ ngày, nến ngày trên biểu đồ phút, nến phút bên trong nến ngày, lịch phiên giao dịch, thông tin mã, nến của mã khác, dòng tiền chủ động; và biết dữ liệu nào có trên biểu đồ, dữ liệu nào chỉ có khi lọc rổ / trong Quant AI Studio.
8.1. Nến khung lớn: d.tf(...)
d.tf("1W") là nến tuần của cùng mã, gióng về từng nến của biểu đồ. Nó có đủ open, high, low, close, volume… và dùng với mọi hàm như d:
indicator({
name: "EMA 20 tuần trên biểu đồ ngày",
pane: "price",
plot: (d) => {
const tuan = d.tf("1W");
return {
"EMA 20 tuần": line(ta.ema(tuan.close, 20), { color: "ai", width: 2, step: true }),
"Đỉnh tuần trước": line(tuan.high, { color: "up", dash: "dot", step: true }),
"Đáy tuần trước": line(tuan.low, { color: "down", dash: "dot", step: true }),
};
},
});
Chỉ nến khung lớn đã đóng. Giá trị của một tuần chỉ xuất hiện từ nến ngày cuối cùng của tuần đó (khi tuần đã đóng). Trong tuần đang diễn ra, tuan.high là đỉnh của tuần trước — không phải đỉnh "từ đầu tuần tới giờ" (vốn còn thay đổi). Nhờ vậy tín hiệu không vẽ lại.
Muốn thấy cả nến khung lớn đang hình thành (đỉnh từ đầu tuần tới nến hiện tại), thêm { forming: true }:
indicator({
name: "Đỉnh / đáy tuần đang chạy",
pane: "price",
plot: (d) => {
const tuan = d.tf("1W", { forming: true });
return {
"Đỉnh từ đầu tuần": line(tuan.high, { color: "up", step: true }),
"Đáy từ đầu tuần": line(tuan.low, { color: "down", step: true }),
};
},
});
| Khung | Viết |
|---|---|
| Phút / giờ | "1", "5", "15", "30", "60", "240" |
| Ngày, tuần, tháng, quý, năm | "1D", "1W", "1M", "3M", "12M" |
Khung trong d.tf phải lớn hơn và là bội số của khung biểu đồ: trên biểu đồ ngày dùng được "1W", "1M"; trên biểu đồ 15 phút dùng được "30", "60", "1D", "1W"… Khung nhỏ hơn báo lỗi d.tf("60") nhỏ hơn khung đang tính 1D — chưa hỗ trợ — muốn đọc nến nhỏ hơn bên trong mỗi nến, dùng d.ltf (8.5).
8.2. Lọc tín hiệu ngày theo xu hướng tuần
Mẫu hay dùng: chỉ lấy tín hiệu của khung nhỏ khi khung lớn cùng chiều.
indicator({
name: "Tín hiệu ngày theo xu hướng tuần",
pane: "price",
plot: (d) => {
const tuan = d.tf("1W");
const tangTuan = tuan.close.gt(ta.ema(tuan.close, 10));
const nhanh = ta.ema(d.close, 10);
const cham = ta.ema(d.close, 30);
return {
"Xu hướng tuần tăng": bgcolor(tangTuan, { color: "up", opacity: 0.05 }),
"Mua (cùng xu hướng tuần)": shape(nhanh.crossAbove(cham).and(tangTuan), { at: "below", shape: "arrowUp", color: "up" }),
"Bỏ qua (ngược xu hướng)": shape(nhanh.crossAbove(cham).and(tangTuan.fillna(0).not()), { at: "below", shape: "circle", color: "textMuted", size: "s" }),
};
},
});

Chỉ báo của thư viện cũng tính được trên khung lớn: đối số thứ ba của ta.run là dữ liệu cần tính, ví dụ Supertrend tuần:
indicator({
name: "Supertrend tuần",
pane: "price",
plot: (d) => {
const st = ta.run("supertrend", { atr: 10, factor: 3 }, d.tf("1W"));
return {
"Supertrend tuần tăng": line(st.up, { color: "up", width: 2, step: true }),
"Supertrend tuần giảm": line(st.down, { color: "down", width: 2, step: true }),
};
},
});
8.3. Ghim khung tính của cả chỉ báo
resolution: "1W" trong khai báo làm cả chỉ báo tính trên nến tuần dù biểu đồ đang ở khung nào (miễn khung biểu đồ nhỏ hơn):
indicator({
name: "RSI tuần",
resolution: "1W",
scale: { range: [0, 100], levels: [30, 70] },
plot: (d) => ({ "RSI tuần": line(ta.rsi(d.close, 14), { color: "ai", step: true }) }),
});
8.4. Biểu đồ trong ngày: mức của phiên trước, lịch phiên
Trên biểu đồ phút / giờ, d.tf("1D") cho cao / thấp / đóng của phiên trước (phiên đã đóng):
// khung: 15 (script cho biểu đồ trong ngày)
indicator({
name: "Mức của phiên trước",
pane: "price",
plot: (d) => {
const ngay = d.tf("1D");
return {
"Cao phiên trước": line(ngay.high, { color: "up", dash: "dash", step: true }),
"Thấp phiên trước": line(ngay.low, { color: "down", dash: "dash", step: true }),
"Đóng phiên trước": line(ngay.close, { color: "ref", dash: "dot", step: true }),
};
},
});
d.session cho biết vị trí của nến trong phiên (giờ của sàn, UTC+7):
| Chuỗi | Giá trị |
|---|---|
d.session.first | 1 ở nến đầu tiên của mỗi phiên |
d.session.last | 1 ở nến cuối của phiên (nến ngày, nến 60 phút; khung nhỏ hơn dùng d.session.minute.gte(14 * 60 + 30)) |
d.session.minute | Phút trong ngày: 9:15 → 555, 14:30 → 870 |
d.session.weekday | Thứ trong tuần: 0 = Chủ nhật, 1 = thứ Hai … 6 = thứ Bảy |
d.session.day | Số ngày kể từ 01/01/1970 |
Ví dụ biên độ 30 phút đầu phiên (opening range): ghi nhớ cao / thấp của các nến trước 9:45 rồi kẻ hai mức tới hết phiên.
// khung: 15 (script cho biểu đồ trong ngày)
indicator({
name: "Biên độ 30 phút đầu phiên",
pane: "price",
series: (d) => ({ phut: d.session.minute, dau: d.session.first }),
state: () => ({ cao: NaN, thap: NaN }),
onBar: (ctx, s) => {
if (ctx.v.dau === 1) {
s.cao = ctx.high;
s.thap = ctx.low;
} else if (ctx.v.phut < 9 * 60 + 45) {
s.cao = Math.max(s.cao, ctx.high);
s.thap = Math.min(s.thap, ctx.low);
}
return { cao: s.cao, thap: s.thap };
},
plot: (d, p, o) => ({
"Cao 30 phút đầu": line(o.cao, { color: "up", step: true }),
"Thấp 30 phút đầu": line(o.thap, { color: "down", step: true }),
"Vượt lên": shape(d.close.crossAbove(o.cao).and(d.session.minute.gte(9 * 60 + 45)), { at: "below", shape: "triangleUp", color: "up" }),
}),
});
8.5. Nến nhỏ bên trong mỗi nến: d.ltf(...)
d.ltf("1") là các nến 1 phút nằm trong từng nến của biểu đồ (như request.security_lower_tf của Pine). Chuỗi của nó tính theo từng nến phút; muốn đưa về nến của biểu đồ thì gộp: m.sum(x), m.mean(x), m.max(x), m.min(x), m.first(x), m.last(x), m.count()… Ví dụ trên biểu đồ ngày, phần khối lượng của các phút tăng giá trong phiên: m.sum(m.volume.where(m.close.gt(m.open), 0)).div(m.sum(m.volume)).
Biểu đồ tự nạp nến phút cho script, tối đa khoảng 150.000 nến (với nến 1 phút ≈ 555 phiên gần nhất); nến ngày cũ hơn không có nến phút — phép gộp ra NaN. Đủ phép gộp và cách dùng trong onBar: Tham chiếu › d.ltf.
8.6. Thông tin mã và khung
| Thuộc tính | Nghĩa |
|---|---|
d.info.symbol | Mã đang tính ("FPT") |
d.info.exchange, d.info.type | Sàn, loại mã ("stock", "index", "future"…) khi biểu đồ có thông tin này |
d.resolution | Khung đang tính ("1D", "15"…) |
ctx.symbol, ctx.resolution | Như trên, trong onBar |
Dùng để đặt tên đầu ra hoặc chọn tham số theo khung, ví dụ chu kỳ dài hơn khi xem nến phút:
indicator({
name: "MA theo khung",
pane: "price",
plot: (d) => {
const trongNgay = !["1D", "1W", "1M"].includes(d.resolution);
const n = trongNgay ? 60 : 20;
return { [`MA ${n} (${d.resolution})`]: line(ta.sma(d.close, n), { color: "accent" }) };
},
});