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

Dữ liệu d

d là dữ liệu nến mà plot, signals, alerts, series, filter nhận ở đối số đầu tiên: nến của mã và khung đang xem trên biểu đồ. Mọi trường là chuỗi (trừ khi ghi khác). Đổi mã / khung trên biểu đồ là script tính lại trên dữ liệu mới.

NhómTrên biểu đồ
Giá, khối lượng, khung lớn, khung nhỏ, lịch phiên, thông tin mãCó
Mã khác: d.symbol, d.benchCó — biểu đồ tự nạp nến của mã đó
Dòng tiền chủ động: d.flow, d.footprintCó, Chuyên nghiệp
BCTC, vĩ mô, khối ngoại, định giá… (Quant)Không — có khi Lọc bằng script trên rổ có tên và trong Quant AI Studio

Giá, khối lượng, thời gian​

TrườngNghĩaĐơn vị
d.open, d.high, d.low, d.closeGiá mở cửa, cao nhất, thấp nhất, đóng cửa của nến (nến đang chạy: close = giá khớp gần nhất)nghìn đồng (chỉ số: điểm)
d.volumeKhối lượng khớp của nếncổ phiếu (hợp đồng)
d.hl2(cao + thấp) / 2giá
d.hlc3(cao + thấp + đóng) / 3 — giá điển hìnhgiá
d.ohlc4(mở + cao + thấp + đóng) / 4giá
d.timeMốc mở nến, mili-giây UTCms
d.indexSố thứ tự nến: 0 = nến đầu của dữ liệu đã nạp (kể cả đoạn khởi động). Giá trị tuyệt đối phụ thuộc lượng lịch sử đã nạp — chỉ dùng hiệu hai chỉ sốnến
d.valueGiá trị giao dịch ước tính = close × volume × 1000đồng
d.retLợi nhuận nến = close ÷ close nến trước − 1tỷ lệ
d.tradable1 nếu nến có khớp lệnh (volume > 0), 0 nếu không—

d.source(tên)​

d.source(ten) → chuỗi — lấy chuỗi theo tên: "open", "high", "low", "close", "volume", "hl2", "hlc3", "ohlc4". Tên khác báo lỗi d.source: nguồn "…" không có (open, high, low, close, volume, hl2, hlc3, ohlc4). Dùng với tham số chọn nguồn: d.source(p.src).

d.const(số)​

d.const(x) → chuỗi — chuỗi hằng x ở mọi nến. Cần khi muốn vẽ một số bằng line (line(d.const(p.muc))), hoặc bắt đầu một phép từ một số: d.const(100).div(d.close) (100 ÷ giá), d.const(5).where(dieuKien) (5 khi đúng, NaN khi sai).

Khung lớn hơn: d.tf​

d.tf(khung, { forming? = false }) → Bars — nến của cùng mã ở khung lớn hơn, gióng về từng nến của biểu đồ. Kết quả có đủ trường như d (.open, .close, .volume, .hl2, .time…) và dùng được với ta.*.

Khung hợp lệ"1", "5", "15", "30", "60", "240" (phút); "1D", "1W", "1M", "3M", "12M"
Điều kiệnLớn hơn và là bội số của khung đang tính. Nhỏ hơn: lỗi tf-lower d.tf("60") nhỏ hơn khung đang tính 1D — chưa hỗ trợ (khung nhỏ hơn dùng d.ltf); không là bội số: lỗi tf-misaligned
Cùng khungd.tf(d.resolution) trả lại chính d
forming: false (mặc định)Chỉ nến khung lớn đã đóng: giá trị hiện từ nến nhỏ cuối cùng của nến lớn đó, giữ nguyên tới nến lớn kế tiếp đóng. Không vẽ lại
forming: trueNến khung lớn đang hình thành, gộp từ các nến nhỏ đã có (đỉnh / đáy / đóng tính tới nến hiện tại)

Mốc đóng theo lịch phiên: nến 60 phút neo theo đoạn giao dịch, nến ngày đóng lúc ATC, nến tuần đóng ở phiên cuối tuần.

Khung nhỏ hơn: d.ltf​

