Trả lời ngắn: Filter Engine trong EA là bộ cổng nhận một ứng viên tín hiệu cùng bản chụp bối cảnh, rồi kiểm từng điều kiện để trả PASS, BLOCK hoặc UNKNOWN kèm bằng chứng. Nó không tạo tín hiệu và không tự giao dịch; PASS chỉ nói candidate đã qua lớp lọc này.

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

  • Vì sao bộ lọc cần ba trạng thái thay vì một Boolean.
  • Cách gộp nhiều cổng mà không biến lỗi dữ liệu thành cho phép.
  • Vì sao giờ máy chủ, độ mới dữ liệu và phiên bản bộ quy tắc phải đi cùng kết quả lọc.
  • Một Filter Decision Card cần ghi những gì.

Lưu ý giáo dục: Mọi giờ, ngưỡng và số đo trong bài là demo thiết kế phần mềm. Chúng không phải thông số EA, khuyến nghị giao dịch hay lời hứa lợi nhuận.

1. Filter Engine là gì và ranh giới nằm ở đâu

a. Candidate đi vào, quyết định lọc đi ra

Candidate, hay ứng viên tín hiệu, là bản ghi Signal Engine chuyển sang. Filter Engine không hỏi lại “có crossover không”. Nó hỏi: với bối cảnh hiện tại, candidate này có qua từng cổng đã khai báo hay không?

Engine nhận thêm context snapshot — bản chụp bối cảnh cùng thời điểm — gồm giờ máy chủ, độ mới tick, phiên giao dịch, trạng thái lịch tin, số đo biến động, thời gian chờ và phiên bản bộ quy tắc.

Mỗi gate, hay cổng kiểm, trả một kết quả cùng:

  • input đã đọc;
  • thời điểm đọc;
  • phiên bản quy tắc;
  • reason code — mã lý do;
  • evidence — bằng chứng để tái hiện.

b. PASS không phải giấy phép giao dịch

Filter Engine không tính volume, không cấp ngân sách rủi ro và không gửi yêu cầu giao dịch. PASS chỉ nghĩa là candidate đã qua các filter thuộc phạm vi engine này. Risk Engine và bộ phận thực thi vẫn có quyền chặn.

Hãy hình dung cổng an ninh. Vé hợp lệ mới giúp bạn đi tới cổng kiểm tra, không bảo đảm bạn được lên máy bay. Nếu máy quét giấy tờ hỏng, nhân viên không được ghi “đã kiểm xong”. Trạng thái đúng là chưa xác minh.

c. Filter khác Signal

Signal Engine phát hiện một sự kiện theo dữ liệu thị trường. Filter Engine kiểm bối cảnh quanh sự kiện đó. Nếu filter tự tính lại signal, hai nơi có thể dùng khác bar, khác thời điểm hoặc khác version rồi cho hai câu trả lời không đối chiếu được.

2. Ba trạng thái PASS, BLOCK và UNKNOWN

a. Định nghĩa từng trạng thái

  • PASS: cổng có đủ dữ liệu và điều kiện cho phép candidate đi tiếp.
  • BLOCK: cổng có đủ dữ liệu và điều kiện cấm candidate đi tiếp.
  • UNKNOWN: dữ liệu thiếu, quá hạn, lỗi hoặc lệch cơ sở thời gian nên chưa kết luận.

Đây là tri-state, hay mô hình ba trạng thái. Boolean chỉ có true/false thường làm mất một câu hỏi quan trọng: “false vì bị chặn, hay vì API (giao diện lấy dữ liệu) không trả kết quả?”

Ví dụ CalendarValueHistory() trả -1 có nghĩa lời gọi lỗi, không chứng minh rằng khoảng thời gian đó không có sự kiện. Tài liệu còn liệt kê timeout và trường hợp mảng không đủ chỗ. CalendarValueHistory

b. Quy tắc gộp có thứ tự ưu tiên

Precedence, hay thứ tự ưu tiên, trong demo này:

  1. có ít nhất một hard BLOCK → kết quả gộp BLOCK;
  2. không có block nhưng có UNKNOWN → kết quả gộp UNKNOWN;
  3. chỉ khi mọi gate PASS → kết quả gộp PASS.

Một hard block, hay điều kiện chặn cứng, đã đủ bằng chứng để dừng, ví dụ nằm ngoài quy tắc phiên. Nếu gate khác chưa đọc được, engine vẫn trả BLOCK và ghi thêm UNKNOWN.

Fail-closed, hay đóng an toàn, nghĩa là thiếu bằng chứng thì không tự cho qua. Nó không đồng nghĩa đóng position hoặc tắt cả EA.

