Trả lời ngắn: Volatility Filter trong EA là cổng đo độ lớn dao động bằng dữ liệu như ATR, so mẫu trên nến đã đóng với mốc nền cùng ngữ cảnh, rồi phân loại LOW, NORMAL hoặc HIGH. Nó trả PASS, BLOCK hay UNKNOWN; nó không dự báo giá đi lên hay xuống.

Đọc xong, bạn sẽ hiểu:

  • Vì sao biến động không nói hướng giá.
  • Cách lấy ATR trên bar đã đóng thay vì bar đang chạy.
  • Vì sao mốc nền phải cùng mã sản phẩm, khung thời gian và chu kỳ ATR.
  • Cách mốc vào-ra khác nhau chống trạng thái bật-tắt quanh ranh giới.

Lưu ý giáo dục: Toàn bộ U, tỷ lệ và ngưỡng trong bài là dữ liệu demo để học thiết kế phần mềm. Chúng không phải cấu hình tốt nhất, tín hiệu hay lời khuyên giao dịch.

1. Volatility Filter đo độ lớn, không đo hướng

a. Đầu vào và đầu ra

Biến động (volatility) ở đây là độ lớn dao động của giá trong một khoảng, không phải giá đi lên hay đi xuống. Volatility Filter nhận:

  • đặc tả chỉ báo: mã sản phẩm (symbol), khung thời gian (timeframe), chu kỳ ATR (ATR period);
  • mẫu ATR của bar đã đóng;
  • mốc nền từ các mẫu trước;
  • bộ quy tắc (policy), trạng thái trước và độ mới dữ liệu.

Đầu ra gồm quyết định, chế độ (regime), lý do và bằng chứng:

  • PASS: dữ liệu sẵn sàng và regime nằm trong vùng policy cho phép;
  • BLOCK: dữ liệu sẵn sàng nhưng regime nằm ngoài vùng cho phép;
  • UNKNOWN: mã tham chiếu, dữ liệu lịch sử, vùng dữ liệu, số mẫu hoặc độ mới chưa đủ.

b. Ranh giới công việc

Filter không tạo tín hiệu, không tính khối lượng, không đặt lệnh và không nói giá sắp tăng hay giảm. HIGH cũng không tự nghĩa “xấu”; có chiến lược cho phép, có chiến lược chặn. PASS chỉ qua cổng biến động, không phải kết luận thị trường an toàn.

Hãy nghĩ tới đồng hồ đo độ xóc trên xe. Số rung lớn cho biết đường xóc hơn, nhưng không cho biết xe đang chạy về Bắc hay Nam. ATR cũng tách độ lớn khỏi hướng như vậy.

2. ATR, bar đã đóng và trạng thái dữ liệu

a. ATR đo gì

Biên độ thực (True Range) lấy giá trị lớn nhất trong ba khoảng: high–low hiện tại, khoảng cách từ high hiện tại tới close trước, và khoảng cách từ low hiện tại tới close trước. Biên độ thực trung bình (Average True Range, ATR) là trung bình di động của True Range. MetaQuotes mô tả ATR là chỉ báo thể hiện volatility. Average True Range

ATR không mang dấu hướng. Một bar tăng mạnh và một bar giảm mạnh có thể cùng tạo True Range lớn. Vì thế câu “ATR cao nên giá sắp giảm” đã gắn thêm một kết luận mà ATR không cung cấp.

b. Handle chưa phải value

iATR(symbol, timeframe, ma_period) tạo mã tham chiếu chỉ báo (indicator handle). Chỉ báo có một vùng dữ liệu (indicator buffer); nếu tạo thất bại, hàm trả INVALID_HANDLE. Handle không phải con số ATR để đem so ngay. iATR

Trước khi đọc:

  • dữ liệu lịch sử của symbol/timeframe phải đồng bộ;
  • BarsCalculated(handle) phải báo đủ dữ liệu đã tính;
  • CopyBuffer() phải trả đúng số mẫu yêu cầu;
  • ảnh chụp dữ liệu phải còn mới theo policy.