d.ltf(khung) → LowerBars — nến khung nhỏ hơn (vd. 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 nhỏ (ta.ema(m.close, 30) là EMA 30 nến phút); về nến của biểu đồ bằng phép gộp:

PhépNghĩa
m.sum(x) m.mean(x) m.max(x) m.min(x) m.std(x)Tổng / trung bình / lớn nhất / nhỏ nhất / độ lệch chuẩn các nến nhỏ của nến (bỏ NaN)
m.first(x) m.last(x) m.at(x, k)Nến nhỏ đầu / cuối / thứ k (0 = đầu, −1 = cuối)
m.count(x?)Số nến nhỏ (có giá trị) của nến
Dùng thẳng m.closeGiá trị ở nến nhỏ cuối của nến
indicator({
name: "Khối lượng mua mạnh trong phiên",
plot: (d) => {
const m = d.ltf("1");
const upVol = m.sum(m.volume.where(m.close.gt(m.open), 0));
return { "KL nến phút tăng (%)": columns(upVol.div(m.sum(m.volume)).mul(100)) };
},
});

Trong onBar: khai báo chuỗi khung nhỏ trong series rồi đọc mảng bằng ctx.ltf(tên). Khung đang tính phải là bội số của khung nhỏ; tối đa 2 khung nhỏ mỗi script, một nến ≤ 20.000 nến nhỏ. Terminal nạp tối đa khoảng 150.000 nến nhỏ mỗi khung (với 1 phút ≈ 555 phiên gần nhất): nến cũ hơn không có nến nhỏ — phép gộp ra NaN, count ra 0.

Lịch phiên: d.session​

ChuỗiGiá trị
d.session.first1 ở nến đầu tiên của mỗi phiên giao dịch, 0 ở nến khác
d.session.last1 ở nến cuối của phiên (biết khi nến đó đóng). Hiện đúng trên nến ngày và nến 60 phút; trên khung 1–30 phút chưa nhận nến ATC — muốn bắt cuối phiên dùng d.session.minute.gte(14 * 60 + 30)
d.session.minutePhút trong ngày theo giờ của sàn (UTC+7): 9:15 → 555, 13:00 → 780, 14:45 → 885
d.session.weekday0 = Chủ nhật, 1 = thứ Hai … 6 = thứ Bảy
d.session.daySố ngày kể từ 01/01/1970 theo giờ của sàn

Trên nến ngày, first và last luôn là 1, minute không mang nghĩa giờ khớp lệnh — các chuỗi này dành cho biểu đồ trong ngày.

Thông tin mã và khung​

Thuộc tínhKiểuNghĩa
d.infođối tượng{ symbol, exchange?, type?, … } của mã đang tính
d.info.symbolchữMã: "FPT", "VNINDEX", "VN30F1M"
d.resolutionchữKhung: "1D", "1W", "15", "60"…
d.modechữ"symbol" trên biểu đồ ("universe" trong Quant AI Studio)
d.symbolsmảng chữ["FPT"] — một phần tử trên biểu đồ
d.unitsốSố đồng trên một đơn vị giá: 1000 (giá nghìn đồng)

Đây là giá trị thường (không phải chuỗi): dùng với JavaScript (d.resolution === "1D", ${d.info.symbol}).

Mã khác: d.symbol, d.bench​

ViếtNghĩa
d.symbol(ma, { resolution? })Nến của mã khác (.open, .close, .volume… như d), gióng theo nến đang tính: mỗi nến lấy giá trị đã biết gần nhất của mã đó, không nhìn trước. Tối đa 4 mã mỗi script (mã thứ 5 báo Tối đa 4 mã khác mỗi script). Dùng với tham số param.symbol để người dùng chọn mã
d.benchNến VNINDEX (không tính vào 4 mã)

Trên biểu đồ, script tự nạp nến của mã khác theo khung đang xem (tải lùi tới đầu lịch sử, tối đa khoảng 150.000 nến mỗi mã); trong lúc nạp đường còn trống rồi tự tính lại. Trường Quant của mã khác (.fin(…), khối ngoại…) cũng trống trên biểu đồ. d.symbol chỉ có ở dạng một mã: script dùng nó không lọc mã được (Lọc bằng script, Quant AI Studio báo lỗi universe-only); d.bench dùng được ở cả hai.

// dữ liệu Quant không cần: d.symbol, d.bench tự nạp nến trên biểu đồ
indicator({
name: "Lợi nhuận 20 phiên so với VNINDEX",
plot: (d) => ({
"Hơn VNINDEX (%)": hist(d.close.pct(20).sub(d.bench.close.pct(20)).mul(100), { up: "up", down: "down" }),
}),
});

Dòng tiền chủ động: d.flow, d.footprint​

Chuyên nghiệp Khớp lệnh có chiều của mã đang xem, theo từng nến — cùng nguồn với chỉ báo Volume Delta, CVD và kiểu biểu đồ Footprint (Dòng tiền chủ động). Chỉ dạng một mã (không dùng khi lọc rổ). Lịch sử theo giá khớp có từ ngày FireAnt bắt đầu lưu (phiên 23/10/2026); nến cũ hơn là số ước lượng từ lệnh lớn (exact = 0). Khung giây không có. Thiếu gói thì các chuỗi trống.

d.flow({ reset? }):

TrườngNghĩa
buy, sellKhối lượng mua chủ động, bán chủ động
neutralKhớp không chiều (ATO / ATC)
delta, totalMua − bán chủ động; tổng
cvdDelta cộng dồn: đặt lại mỗi phiên ở khung trong ngày; reset: "none" cộng dồn liên tục
imbalanceBuy, imbalanceSellSố ô mất cân bằng chéo (một bên gấp từ 3 lần bên kia)
exact1 = số theo giá khớp thật, 0 = ước lượng

d.footprint({ rowTicks? = 1, valueArea? = 70, imbalance? = 300 }) — như request.footprint() của Pine: buy, sell, neutral, delta, total, poc (giá có khối lượng lớn nhất), vah / val (cận trên / dưới vùng giá trị valueArea %, giá dưới của hàng), maxDelta / minDelta theo hàng, imbalanceBuy / imbalanceSell, rows (số hàng giá). rowTicks = số bước giá mỗi hàng, imbalance = ngưỡng mất cân bằng (%).

// dữ liệu Quant không cần: d.flow, d.footprint đọc khớp lệnh có chiều của biểu đồ (gói Chuyên nghiệp)
indicator({
name: "POC và delta",
pane: "price",
plot: (d) => ({
POC: line(d.footprint().poc, { color: "ai", step: true }),
"Delta dương": shape(d.flow().delta.gt(0), { at: "below", shape: "circle", color: "up", size: "s" }),
}),
});

Dữ liệu ngoài giá (Quant)​

Các trường dưới cùng tên với Quant AI Studio. Trên biểu đồ FireAnt Chart chưa có dữ liệu cho chúng (đường để trống, điều kiện không bao giờ đúng); chúng có dữ liệu khi script chạy trong Lọc bằng script trên rổ có tên và trong Quant AI Studio — Bài 12. Trên biểu đồ, các chỉ báo dựng sẵn cùng loại (khối ngoại, P/E, ROE…) của thư viện chỉ báo vẫn có dữ liệu.

ViếtNghĩaChi tiết
d.fin(chiTieu, { ttm?, period?, ago? })Chỉ tiêu BCTC theo ngày công bố (72 chỉ tiêu: "NetSale", "ProfitAfterTax", "ROE"…). ttm: true cộng 4 quý; period: "year" BCTC năm; ago: 0–20 kỳ trướcd.fin
d.macro(ma)Chuỗi vĩ mô đã công bố tới phiên đó ("cpi_yoy"…), mã chữ thườngDữ liệu và Panel
d.field(ten)Trường theo tên dạng chữ
d.foreignBuyVolume, d.foreignSellVolume, d.foreignBuyValue, d.foreignSellValue, d.foreignNet, d.foreignNetVolume, d.foreignRoomKhối ngoạiKhối ngoại, tự doanh
d.propNet, d.buyCount, d.sellCount, d.buyVolume, d.sellVolumeTự doanh, số lệnh, KL đặt
d.closeRaw, d.basic, d.avgPrice, d.valueExact, d.dealVolume, d.putthroughVolume, d.putthroughValue, d.adjRatio, d.volumeAdjGiá gốc, giao dịch chi tiếtGiá gốc
d.eps, d.bvps, d.roe, d.roa, d.grossMargin, d.revenueGrowth, d.profitGrowth, d.debtToEquity, d.fScore, d.reportNew, d.pe, d.pb, d.earningsYieldChỉ số BCTC, định giáBCTC
d.cashDividend, d.dividendYield, d.exRights, d.ceiling, d.floor, d.atCeiling, d.atFloorCổ tức, giá trần / sànDữ liệu và Panel
d.newsCount, d.postCount, d.postLikes, d.postReplies, d.bullishPosts, d.bearishPosts, d.postAuthorsTin tức, bài đăng cộng đồng
d.insiderBuy, d.insiderSell, d.insiderBuyPlan, d.insiderSellPlan, d.holderBuy, d.holderSell, d.insiderNet, d.insiderNetValueGiao dịch nội bộ, cổ đông lớn
d.stateOwnership, d.foreignMajorOwnership, d.founderOwnership, d.majorOwnership, d.majorHoldersCơ cấu sở hữu

d.meta, d.days chỉ có trong Studio; trên biểu đồ d.meta báo lỗi universe-only.

Ví dụ tổng hợp​

Dùng mọi trường có dữ liệu trên biểu đồ ngày:

indicator({
name: "Dữ liệu d trên biểu đồ ngày",
pane: "price",
plot: (d) => {
const tuan = d.tf("1W");
const thang = d.tf("1M", { forming: true });
const tuDau = d.index.sub(d.index.valueWhen(d.close.gte(d.close.highest(100))));
return {
"Giá điển hình": line(d.hlc3, { color: "textMuted", hidden: true }),
"HL2 / OHLC4": line(d.hl2.add(d.ohlc4).div(2), { color: "textMuted", dash: "dot", hidden: true }),
"Nguồn đóng cửa": line(d.source("close"), { color: "accent", hidden: true }),
"Đóng cửa tuần trước": line(tuan.close, { color: "ai", step: true }),
"Đỉnh tháng này": line(thang.high, { color: "up", step: true, dash: "dash" }),
"Lợi nhuận nến > 3 %": shape(d.ret.gt(0.03), { at: "below", shape: "circle", color: "up", size: "s" }),
"GTGD > 2 lần TB": bgcolor(d.value.gt(ta.sma(d.value, 20).mul(2)), { color: "ref", opacity: 0.08 }),
"Thứ Hai": barcolor(d.session.weekday.eq(1).and(d.tradable), { color: "ceil" }),
"Nến từ đỉnh 100 phiên": line(tuDau, { pane: "Đếm", color: "accent" }),
"Năm 2026": bgcolor(d.time.gte(Date.UTC(2026, 0, 1)), { color: "ai", opacity: 0.03 }),
};
},
});

Trên biểu đồ trong ngày, lịch phiên có ý nghĩa đầy đủ:

// khung: 15 (script cho biểu đồ trong ngày)
indicator({
name: "Lịch phiên trên nến 15 phút",
pane: "price",
plot: (d) => ({
"Nến đầu phiên": shape(d.session.first, { at: "top", char: "▼", color: "textMuted" }),
"Cuối phiên (từ 14:30)": shape(d.session.minute.gte(14 * 60 + 30), { at: "bottom", char: "▲", color: "textMuted" }),
"Buổi chiều": bgcolor(d.session.minute.gte(13 * 60), { color: "ai", opacity: 0.05 }),
"Đóng cửa phiên trước": line(d.tf("1D").close, { color: "ref", step: true }),
"VWAP từ đầu phiên": line(
d.hlc3.mul(d.volume).cumsum().sub(d.hlc3.mul(d.volume).cumsum().valueWhen(d.session.first).sub(d.hlc3.mul(d.volume)))
.div(d.volume.cumsum().sub(d.volume.cumsum().valueWhen(d.session.first).sub(d.volume))),
{ color: "accent" }
),
}),
});

VWAP từ đầu phiên ở trên lấy tổng cộng dồn trừ đi tổng cộng dồn ngay trước nến đầu phiên (valueWhen(d.session.first)) — minh hoạ cách "reset theo phiên" bằng phép chuỗi. Thư viện có sẵn VWAP neo theo phiên: ta.run("vwap", {}).v.