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

Bài 5 — Cảnh báo

Bạn sẽ học: khai báo điều kiện cảnh báo trong script, bật cảnh báo (chạy trên máy chủ FireAnt hoặc trên trình duyệt), chọn tần suất, tránh báo nhầm khi nến chưa đóng, và dùng chính các điều kiện đó để lọc mã.

5.1. Khai báo alerts​

alerts là một hàm giống plot, trả về các điều kiện theo tên. Tên là chữ hiện trong hộp đặt cảnh báo và trong thông báo.

indicator({
name: "RSI có cảnh báo",
scale: { range: [0, 100], levels: [30, 70] },
params: {
len: param.int(14, { min: 2, max: 50, label: "Chu kỳ" }),
lo: param.int(30, { min: 5, max: 50, label: "Quá bán" }),
hi: param.int(70, { min: 50, max: 95, label: "Quá mua" }),
},
plot: (d, p) => ({ RSI: line(ta.rsi(d.close, p.len), { color: "accent" }) }),
alerts: (d, p) => {
const r = ta.rsi(d.close, p.len);
return {
"RSI cắt lên quá bán": r.crossAbove(p.lo),
"RSI cắt xuống quá mua": r.crossBelow(p.hi),
};
},
});

Điều kiện cảnh báo không cần vẽ ra; nhưng khi điều kiện cũng hiện thành dấu trên biểu đồ (như Bài 3), bạn thấy ngay trên lịch sử nó sẽ báo ở những nến nào.

5.2. Bật cảnh báo​

  1. Thêm script vào biểu đồ (cảnh báo gắn với script trên biểu đồ này: mã, khung, tham số hiện tại).
  2. Khung script › ⋯ › Cảnh báo theo script… (hoặc hộp đặt cảnh báo của biểu đồ, loại điều kiện Script).
  3. Đánh dấu điều kiện muốn nhận, chọn Tần suất, bấm Lưu cảnh báo.
Tần suấtBáo khi
Một lầnLần đầu điều kiện đúng, rồi tự tắt
Mỗi nến một lần (mặc định)Điều kiện đúng, tối đa một lần cho mỗi nến
Mỗi lần tính lạiMỗi lần giá mới làm điều kiện đúng

Cảnh báo chạy ở hai nơi:

  • Máy chủ FireAnt Thiết yếu (đã đăng nhập): xét cả khi bạn không mở biểu đồ, gửi thông báo qua các kênh của cảnh báo máy chủ. Máy chủ chạy đúng bản script và tham số lúc bạn đặt cảnh báo; hiện chỉ xét ở khung ngày (1D) — Một lần và Mỗi nến một lần xét khi nến ngày đóng, Mỗi lần tính lại xét theo từng giá khớp.
  • Trình duyệt (mọi gói): khi biểu đồ đang mở trên FireAnt Terminal, app hiện thông báo ở góc màn hình (và thông báo của trình duyệt nếu bạn đang ở cửa sổ khác).

Chi tiết giao diện: Cảnh báo theo script; cảnh báo máy chủ: Cảnh báo trên biểu đồ.

5.3. Nến đang chạy và báo nhầm​

Trong phiên, nến cuối chưa đóng: giá còn đổi nên điều kiện có thể đúng lúc 10:15 rồi sai lúc đóng cửa. Nếu chỉ muốn tín hiệu đã chốt, xét điều kiện của nến vừa đóng bằng shift(1) và chọn tần suất Mỗi nến một lần:

indicator({
name: "Giá cắt MA 20 (nến đã đóng)",
pane: "price",
plot: (d) => ({ "MA 20": line(ta.sma(d.close, 20), { color: "ref" }) }),
alerts: (d) => {
const cat = d.close.crossAbove(ta.sma(d.close, 20));
return {
"Cắt lên MA 20 (đã đóng)": cat.shift(1),
"Cắt lên MA 20 (ngay khi xảy ra)": cat,
};
},
});
  • cat.shift(1) đúng ở nến sau nến cắt — tức ngay khi nến cắt vừa đóng, và không đổi nữa.
  • Khai báo dạng đối tượng có thêm tuỳ chọn: { when: điều kiện, message: "…", barClose: true }. barClose: true đánh dấu điều kiện chỉ có nghĩa khi nến đóng: máy chủ cảnh báo luôn xét điều kiện này lúc nến đóng, kể cả khi bạn chọn Mỗi lần tính lại (trong hộp đặt cảnh báo của biểu đồ, chọn Khi nến đóng cho điều kiện này). message là lời mô tả điều kiện, lưu cùng khai báo của script; thông báo trên trình duyệt hiện tên điều kiện, mã và giá.
indicator({
name: "Bứt phá đỉnh 20 phiên",
pane: "price",
plot: (d) => ({ "Đỉnh 20 phiên": line(d.high.highest(20).shift(1), { color: "up", dash: "dash", step: true }) }),
alerts: (d) => ({
"Bứt phá": {
when: d.close.crossAbove(d.high.highest(20).shift(1)),
message: "Giá đóng cửa vượt đỉnh 20 phiên",
barClose: true,
},
}),
});

d.high.highest(20).shift(1) là đỉnh của 20 nến trước nến này (không tính nến này — nếu tính, giá không bao giờ "vượt" được chính nó).

5.4. Cảnh báo từ logic theo nến​

Khi điều kiện được tính trong onBar (Bài 6), trả nó thành một đầu ra rồi dùng ở alerts qua đối số thứ ba o:

indicator({
name: "5 phiên tăng liên tiếp",
state: () => ({ dem: 0 }),
onBar: (ctx, s) => {
s.dem = ctx.close > ctx.bar(1).close ? s.dem + 1 : 0;
return { dem: s.dem };
},
plot: (d, p, o) => ({ "Số phiên tăng": columns(o.dem, { color: "up" }) }),
alerts: (d, p, o) => ({ "Tăng 5 phiên liền": o.dem.eq(5) }),
});

5.5. Điều kiện cảnh báo cũng để lọc mã​

Mỗi điều kiện trong alerts thành một lựa chọn Cảnh báo: … của ⋯ › Lọc bằng script…: chạy điều kiện trên cả VN30, một watchlist hay toàn thị trường để tìm mã vừa có tín hiệu (Bài 12).

Bài tập​

Viết chỉ báo cảnh báo khi giá giảm quá 7 % so với đỉnh 20 phiên gần nhất (tính trên giá đóng cửa), báo một lần khi vừa thủng.

Lời giải
indicator({
name: "Giảm 7 % từ đỉnh 20 phiên",
params: { pct: param.pct(0.07, { min: 0.02, max: 0.3, label: "Mức giảm" }) },
plot: (d, p) => {
const tuDinh = d.close.div(d.close.highest(20)).sub(1);
return {
"Từ đỉnh (%)": area(tuDinh.mul(100), { color: "down" }),
"Ngưỡng": line(d.const(-p.pct * 100), { color: "down", dash: "dash" }),
};
},
alerts: (d, p) => ({
"Thủng ngưỡng giảm": d.close.div(d.close.highest(20)).sub(1).crossBelow(-p.pct),
}),
});

param.pct(0.07) cho giá trị tỷ lệ 0,07; ô tham số hiện 7 %. Vì vậy ngưỡng là -p.pct khi so với tỷ lệ, và -p.pct * 100 khi vẽ theo phần trăm.

Tiếp theo: Bài 6 — Tính theo từng nến với onBar