Trả lời ngắn: Risk Engine trong EA là bộ thực thi chính sách rủi ro cấp tài khoản và toàn hệ thống. Nó nhận một ứng viên hành động, phần khối lượng dự kiến cùng trạng thái rủi ro hiện tại, rồi trả ALLOW, BLOCK, HALT hoặc UNKNOWN kèm lý do; nó không tự gửi giao dịch.

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

  • Vì sao tính được khối lượng chưa có nghĩa là được phép giao dịch.
  • Trạng thái rủi ro (Risk State) gồm dữ liệu nào và vì sao phần hạn mức đã giữ chỗ phải được tính.
  • Cách phân biệt BLOCK, HALT, UNKNOWNALLOW.
  • Vì sao kiểm tra trước khi gửi thành công vẫn chưa bảo đảm thực thi.

Lưu ý giáo dục: Mọi số, ngưỡng và mã chính sách trong bài đều là demo thiết kế phần mềm. Chúng không phải mức rủi ro khuyến nghị, tín hiệu giao dịch hay lời hứa hạn chế được mọi khoản lỗ.

1. Risk Engine giữ van tổng, không phải máy tính khối lượng

a. Input vào và quyết định đi ra

Một ứng viên hành động (candidate) là bản ghi bộ tạo ứng viên (Signal Engine) tạo ra và bộ kiểm bối cảnh (Filter Engine) đã kiểm, chưa phải yêu cầu đã gửi. Candidate đi cùng bằng chứng tính khối lượng (sizing evidence), cho biết Money Management đã đề xuất khối lượng và rủi ro dự kiến. Risk Engine còn nhận:

  • trạng thái rủi ro (Risk State) — ảnh chụp tài khoản, danh mục, phần giữ chỗ và policy tại một thời điểm;
  • phần hạn mức đang gánh và phần đã giữ chỗ;
  • bộ quy tắc rủi ro (risk policy) — các giới hạn cùng cách xử lý đã được định nghĩa;
  • phiên bản policy và dấu thời gian;
  • trạng thái quyền giao dịch, dừng hệ thống và kiểm tra yêu cầu dự kiến.

Đầu ra là quyết định rủi ro (Risk Decision) gồm trạng thái, mã lý do, bằng chứng và hành động tiếp theo. Bốn trạng thái trong bài:

  • ALLOW: đủ bằng chứng và candidate qua policy risk;
  • BLOCK: từ chối riêng candidate hiện tại;
  • HALT: dừng nhận mức phơi nhiễm mới ở cấp hệ thống;
  • UNKNOWN: thiếu, cũ hoặc mâu thuẫn dữ liệu nên phải đọc lại.

Mức phơi nhiễm (exposure) là lượng tiền hoặc khối lượng đang chịu biến động thị trường. ALLOW chỉ nói lớp Risk đã cho đi tiếp.

b. Tách ba phần chịu trách nhiệm cho khỏi nhập nhằng

Money Management đề xuất khối lượng và ngân sách của candidate. Risk Engine xét hệ thống có nhận thêm phần đó không. Bộ thực thi (Execution Engine) mới gửi yêu cầu và đọc kết quả. Risk âm thầm giảm lot — đơn vị biểu diễn khối lượng — sẽ làm bằng chứng của Money Management lệch; Execution bỏ qua HALT sẽ phá quy tắc.

c. Ví dụ bảng điện tổng

Một chiếc ấm 1.500 W giống candidate đã có sizing. Aptomat tổng còn phải nhìn các thiết bị đang chạy. Phép so sánh chỉ giải thích trách nhiệm; trong EA vẫn phải đọc giá, ký quỹ, quyền tài khoản và trạng thái yêu cầu thật.

Hình 1 — Risk Engine chỉ mở van khi Risk State, hạn mức, phần giữ chỗ và kiểm tra trước khi gửi (preflight) đều đủ bằng chứng.