SERIES_SYNCHRONIZED trong SeriesInfoInteger() cho biết chuỗi lịch sử đã đồng bộ. BarsCalculated() trả số phần tử đã tính hoặc -1 khi lỗi/chưa tính. SeriesInfoInteger, BarsCalculated

c. Bar 0 chưa đóng

Trong timeseries MQL5, vị trí 0bar hiện tại, tức khoảng thời gian chưa kết thúc. Giá high/low của bar này còn thay đổi, kéo ATR hiện tại thay đổi theo. Timeseries and Indicators Access

Độ dịch (shift) là số vị trí lùi từ bar hiện tại. Bộ quy tắc demo dùng shift 1 cho mẫu ATR đã đóng gần nhất, rồi shifts 2–21 cho 20 mẫu làm mốc nền.

CopyBuffer() tính start_pos=0 từ current bar về quá khứ và trả số phần tử copy được hoặc -1 khi lỗi. Dữ liệu chưa build/download cũng có thể chưa sẵn sàng. Vì vậy “copy thiếu” phải thành UNKNOWN, không được lấp số 0 rồi PASS. CopyBuffer

3. Mốc nền cùng ngữ cảnh và tỷ lệ ATR

a. Khóa context trước khi chia

Khóa ngữ cảnh (context key) gồm symbol, timeframe, ATR period, thời gian bar đã đóng, đơn vị/cách chuẩn hóa, nguồn và độ mới. Mẫu hiện tại chỉ được ghép với mốc nền khi các phần này tương thích.

So ATR thô của hai symbol, hai timeframe hoặc hai period khác nhau giống so chiều cao trẻ em với người lớn nhưng bỏ mất nhóm tuổi. Con số lớn hơn chưa nói regime nào bất thường trong chính bối cảnh của nó.

b. Mốc nền và phép chia

Mốc nền (baseline) là mức tham chiếu từ dữ liệu trước. Demo dùng trung vị (median) của 20 ATR đã đóng ở shifts 2–21: sắp các mẫu rồi lấy giá trị giữa.

ATR ratio = ATR đã đóng hiện tại / ATR nền

Tỷ lệ không còn đơn vị, nhưng chỉ có nghĩa khi tử và mẫu cùng context. Baseline phải là số hữu hạn lớn hơn 0; thiếu mẫu, NaN, vô hạn hoặc 0 đều phải UNKNOWN.

Demo dùng 100 U làm baseline. U là đơn vị giả, không phải point hay pip.

c. Hysteresis chống rung trạng thái

Độ trễ hai ngưỡng (hysteresis) dùng mốc vào và mốc rời khác nhau:

  • từ NORMAL, vào LOW khi ratio <0.70;
  • đang LOW, chỉ rời khi ratio >=0.80;
  • từ NORMAL, vào HIGH khi ratio >1.60;
  • đang HIGH, chỉ rời khi ratio <=1.40.

Nó giống bộ điều nhiệt (thermostat): máy lạnh không bật và tắt tại đúng một nhiệt độ. Nếu chỉ có ngưỡng 1.50, ratio 1.49 → 1.51 → 1.49 có thể làm quyết định rung liên tục.

Đây là bộ quy tắc demo, không phải ngưỡng chuẩn. Vùng giữa hai mốc phụ thuộc trạng thái trước: ratio 1.45 có thể vẫn HIGH nếu trước đó đang HIGH, nhưng là NORMAL nếu trước đó đã NORMAL.

Hình 1 — Volatility Filter chỉ phân loại khi ATR đã đóng, baseline cùng ngữ cảnh và policy đều đủ bằng chứng.

4. Demo ba regime và một trạng thái chưa biết

a. Ba phép chia

