Chuỗi (Series)
- 🇻🇳 Tiếng Việt
- 🇬🇧 English
- 🇰🇷 한국어
- 🇨🇳 中文
Chuỗi là một cột số theo nến (d.close, ta.rsi(d.close, 14)…). Mọi phép là phương thức viết sau dấu chấm và trả một chuỗi mới — nối tiếp được: d.high.sub(d.low).div(d.close).mul(100). Đối số x nhận chuỗi hoặc số.
Quy tắc chung:
- NaN lan truyền: một vế NaN thì kết quả NaN. Chia cho 0 → NaN.
- Điều kiện: 1 đúng, 0 sai, NaN chưa biết. Dấu / tô / cảnh báo / tín hiệu chỉ bật khi đúng.
- So sánh làm tròn 12 chữ số có nghĩa trước khi so (tránh 0,1 + 0,2 ≠ 0,3).
- Chỉ dùng quá khứ: không có phép nào đọc nến sau.
- Toán tử JavaScript (
+,>,&&) không dùng được giữa chuỗi — vì sao.
Số học
| Phương thức | Kết quả | Ví dụ |
|---|---|---|
a.add(x) | a + x | d.high.add(d.low) |
a.sub(x) | a − x | d.close.sub(d.open) — thân nến |
a.mul(x) | a × x | ta.sma(d.volume, 20).mul(2) |
a.div(x) | a ÷ x (÷ 0 → NaN) | d.close.div(ta.sma(d.close, 200)) |
a.pow(x) | aˣ | d.ret.pow(2) |
a.min(x) | Nhỏ hơn của a và x, từng nến | d.open.min(d.close) — cạnh dưới thân nến |
a.max(x) | Lớn hơn của a và x | d.open.max(d.close) |
a.neg() | −a | d.ret.neg() |
a.abs() | |a| | d.close.sub(d.open).abs() |
a.log() | ln a (a ≤ 0 → NaN) | d.close.log().diff(1) — lợi nhuận log |
a.exp() | eᵃ | |
a.sqrt() | √a | d.ret.rolling(20).var().sqrt() |
a.sign() | −1 / 0 / 1 theo dấu | d.close.diff(1).sign() |
a.round(chuSo = 0) | Làm tròn tới chuSo chữ số thập phân | ta.rsi(d.close, 14).round(1) |
a.clip(lo, hi) | Kẹp a vào [lo, hi] | d.ret.clip(-0.07, 0.07) |
So sánh
Kết quả là điều kiện (1 / 0; một vế NaN → NaN).
| Phương thức | Đúng khi | Ví dụ |
|---|---|---|
a.gt(x) | a > x | ta.rsi(d.close, 14).gt(70) |
a.gte(x) | a ≥ x | d.close.gte(d.close.highest(250)) — đỉnh mới 250 nến |
a.lt(x) | a < x | |
a.lte(x) | a ≤ x | |
a.eq(x) | a = x | d.session.weekday.eq(5) — thứ Sáu |
a.neq(x) | a ≠ x | |
a.between(lo, hi) | lo ≤ a ≤ hi | ta.rsi(d.close, 14).between(40, 60) |
Logic
| Phương thức | Kết quả | Ghi chú |
|---|---|---|
a.and(x) | Đúng khi cả hai đúng | Một vế sai → sai (kể cả vế kia NaN); không vế nào sai mà có NaN → NaN |
a.or(x) | Đúng khi một trong hai đúng | Một vế đúng → đúng; không vế nào đúng mà có NaN → NaN |
a.not() | Đảo đúng / sai | NaN → NaN. Muốn coi chưa biết là sai rồi đảo: a.fillna(0).not() |
a.where(dk, khac = NaN) | a khi dk đúng, khac khi sai hoặc chưa biết | st.line.where(st.dir.gt(0)) — chỉ giữ phần xu hướng tăng; x.where(dk, 0) |
a.isNaN() | 1 khi a là NaN | |
a.notNaN() | 1 khi a có giá trị | |
a.fillna(so) | Thay NaN bằng so | d.foreignNet.fillna(0); so phải là số (chuỗi chữ báo fillna(value) cần một số) |
a.ffill(gioiHan?) | Lấp NaN bằng giá trị gần nhất trước đó (tối đa gioiHan nến) | o.dinh.ffill() |
"Nếu – thì – không thì" cho chuỗi: d.const(1).where(dk, -1) (1 khi đúng, −1 khi sai), a.where(dk, b) (a hoặc b).
Theo thời gian
| Phương thức | Kết quả | Ví dụ |
|---|---|---|
a.shift(n = 1) | Giá trị n nến trước. n < 0 báo lỗi lookahead | d.close.shift(1) — đóng cửa hôm trước |
a.diff(n = 1) | a − a[n] | d.close.diff(5) |
a.pct(n = 1) | a ÷ a[n] − 1 | d.close.pct(20) — % thay đổi 20 nến (dạng tỷ lệ) |
a.cumsum() | Cộng dồn từ nến đầu (bỏ qua NaN) | d.volume.mul(d.close.diff(1).sign()).cumsum() — OBV tự viết |
a.cumprod() | Nhân dồn | d.ret.add(1).cumprod() — tăng trưởng của 1 đồng |
a.cummax(), a.cummin() | Lớn / nhỏ nhất từ nến đầu | d.close.div(d.close.cummax()).sub(1) — sụt giảm từ đỉnh lịch sử |
a.ewm(span) | Trung bình hàm mũ, hệ số 2 ÷ (span + 1), khởi tạo bằng trung bình span giá trị đầu | Như ta.ema(a, span) |
a.highest(n) | Lớn nhất n nến gần nhất kể cả nến này | d.high.highest(20).shift(1) — đỉnh 20 nến trước |
a.lowest(n) | Nhỏ nhất n nến | |
a.rolling(n) | Cửa sổ trượt n nến — xem rolling | d.close.rolling(20).std() |
a.crossAbove(x) | Cắt lên: nến trước a ≤ x, nến này a > x | ta.ema(d.close, 20).crossAbove(ta.ema(d.close, 50)) |
a.crossBelow(x) | Cắt xuống: nến trước a ≥ x, nến này a < x | d.close.crossBelow(70) |
a.cross(x) | Cắt lên hoặc xuống | |
dk.barsSince() | Số nến kể từ lần dk đúng gần nhất (đúng ở nến này → 0; chưa từng → NaN) | d.close.gte(d.close.highest(250)).barsSince() |
dk.hold(n) | Đúng ở nến dk đúng và thêm n nến sau đó | cat.hold(3) — "đã cắt trong 4 nến gần nhất" |
a.valueWhen(dk, thu = 0) | Giá trị của a ở lần thứ thu (0 = gần nhất) dk đúng | d.low.valueWhen(cat) — đáy của nến tín hiệu gần nhất |
crossAbove / crossBelow với một vế NaN cho 0 (không cắt), nên an toàn ở đoạn khởi động.
Cửa sổ trượt: rolling
a.rolling(n) trả một cửa sổ n nến; gọi tiếp một phép để ra chuỗi. Cửa sổ nghiêm ngặt: chưa đủ n giá trị thì NaN.
| Phép | Kết quả |
|---|---|
.sum() | Tổng |
.mean() | Trung bình (= ta.sma) |
.std(mau = false) | Độ lệch chuẩn tổng thể; std(true) độ lệch chuẩn mẫu |
.var(mau = false) | Phương sai |
.min(), .max() | Nhỏ / lớn nhất (= lowest / highest) |
.count() | Số giá trị có (không NaN) trong cửa sổ |
.rank() | Hạng 0…1 của giá trị cuối trong cửa sổ (1 = cao nhất cửa sổ) |
.zscore() | (a − trung bình) ÷ độ lệch chuẩn |
.median() | Trung vị |
.quantile(q) | Phân vị q (0 ≤ q ≤ 1) |