2. Risk State phải chụp đủ trước khi quyết định

a. Trạng thái tài khoản tại một thời điểm

Ảnh chụp tài khoản (account snapshot) là nhóm số liệu có cùng dấu thời gian:

  • balance: số dư đã ghi nhận;
  • equity: giá trị tài khoản sau khi tính kết quả đang thả nổi;
  • margin: phần ký quỹ đang dùng;
  • free margin: phần còn tự do theo cách tính của tài khoản;
  • margin level: tỷ lệ equity so với margin;
  • quyền giao dịch và chế độ tài khoản.

MQL5 liệt kê các trường này cùng ACCOUNT_TRADE_ALLOWED, ACCOUNT_TRADE_EXPERT và ngưỡng xử lý thiếu ký quỹ (stop-out) trong Account Properties. AccountInfoInteger() đọc thuộc tính số nguyên như quyền (permission) và chế độ giao dịch (trade mode). Nếu EA không có quyền, Risk Engine phải ghi đúng bằng chứng đó. Account Properties, AccountInfoInteger

b. Trạng thái danh mục: hệ thống đang gánh gì

Trạng thái danh mục (Portfolio State) gom exposure theo mã sản phẩm (symbol), nhóm hoặc toàn tài khoản; lỗ đã ghi nhận trong ngày; kết quả đang thả nổi và các giới hạn policy.

Hai khái niệm cần nói rõ:

  • committed risk: phần rủi ro hệ thống đang gánh qua vị thế hoặc cam kết hiện hữu;
  • candidate risk: phần rủi ro candidate mới đang xin thêm.

Daily loss là tổng lỗ trong ngày; drawdown là mức giảm so với mốc policy. Policy phải nêu mốc ngày, múi giờ, có tính khoản thả nổi không và cách reset. Bài chỉ dùng số demo.

c. Sổ hạn mức: phần đã giữ chỗ nhưng chưa thành vị thế

Sổ hạn mức giữ chỗ (Reservation Ledger) ghi yêu cầu đang xử lý đã chiếm bao nhiêu dung lượng hạn mức (capacity). Rủi ro đã giữ chỗ (reserved risk) là phần đã giữ, chưa chắc thành vị thế. Như khách sạn có 10 phòng, 8 phòng có khách và một phòng đang thanh toán: nhân viên sau phải tính cả phòng đã giữ. Risk Engine cũng tính:

committed + reserved + candidate

Nếu hai worker cùng đọc rồi cùng ALLOW, hệ thống có thể tiêu trùng hạn mức.

d. Trạng thái quy tắc và độ mới

Phiên bản quy tắc (policy version) là mã bộ quy tắc đang áp dụng. Cờ giữ trạng thái dừng (halt latch) ngăn HALT tự biến mất khi vòng đọc sau thiếu dữ liệu. Policy phải quy định điều kiện bật và đặt lại.

Fresh nghĩa là dữ liệu còn mới trong thời hạn policy; stale nghĩa là đã quá hạn. Nếu account snapshot lúc 10:00, portfolio lúc 10:04 và reservation ledger không có timestamp, đó không phải một Risk State thống nhất.

Đóng an toàn (fail-closed) nghĩa thiếu bằng chứng thì không tự cho qua; trường hợp này về UNKNOWN, không phải tự đóng vị thế.

Hình 2 — Hạn mức đã giữ chỗ phải được tính cùng risk đang gánh trước khi nhận candidate mới.

3. Chuỗi xử lý (pipeline) sáu bước và thứ tự ưu tiên

a. Bước 1–2: khóa đầu vào và chụp trạng thái

Engine đối chiếu mã candidate, bằng chứng sizing và phiên bản policy; candidate A không dùng khối lượng của B. Sau đó engine khóa ảnh chụp (freeze) account, portfolio, reservations và dấu thời gian cho lần quyết định. Đây là khóa bằng chứng để kiểm lại, không phải ngừng thị trường.

