Khai báo và tham số
- 🇻🇳 Tiếng Việt
- 🇬🇧 English
- 🇰🇷 한국어
- 🇨🇳 中文
Mỗi script gọi đúng một lần indicator({...}) hoặc strategy({...}). Không gọi lần nào: lỗi Script cần gọi một trong indicator(...), strategy(...), screen(...), research(...); gọi hai lần: Script gọi 2 lần indicator / strategy / screen / research — mỗi script chỉ một.
indicator({...})
indicator({ name, short?, description?, pane?, scale?, params?, resolution?,
series?, state?, onBar?, plot, alerts?, alertNames?, limits? })
| Trường | Kiểu | Nghĩa |
|---|---|---|
name | chữ, bắt buộc | Tên trên chú giải, thư viện, cảnh báo |
short | chữ | Tên ngắn trên chú giải |
description | chữ | Mô tả hiện trong thư viện |
pane | "price" | "new" | "price": vẽ chồng lên giá; "new" (mặc định): ngăn riêng |
scale | { range?, levels?, format?, digits? } | Thang của ngăn riêng: range: [0, 100] cố định thang, levels: [30, 70] vạch mức, format định dạng số (Đầu ra › format), digits số chữ số thập phân |
params | đối tượng | Tham số — param |
resolution | khung | Ghim khung tính của cả chỉ báo ("1W"): dữ liệu d là nến khung đó, gióng về biểu đồ — xem Dữ liệu › tf |
series | (d, p) => ({ tên: chuỗi }) | Chuỗi đầu vào cho onBar (ctx.v.tên) — onBar |
state | () => ({ … }) | Trạng thái ban đầu của onBar (dữ liệu thuần) |
onBar | (ctx, s, p) => ({ tên: số }) | void | Logic theo từng nến — onBar |
plot | (d, p, o) => ({ tên: đầu ra }), bắt buộc | Đầu ra trên biểu đồ; khoá là tên trên chú giải — Đầu ra. Không vẽ gì: () => ({}) |
alerts | (d, p, o) => ({ tên: điều kiện | { when, message?, barClose? } }) | Điều kiện cảnh báo, cũng là điều kiện Lọc bằng script — Bài 5 |
alertNames | mảng chữ | Tên các sự kiện ctx.alert(tên) mà onBar được bắn — onBar › alert |
limits | { lines?, boxes?, labels?, polylines?, track? } | Số đối tượng vẽ giữ tối đa mỗi loại (mặc định 50, tối đa 500; polylines — đường gấp khúc — tối đa 100); track: số nến ctx.track giữ (mặc định 500, tối đa 5.000) |
Các hàm plot, alerts, series, signals… chạy một lần khi dựng script (và mỗi khi tham số / mã / khung đổi) để lắp phép tính; onBar chạy mỗi nến. Đầu ra tối đa 64, điều kiện cảnh báo tối đa 32.
indicator({
name: "Chỉ báo đủ trường",
short: "Đủ trường",
description: "Minh hoạ mọi trường của indicator().",
pane: "new",
scale: { range: [0, 100], levels: [30, 50, 70], format: "number", digits: 1 },
params: { len: param.int(14, { min: 2, max: 50, label: "Chu kỳ" }) },
limits: { labels: 20 },
series: (d, p) => ({ rsi: ta.rsi(d.close, p.len) }),
state: () => ({ lanVuot: 0 }),
onBar: (ctx, s) => {
if (ctx.prev("rsi", 1) <= 70 && ctx.v.rsi > 70) {
s.lanVuot += 1;
ctx.draw.label({ at: { barsAgo: 0, price: ctx.v.rsi }, text: `#${s.lanVuot}`, color: "down", size: "s" });
}
return { lan: s.lanVuot };
},
plot: (d, p, o) => ({
RSI: line(ta.rsi(d.close, p.len), { color: "accent" }),
"Số lần vượt 70": line(o.lan, { color: "textMuted", step: true, hidden: true }),
}),
alerts: (d, p) => ({ "RSI vượt 70": { when: ta.rsi(d.close, p.len).crossAbove(70), message: "RSI vừa vượt 70", barClose: true } }),
});
strategy({...})
strategy({ name, description?, params?, resolution?,
signals | rank + select | weights | onBar, filter?,
risk?, portfolio?, execution?, costs?, rules?,
universe?, period?, benchmark?, warmup?, rebalance?, optimize?,
series?, state?, plot?, alerts?, alertNames?, limits? })
| Trường | Nghĩa | Trên biểu đồ |
|---|---|---|
name, description, params, resolution | Như indicator | ✓ |
signals | (d, p) => điều kiện | { entry, exit?, score?, limit?, stop?, short? } — khi nào mua / bán | ✓ — Chiến lược › signals |
filter | (d, p) => điều kiện — chỉ cho vào lệnh khi đúng | ✓ |
risk | Dừng lỗ, chốt lời, dừng lỗ kéo theo, giữ tối đa | ✓ — risk |
portfolio, execution, costs, rules | Vốn, cách khớp, phí, luật thị trường | ✓ — Chiến lược |
plot, alerts | Đầu ra thêm, cảnh báo (mặc định vẽ chồng lên giá) | ✓ |
universe, period, benchmark, warmup, rebalance, optimize | Rổ, kỳ, chỉ số so sánh, khởi động, tái cân bằng, tối ưu | Bỏ qua — dùng khi mở trong Quant AI Studio |
rank + select, weights | Chiến lược xoay vòng / tỷ trọng theo rổ | Studio |
series, state, onBar (lệnh ctx.buy…) | Chiến lược kiểu mệnh lệnh (lệnh giấy) | ✓ — bảng kiểm thử chạy khi chiến lược đã thêm vào biểu đồ; chưa lọc mã được — Lệnh trong onBar |
Chiến lược phải có một trong signals, rank, weights, onBar; thiếu cả bốn: strategy cần một trong: signals(d, p), rank(d, p), weights(d, p) hoặc onBar. signals trả sai kiểu: signals(d, p) phải trả về chuỗi hoặc { entry, exit?, score? }.
signals trả thẳng một chuỗi điều kiện thì chuỗi đó là entry:
strategy({
name: "Mua khi giá trên MA 20 (signals rút gọn)",
signals: (d) => d.close.gt(ta.sma(d.close, 20)).and(d.close.shift(1).lte(ta.sma(d.close, 20).shift(1))),
risk: { trailingStop: 0.08 },
});
Các cấu hình risk, portfolio, execution, costs, rules viết được dạng đối tượng hoặc hàm của tham số: risk: (p) => ({ stopLoss: p.sl }).
param.* — tham số
Khai báo trong params: { tên: param.xxx(…) }; giá trị đọc ở p.tên. Chung cho mọi loại: label (chữ hiện trên cột Tham số). Giá trị người dùng chỉnh lưu cùng biểu đồ, ưu tiên hơn mặc định trong mã (Tham số).
param.int
param.int(macDinh, { min?, max?, step? = 1, label? }) → số nguyên
Ô số nguyên. Giá trị ngoài [min, max] bị kéo về giới hạn, số lẻ làm tròn. Thẻ Tối ưu quét trong min–max.