Giữ baseline demo ở 100 U:

  • A: ATR hiện tại 65 U; 65/100 = 0.65LOW / BLOCK / BELOW_LOW_ENTER;
  • B: ATR hiện tại 110 U; 110/100 = 1.10NORMAL / PASS / IN_ALLOWED_REGIME;
  • C: ATR hiện tại 170 U; 170/100 = 1.70HIGH / BLOCK / ABOVE_HIGH_ENTER.

Các quyết định giả định trạng thái trước là NORMAL và bộ quy tắc chỉ cho NORMAL đi qua. Chúng không đưa ra hành động giao dịch hay chọn khối lượng.

Hình 2 — Hai mốc vào và rời khác nhau giữ decision ổn định khi ATR ratio lượn sát ranh giới.

b. Trạng thái trước làm đổi kết quả vùng đệm

Nếu hệ thống đã vào HIGH ở ratio 1.70, mẫu kế tiếp 1.45 vẫn HIGH/BLOCK vì chưa xuống 1.40. Khi ratio xuống 1.35, hệ thống mới rời HIGH về NORMAL/PASS.

Đây không phải mâu thuẫn với ba phép chia trên. Hysteresis cố ý giữ trí nhớ ngắn về trạng thái trước để tránh bật-tắt liên tục.

c. Dữ liệu chưa sẵn sàng

Tình huống D gồm INVALID_HANDLE, lịch sử chưa đồng bộ, BarsCalculated chưa đủ hoặc số mẫu sao chép <21. Kết quả:

UNKNOWN / VOL_DATA_NOT_READY / RELOAD

Phiếu quyết định (decision card) nên giữ: khóa ngữ cảnh, giờ đóng bar, ATR hiện tại, mốc nền, tỷ lệ, regime trước, quyết định, lý do và phiên bản policy.

Hình 3 — Cùng baseline 100U, ba ATR khác nhau cho ba regime; data chưa sẵn sàng giữ UNKNOWN.

5. Bảy lỗi và giới hạn cần nhớ

  1. Biến ATR thành hướng giá: ATR đo độ lớn, không cho dấu tăng/giảm.
  2. Dùng shift 0: bar hiện tại thay đổi nên quyết định có thể rung trong bar.
  3. So ATR thô khác ngữ cảnh: symbol/timeframe/period khác nhau không cùng thước.
  4. Làm bẩn mốc nền: đưa mẫu hiện tại vào mốc nền hoặc dùng thiếu mẫu.
  5. Nuốt lỗi dữ liệu: handle lỗi, bars chưa tính, copy thiếu hay lịch sử chưa đồng bộ phải UNKNOWN.
  6. Một ngưỡng vào-ra: thiếu hysteresis gây trạng thái lật liên tục.
  7. Snapshot quá cũ: dữ liệu từng đúng không chứng minh vẫn đúng lúc quyết định.

Giới hạn: ATR không trực tiếp đo spread, thanh khoản, trượt giá, news hoặc hướng. Nó cũng nhìn lại các range đã có, nên không đảm bảo bắt được cú biến động bất ngờ trước khi xảy ra. LOW không tự là yên ổn; HIGH không tự là nguy hiểm.

Bộ quy tắc nào cho phép LOW/NORMAL/HIGH phụ thuộc chiến lược và dữ liệu kiểm thử. Bài này chỉ thiết kế hợp đồng đóng an toàn (fail-closed contract), không đặt ngưỡng “tối ưu”.

6. Danh sách kiểm và bảng bài tập 15 phút

a. Mười hai câu kiểm

  1. Symbol nào?
  2. Timeframe nào?
  3. ATR period bao nhiêu?
  4. Handle có hợp lệ?
  5. Lịch sử đã đồng bộ?
  6. BarsCalculated đủ?
  7. Mẫu hiện tại lấy shift 1?
  8. CopyBuffer trả đủ 21 mẫu?
  9. Baseline có đủ 20 mẫu hữu hạn và >0?
  10. Mẫu hiện tại và mốc nền cùng context?
  11. Ratio và regime trước là gì?
  12. Phiên bản policy, quyết định, lý do đã log?