b. Bước 3: kiểm giới hạn chặn cứng

Giới hạn chặn cứng (hard limit) là điều kiện vi phạm sẽ không cho nhận exposure mới:

  • EA không có quyền giao dịch;
  • tài khoản hoặc symbol không ở chế độ policy cho phép;
  • cờ HALT đang bật;
  • daily loss vượt trần demo;
  • exposure tổng hoặc mức tập trung (concentration) vào một symbol/nhóm vượt trần.

Mỗi symbol có trade mode, thuộc tính hợp đồng và ký quỹ riêng. Symbol Properties

c. Bước 4: giữ chỗ không cho chen ngang

Engine tính:

committed risk + reserved risk + candidate risk ≤ portfolio cap

Nếu còn capacity, engine cần giữ chỗ nguyên tử (atomic reservation) — thao tác không cho tiến trình khác chen giữa lúc đọc và ghi. Giữ chỗ thất bại vì candidate khác vừa lấy capacity thì phải đọc lại hoặc BLOCK, không dùng kết quả cũ.

d. Bước 5: preflight request

Kiểm tra trước khi gửi (preflight) là kiểm yêu cầu dự kiến. OrderCheck() kiểm yêu cầu và mức đủ tiền, rồi điền MqlTradeCheckResult với mã kết quả (retcode), balance, equity, margin, free margin, margin level và ghi chú (comment). OrderCheck, MqlTradeCheckResult

Kết quả true không bảo đảm yêu cầu sẽ được thực thi; giá, margin, quyền hoặc môi trường có thể đổi. AlgoBook nói rõ kiểm thành công chưa bảo đảm OrderSend/OrderSendAsync thành công. Ước tính margin và phí hoa hồng (commission) cũng phụ thuộc môi trường. MQL5 AlgoBook — OrderCheck, Account margin settings

e. Bước 6: gộp thành phiếu quyết định rủi ro

Thứ tự ưu tiên demo:

  1. vi phạm cấp hệ thống hoặc halt latch đang bật → HALT;
  2. lỗi chỉ thuộc candidate → BLOCK;
  3. không có breach nhưng evidence thiếu, stale hoặc mâu thuẫn → UNKNOWN;
  4. mọi gate bắt buộc đều pass → ALLOW.

HALT đứng trước vì candidate riêng không được lấn trạng thái hệ thống. BLOCK từ chối candidate; UNKNOWN thiếu evidence; ALLOW chỉ qua lớp Risk tại snapshot đó.

Hình 3 — Vi phạm cấp hệ thống đứng trước lỗi riêng candidate; thiếu bằng chứng không được tự biến thành ALLOW.

4. Phiếu quyết định rủi ro demo: bốn PASS vẫn chưa đủ

a. Bộ số dùng cùng một đơn vị

Đây là dữ liệu tự xây, dùng đơn vị U, không phải cấu hình tiền thật:

  • account reference: 10.000 U;
  • candidate risk do Money Management đề xuất: 50 U;
  • committed + reserved risk hiện tại: 180 U;
  • portfolio cap: 250 U;
  • realized loss trong ngày: 120 U;
  • floating loss được policy demo tính thêm: 40 U;
  • daily loss cap: 200 U.

Hai phép cộng:

180 + 50 = 230 U ≤ 250 U

120 + 40 = 160 U ≤ 200 U

Candidate chưa vượt portfolio cap; daily loss chưa chạm halt cap; permission và preflight cùng PASS.

b. Evidence bị thiếu ở sổ giữ chỗ

Sổ Reservation Ledger đã quá tuổi policy. Engine không biết 180 U còn đúng hay candidate khác vừa giữ chỗ thêm.

Final card:

Cổng kiểm (gate) Bằng chứng demo Kết quả Lý do
Permission ACCOUNT_TRADE_EXPERT = true PASS EA_ALLOWED
Portfolio cap 180 + 50 = 230 U ≤ 250 U PASS WITHIN_CAP
Daily loss 120 + 40 = 160 U ≤ 200 U PASS BELOW_HALT_CAP
Reservation freshness ledger stale UNKNOWN RESERVATION_STATE_STALE
Preflight OrderCheck pass PASS REQUEST_CHECKED
Kết quả gộp một UNKNOWN, không vi phạm chặn cứng UNKNOWN RECHECK

Kết quả đúng là:

UNKNOWN · RESERVATION_STATE_STALE · RECHECK

Bốn PASS không lấp được evidence thiếu. Engine phải đọc lại ledger.

c. Ba biến thể để thấy ranh giới

Biến thể A: ledger fresh, tổng 230 U, mọi gate pass → ALLOW; Execution xử lý bước sau.

Biến thể B: daily loss 220 U > 200 UHALT_NEW_EXPOSURE, dừng exposure mới chứ không tự đóng vị thế.

Biến thể C: candidate làm symbol vượt cap riêng → BLOCK_CANDIDATE; candidate khác chưa chắc bị chặn.

Hình 4 — Bốn gate PASS vẫn chưa đủ khi trạng thái giữ chỗ đã cũ và cần đọc lại.

5. Bảy lỗi phổ biến và giới hạn thật

a. Risk Engine tự sửa lot trong im lặng

Nếu sizing đề xuất 0,25 mà Risk đổi thành 0,10, candidate không còn khớp bằng chứng. Hãy BLOCK hoặc yêu cầu tính lại với lý do rõ.

b. Chỉ nhìn balance

Balance chưa phản ánh kết quả thả nổi, margin đang dùng hay quyền giao dịch. Cần đủ trường theo policy.

c. Quên reserved risk

Yêu cầu chưa thành vị thế vẫn có thể chiếm capacity. Bỏ ledger dễ làm hai candidate tiêu trùng hạn mức.

d. Đọc rồi ghi không nguyên tử

Hai tiến trình cùng thấy còn 70 U, mỗi bên giữ 50 U, cuối cùng vượt cap 30 U. Cần giữ chỗ nguyên tử.

e. Trộn snapshot khác thời điểm

Account mới, portfolio cũ và ledger không dấu thời gian không tạo bằng chứng thống nhất. Chưa đồng bộ thì trả UNKNOWN.

f. Xem OrderCheck là bảo đảm

Preflight PASS chỉ phản ánh lúc kiểm. Execution vẫn có thể gặp giá, margin, quyền, máy chủ hoặc retcode khác.

g. Hiểu HALT là close-all

HALT_NEW_EXPOSURE dừng rủi ro mới. Đóng vị thế hiện tại là workflow riêng; không gộp hai hành động vào một chữ “dừng”.

Giới hạn: Risk Engine chỉ thực thi policy. Nó không chứng minh lợi thế, dự báo khoảng nhảy giá (gap)/trượt giá (slippage), bảo đảm lỗ thực tế bằng ngân sách hay chữa dữ liệu sai.

6. Checklist và Risk Ledger 15 phút

a. Mười hai câu trước khi ALLOW

  1. Candidate ID có khớp sizing evidence không?
  2. Candidate risk được tính dưới policy version nào?
  3. Account snapshot có timestamp và còn fresh không?
  4. Portfolio snapshot có cùng cơ sở thời gian không?
  5. Permission của EA và trade mode đã đọc chưa?
  6. Committed risk hiện tại là bao nhiêu?
  7. Reserved risk hiện tại là bao nhiêu?
  8. Candidate xin thêm bao nhiêu?
  9. Tổng mới có nằm trong portfolio/symbol cap không?
  10. Daily loss/drawdown đã chạm halt rule chưa?
  11. Preflight có retcode, margin và comment để kiểm lại không?
  12. Decision có trạng thái, reason, evidence và next action không?