Hình 1 — Chỉ tổ hợp toàn PASS mới tạo kết quả PASS; lỗi dữ liệu giữ nguyên UNKNOWN.

c. Thứ tự chạy không được đổi ý nghĩa

Bạn có thể chạy gate rẻ trước để tiết kiệm thời gian. Tuy nhiên, tối ưu kiểu short-circuit — dừng sớm — không được làm mất evidence cần thiết hoặc đổi kết quả đã công bố. Policy phải nói rõ gate nào bắt buộc log ngay cả khi đã có BLOCK.

Hình 2 — Filter chỉ phân loại candidate theo context; PASS filter chưa phải quyền giao dịch.

3. Gate Matrix demo: một UNKNOWN giữ cả kết quả

a. Khóa candidate và snapshot

Candidate demo:

demo-v1:X:M5:10:05:CROSS_UP

Filter đọc context tại 10:05:02 theo server time, tức giờ máy chủ giao dịch, và dùng bộ quy tắc filter-v1. Local time là giờ máy cá nhân; hai loại giờ không được coi là giống nhau chỉ vì cùng hiển thị 10:05.

MQL5 tách TimeTradeServer, TimeCurrent, TimeLocalTimeGMT. Economic Calendar dùng trade-server time, không dùng local time. Date and Time, CalendarValueHistory

b. Năm gate minh họa

  1. Freshness — độ mới: tick age 2 giây ≤ 5 giâyPASS.
  2. Session — phiên giao dịch: 10:05 nằm trong khoảng demo 09:00–16:30PASS.
  3. News — lịch tin: calendar timeout → UNKNOWN.
  4. Volatility — số đo biến động: 1,2 ≤ trần demo 2,0PASS.
  5. Cooldown — thời gian chờ: 20 phút ≥ 15 phútPASS.

SymbolInfoTick() đưa giá hiện tại và thời gian cập nhật cuối vào MqlTick; trường time_msc cho thời gian tới mili giây. Đây là dữ liệu để tính freshness, không bảo đảm tick “đủ mới” theo mọi chiến lược. SymbolInfoTick, MqlTick

SymbolInfoSessionTrade() nhận symbol, ngày trong tuần và session index để trả giờ bắt đầu/kết thúc; hàm trả false khi không lấy được dữ liệu yêu cầu. false không tự chứng minh “ngoài phiên”. SymbolInfoSessionTrade

c. Kết quả gộp

Bốn gate pass, không có hard block, nhưng News là unknown. Theo precedence, aggregate result — kết quả gộp — là:

UNKNOWN · NEWS_DATA_UNAVAILABLE · RECHECK

Engine không được bỏ gate lỗi rồi kết luận PASS. Nó cũng không được nói chắc “có news”; điều chắc duy nhất là calendar call chưa cung cấp bằng chứng đáng tin.

Biến thể thứ hai: News đã PASS nhưng Session là BLOCK. Aggregate trả BLOCK · OUT_OF_SESSION. Một giấy tờ hết hạn đã đủ dừng kiểm tra, dù máy đọc giấy tờ khác đang lỗi.

Hình 3 — Một lỗi quá thời gian của calendar giữ kết quả ở UNKNOWN; bốn PASS khác không lấp được bằng chứng thiếu.

4. Sáu lỗi phổ biến và giới hạn cần nhớ

a. Filter tự tạo signal

Filter đọc lại indicator rồi phát crossover mới sẽ lấn việc Signal Engine. Input đúng là candidate cố định cùng source bar và ID.

b. Biến lỗi giao diện dữ liệu thành “không có gì”

false, -1, lỗi quá thời gian hoặc mảng thiếu chỗ là trạng thái kỹ thuật. Chỉ khi API trả thành công và dữ liệu hợp lệ mới được kết luận có hay không có sự kiện.

c. Trộn giờ máy cá nhân với giờ máy chủ

Calendar dùng giờ máy chủ giao dịch. Session cũng phải có time basis — cơ sở thời gian — rõ ràng. Chuyển đổi âm thầm dễ đặt candidate vào sai cửa sổ.

d. Mỗi gate đọc một snapshot khác

Freshness đọc lúc 10:05:02, News đọc 10:05:20, Session dùng ngày khác mà vẫn ghép chung một kết quả sẽ tạo bằng chứng không đồng nhất. Snapshot cần dấu thời gian và thời hạn sử dụng.

e. Chỉ trả Boolean

Một chữ false không cho biết bị block, chưa có dữ liệu hay code lỗi. Tri-state, reason code và evidence giúp log có thể kiểm lại.