Điểm dừng: handle lỗi, lịch sử chưa đồng bộ, copy thiếu, mốc nền không hợp lệ hoặc ảnh chụp quá cũ thì trả UNKNOWN.

b. Bài tập miễn phí

Dùng giấy hoặc Google Sheets 10–15 phút. Tính 65/100, 110/100, 170/100, rồi áp mốc demo. Sau đó giả sử regime trước là HIGH: thử 1.451.35. Chưa mở MT5, chưa kết nối tài khoản và chưa dùng tiền thật.

c. Mẫu đối chiếu đã điền

Case Bằng chứng demo Kết quả
A 65/100=0.65 LOW / BLOCK / BELOW_LOW_ENTER
B 110/100=1.10 NORMAL / PASS / IN_ALLOWED_REGIME
C 170/100=1.70 HIGH / BLOCK / ABOVE_HIGH_ENTER
D handle/bars/copy chưa sẵn sàng UNKNOWN / VOL_DATA_NOT_READY / RELOAD

Sản phẩm bài tập là bảng tỷ lệ và chuyển trạng thái, không phải cấu hình giao dịch.

7. Tổng kết: so đúng ngữ cảnh rồi mới phân loại

a. Năm ý chính

  • Volatility Filter đo độ lớn dao động, không đo hướng giá.
  • Mẫu quyết định nên lấy từ bar đã đóng, không phải shift 0.
  • Baseline phải cùng symbol, timeframe và ATR period.
  • Hysteresis dùng mốc vào-ra khác nhau để chống rung.
  • Handle, lịch sử, bars hoặc copy chưa đủ phải UNKNOWN.

Bài trước là News Filter trong EA. Bài tiếp theo là Grid System trong EA #13.

b. Câu hỏi tự kiểm tra

  • Vì sao ATR cao không tự nói giá sẽ giảm?
  • Vì sao demo lấy current sample ở shift 1?
  • Ratio 1.45 là HIGH hay NORMAL?
  • CopyBuffer trả thiếu mẫu nên thành trạng thái nào?

c. Gợi ý đáp án

Xem gợi ý câu 1

ATR đo độ lớn range, không mang dấu hướng tăng hoặc giảm. → xem mục 1–2.

Xem gợi ý câu 2

Shift 1 là bar gần nhất đã đóng; shift 0 vẫn hình thành và có thể đổi. → xem mục 2.

Xem gợi ý câu 3

Phụ thuộc previous regime: đang HIGH thì vẫn HIGH; đã NORMAL thì vẫn NORMAL theo policy demo. → xem mục 3–4.

Xem gợi ý câu 4

UNKNOWN vì filter chưa đủ bằng chứng để tính baseline và ratio. → xem mục 4.

d. Thuật ngữ cần nhớ

Thuật ngữ Giải thích ngắn
Volatility Filter Cổng phân loại chế độ dao động thành quyết định có bằng chứng.
ATR Trung bình di động của True Range.
Closed bar Bar đã kết thúc, không còn nhận giá mới.
Indicator handle Mã tham chiếu tới khối tính chỉ báo.
Baseline Mốc so sánh từ các mẫu trước cùng context.
ATR ratio ATR hiện tại chia baseline cùng context.
Regime Nhãn LOW, NORMAL hoặc HIGH.
Hysteresis Mốc vào và rời khác nhau để chống rung trạng thái.
UNKNOWN Chưa đủ dữ liệu để phân loại.

e. Nguồn tham khảo

Nội dung này phục vụ mục đích giáo dục, không phải lời khuyên đầu tư hoặc tín hiệu giao dịch. Volatility Filter không thể loại bỏ rủi ro thị trường, dữ liệu hoặc thực thi.