Điểm dừng: thiếu timestamp, policy version hoặc reservation evidence thì trả UNKNOWN. Không lấy số cũ, không ước chừng cho qua.

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

Dùng giấy hoặc Google Sheets trong 10–15 phút. Chép bảng ở mục 4, không mở MT5, không kết nối tài khoản và không dùng tiền thật.

Lượt 1 giữ ledger stale: kết quả phải là UNKNOWN. Lượt 2 đổi ledger thành fresh: kết quả thành ALLOW nếu không gate nào khác đổi. Lượt 3 đổi daily loss thành 220 U: precedence phải đưa kết quả về HALT, dù preflight vẫn PASS.

c. Mẫu đối chiếu

Mẫu đầu ra đã điền:

Trường Giá trị
Candidate C-009
Policy risk-demo-v1
Committed + reserved 180 U
Candidate risk 50 U
New total 230 U / cap 250 U
Daily loss 160 U / cap 200 U
Reservation evidence STALE
Final UNKNOWN / RECHECK

Artifact cần giữ là bảng evidence cùng dòng precedence, không phải một trading setup.

7. Tổng kết: giữ đúng hạn mức trước khi gửi

a. Năm ý chính

  • Risk Engine giữ giới hạn cấp tài khoản/hệ thống; Money Management chỉ đề xuất sizing.
  • Risk State phải gồm account, portfolio, policy và reservation evidence có dấu thời gian.
  • Công thức đúng vẫn có thể sai hệ thống nếu hai candidate tiêu trùng capacity.
  • HALT, BLOCK, UNKNOWNALLOW có phạm vi khác nhau; ALLOW chưa phải gửi giao dịch.
  • Preflight là một lớp bằng chứng, không bảo đảm Execution thành công hoặc loại bỏ rủi ro.

Bài trước là Filter Engine trong EA. Bài tiếp theo là Session Engine trong EA #10.

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

  • Vì sao candidate đã có khối lượng vẫn cần Risk Engine?
  • Reserved risk khác committed risk ở điểm nào?
  • Khi nào BLOCK khác HALT?
  • Vì sao OrderCheck() pass vẫn chưa đủ để nói giao dịch sẽ thực thi?

c. Gợi ý đáp án

Xem gợi ý câu 1

Khối lượng chỉ mô tả nhu cầu riêng candidate; Risk Engine còn kiểm hạn mức tổng, trạng thái dừng và evidence. → xem mục 1.

Xem gợi ý câu 2

Committed risk đang được gánh; reserved risk đã giữ chỗ cho request chưa hoàn tất. → xem mục 2.

Xem gợi ý câu 3

BLOCK từ chối candidate cụ thể; HALT dừng nhận exposure mới ở cấp hệ thống. → xem mục 3.

Xem gợi ý câu 4

Preflight chỉ phản ánh request và môi trường tại lúc kiểm; chúng có thể đổi trước hoặc trong lúc gửi. → xem mục 3.

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

Thuật ngữ Giải thích ngắn
Risk Engine Bộ thực thi chính sách rủi ro cấp tài khoản và hệ thống.
Candidate Ứng viên hành động, chưa phải giao dịch đã gửi.
Risk State Ảnh chụp account, portfolio, policy và reservations.
Exposure Phần tiền hoặc khối lượng đang chịu biến động thị trường.
Reserved risk Phần hạn mức đã giữ cho request chưa hoàn tất.
Hard limit Giới hạn vi phạm sẽ chặn hoặc dừng nhận exposure mới.
Preflight Kiểm request dự kiến trước khi gửi thật.
Fail-closed Thiếu bằng chứng thì không tự cho qua.
HALT Trạng thái dừng nhận exposure mới ở cấp hệ thống.

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. Giao dịch luôn có rủi ro mất vốn; phần mềm quản trị rủi ro không thể loại bỏ rủi ro thị trường, dữ liệu hoặc thực thi.