f. Dùng PASS như quyền gửi yêu cầu

Filter pass chưa nói gì về lot, ký quỹ, quyền tài khoản hoặc trạng thái khẩn cấp. Candidate phải đi qua bộ phận kế tiếp.

Giới hạn: filter giúp thực thi quy tắc nhất quán hơn, không chứng minh signal có lợi thế và không bảo đảm lợi nhuận. Quá nhiều gate còn có thể mâu thuẫn hoặc không bao giờ pass.

5. Checklist và Gate Matrix 15 phút

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

  1. Candidate ID và source bar là gì?
  2. Context snapshot được chụp lúc nào?
  3. Mọi gate dùng cùng cơ sở thời gian chưa?
  4. Policy version đã khóa chưa?
  5. Mỗi gate có bộ phận sở hữu rõ không?
  6. Input của gate đến từ đâu?
  7. Dữ liệu đủ, mới và hợp lệ chưa?
  8. Output là PASS, BLOCK hay UNKNOWN?
  9. Reason code có cụ thể không?
  10. Evidence có tái hiện được không?
  11. Precedence được viết trước chưa?
  12. Bộ phận nào nhận kết quả tiếp?

Điểm dừng: không rõ cơ sở thời gian, dấu thời gian hoặc trạng thái API thì dùng UNKNOWN. Không chọn giá trị cũ hay coi lỗi là khoảng trống an toàn.

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

Dùng giấy hoặc Google Sheets trong 10–15 phút. Không mở MT5, không gửi giao dịch và không dùng tiền thật.

c. Mẫu đối chiếu

Gate Evidence demo Result Reason
Freshness age 2s ≤ 5s PASS FRESH
Session 10:05 ∈ 09:00–16:30 PASS IN_SESSION
News calendar timeout UNKNOWN NEWS_DATA_UNAVAILABLE
Volatility 1,2 ≤ 2,0 PASS WITHIN_CAP
Cooldown 20m ≥ 15m PASS COOLDOWN_DONE
Aggregate no BLOCK + one UNKNOWN UNKNOWN RECHECK

Đổi News thành PASS và Session thành BLOCK; kết quả gộp phải thành BLOCK. Bài tập cần một bảng cùng dòng ưu tiên, không phải mẫu giao dịch.

6. Tổng kết: lọc bối cảnh, không cấp quyền trade

a. Năm ý chính

  • Filter Engine nhận candidate và context snapshot, không tạo signal mới.
  • Mỗi gate trả PASS, BLOCK hoặc UNKNOWN cùng evidence.
  • Hard BLOCK ưu tiên; không có block mà còn UNKNOWN thì phải recheck.
  • Cơ sở thời gian, dấu thời gian và phiên bản bộ quy tắc là một phần của kết quả.
  • PASS filter không thay Risk Engine hoặc bộ phận thực thi.

Bài trước là Signal Engine trong EA. Bài tiếp theo là Risk Engine trong EA #9.

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

  • Vì sao Boolean không đủ cho một filter gate?
  • Calendar timeout nên trả trạng thái nào?
  • Khi nào một UNKNOWN vẫn đi cùng kết quả BLOCK?
  • Vì sao PASS không phải quyền gửi giao dịch?

c. Gợi ý đáp án

Xem gợi ý câu 1

Boolean không tách được bị chặn với chưa đủ dữ liệu. → xem mục 2.

Xem gợi ý câu 2

Trả UNKNOWN vì lỗi chưa chứng minh có hay không có sự kiện. → xem mục 3.

Xem gợi ý câu 3

Một hard BLOCK đã đủ dừng, nhưng UNKNOWN khác vẫn phải được log. → xem mục 2.

Xem gợi ý câu 4

Risk và Execution còn các điều kiện ngoài phạm vi Filter Engine. → xem mục 1.

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

Thuật ngữ Giải thích ngắn
Candidate Ứng viên tín hiệu chờ kiểm tiếp
Context snapshot Bản chụp bối cảnh cùng thời điểm
Gate Cổng kiểm một điều kiện
Tri-state Mô hình ba kết quả
UNKNOWN Chưa đủ bằng chứng để kết luận
Evidence Dữ liệu giúp tái hiện kết quả
Precedence Thứ tự ưu tiên khi gộp gate
Freshness Độ mới của dữ liệu
Cooldown Khoảng chờ giữa hai hành động

e. Nguồn tham khảo

Nội dung 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. EA và dữ liệu ngoài có thể lỗi; thị trường luôn có rủi ro mất vốn.