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ư, mức risk, lot, Stop Loss hay cấu hình dùng tiền thật.

Trả lời ngắn: Quản trị rủi ro cho EA là đặt giới hạn trước, trong và sau khi gửi lệnh. Mỗi giới hạn phải nói rõ đo số nào, khi vượt thì chương trình dừng hoặc giảm việc gì, ai kiểm tra và khi nào được chạy lại.

Mức dừng lỗ chỉ giới hạn một vị thế; nó không xử lý cấu hình sai, yêu cầu bị từ chối, nhiều vị thế chồng rủi ro, dữ liệu cũ hay MT5 mất kết nối.

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

  • Sáu layer risk khác nhau ở đâu.
  • Soft block, hard stop và kill switch dùng khi nào.
  • Candidate action đi qua risk gates ra sao.
  • Cách lập risk register không cần chọn % thật.

1. Risk management là hệ thống giới hạn

a. Risk không chỉ là mức lỗ mỗi trade

Một EA có Stop Loss vẫn có thể:

  • gửi duplicate request;
  • dùng volume sai step;
  • mở chồng exposure;
  • giữ stale state sau restart;
  • bỏ qua reject;
  • tiếp tục khi data/heartbeat mất.

Risk management hỏi “hệ thống được phép làm gì trong state nào, và khi sai thì dừng ra sao?”.

b. Sáu trường của một control

Mỗi risk control cần:

  1. Metric: đo gì.
  2. Policy: điều kiện pass/fail do owner phê duyệt.
  3. Action: BLOCK, REDUCE, SAFE, HALT...
  4. Reset: khi nào được chạy lại.
  5. Owner: ai chịu trách nhiệm.
  6. Evidence: log/state/alert nào chứng minh.

Không có con số universal. MaxSpread 15 trong bài chỉ là demo để trace, không setting.

Hình 1 — Risk stack đủ lớp mới chặn được lỗi trước, trong và sau action.

c. Fail closed hay fail open

Fail closed là khi thiếu bằng chứng thì chặn action. Fail open là tiếp tục. Với data/position/exposure cần cho quyết định risk, fail closed thường dễ kiểm hơn; nhưng policy cụ thể do system owner quyết.

Ví dụ total exposure không đọc được: không giả nó bằng 0. Action demo BLOCK_ALL — EXPOSURE_UNKNOWN.

2. Sáu layer risk

a. Input validation

Kiểm type, range, unit, dependency, preset version ở OnInit. Input invalid nên fail init có reason. Layer này ngăn cấu hình vô nghĩa đi sâu.

Ví dụ TimerSeconds=0 khi valid range 1..3600FAIL_INIT.

b. Pre-trade

Kiểm trước request:

  • data freshness;
  • symbol trade mode/session;
  • spread/cost;
  • candidate size/exposure;
  • account permission/margin state;
  • cooldown/duplicate guard.

MQL5 OrderCheck() kiểm tra khả năng thực hiện request và có thể trả funds/margin info, nhưng tài liệu lưu ý check thành công không bảo đảm operation chắc chắn thực thi. MQL5 Reference — OrderCheck

Pre-trade check là cần, không đủ.

c. Execution và Position

Execution risk kiểm request result, retcode, retry/idempotency, slippage/deviation và timeout. Position risk reconcile request/result với order/deal/position state.

Nếu request bị reject, position module không được đoán fill. Nếu có orphan position (account state không map vào internal owner), action có thể HALT + RECONCILE.

d. Portfolio/Account và Operations

Portfolio layer cộng tổng exposure, correlation, margin, simultaneous drawdown và shared symbol. Account properties cung cấp balance/equity/margin/free margin/margin level state. MQL5 Reference — Account Information

Operations layer kiểm terminal/network, heartbeat, clock, disk/log, external dependency, version drift và alert delivery.

Một strategy pass nhưng heartbeat stale vẫn phải dừng theo policy.

e. Risk budget và limit hierarchy

Risk budget là phần capacity được phân cho strategy/component theo policy. Nó không nhất thiết là một % per trade; có thể là exposure, margin, concurrent positions, request rate hoặc loss budget.

Hierarchy ví dụ:

ACCOUNT LIMIT → STRATEGY LIMIT → SYMBOL LIMIT → ACTION LIMIT

Action pass symbol limit nhưng account limit fail thì vẫn BLOCK. Limit cha phải thắng. Nếu hai EA tự cấp budget mà không có allocator chung, tổng có thể vượt.

Budget còn cần reservation/release. Candidate giữ capacity trước request; khi reject/cancel phải release đúng ID. Không release tạo “kẹt budget”; release hai lần tạo oversubscription.

3. Candidate đi qua decision gates

a. Packet demo

Candidate C-42:

  • input valid;
  • snapshot fresh;
  • spread 18;
  • demo cap 15;
  • no request yet.

Input gate PASS. Pre-trade gate BLOCK vì 18 > 15. Execution/position không chạy. Log:

C-42 | PRE_TRADE | BLOCK_SPREAD | observed=18 | policy=15

Hình 2 — Gate fail phải dừng packet trước side effect và giữ nguyên reason.

b. Execution reject

Candidate C-43 pass pre-trade. Request R-43 gửi, server trả reject. MqlTradeResult chứa retcode và dữ liệu result liên quan; code phải đọc/ghi bằng chứng. MQL5 Reference — MqlTradeResult

Policy demo:

  • retryable reason + dưới retry cap → controlled retry same action ID;
  • non-retryable → SAFE;
  • unknown result → HALT/reconcile.

Không retry vô hạn; nó có thể tạo storm/duplicate.

c. Timeout không đồng nghĩa failure chắc chắn

Timeout chỉ nói terminal chưa nhận confirmation trong thời gian policy. Server có thể đã xử lý. Nếu retry bằng action ID mới, duplicate risk tăng.

State nên là UNKNOWN_PENDING_RECONCILE, không ngay lập tức FAILED. Recovery đọc orders/deals/positions và map request/comment/magic/ticket theo contract. Chỉ sau reconcile mới quyết định retry hay halt.

Đây là ví dụ classic “uncertain outcome”: control tốt bảo toàn uncertainty trong state/log, không biến nó thành câu trả lời thuận tiện.

d. Position mismatch

Request được accept nhưng account snapshot có position không khớp internal state. Position gate gắn ORPHAN=1, action HALT.

Reset chỉ sau reconcile có owner/evidence. Timer tự reset không đủ.

e. Account-level aggregation

EA A và B mỗi cái pass individual exposure cap, nhưng tổng account có thể vượt portfolio policy. Risk ownership phải ở layer thấy toàn account.

Cùng symbol, opposite positions không tự triệt risk; netting/hedging mode, costs và close behavior khác. Không dùng sum ký hiệu đơn giản làm truth nếu account mode chưa rõ.

4. Sai lầm, giới hạn và kill switch

a. Soft block, hard stop, kill switch

  • Soft block: bỏ candidate hiện tại; tự xét lại event sau.
  • Hard stop/HALT: ngừng action tới khi manual/recovery gate pass.
  • Kill switch: control ngắt hoạt động giao dịch theo trigger khẩn cấp.

Kill switch không phải nút thần. Nó cần:

  • trigger rõ;
  • authority;
  • action semantics (block new? cancel pending? close?);
  • acknowledgement;
  • recovery/reset;
  • audit log.

Bài không hướng dẫn close live. Quyết định close/cancel có thể tự tạo slippage/risk và cần runbook riêng.

b. Năm sai lầm

  1. Chỉ có Stop Loss.
  2. Control nằm sau side effect.
  3. Fail open khi data unknown.
  4. Reset tự động không evidence.
  5. Mỗi EA tự nhìn risk, không aggregation.

c. Limits có thể xung đột

Risk cap A yêu cầu close; operations rule B chặn execution khi data stale. Engine phải có priority matrix. Không để hai controls gọi action trái chiều.

Ví dụ data stale + exposure high: safe action có thể block new requests và escalate, không đoán price để close. Policy thật phải được owner duyệt/test.

d. Risk control cũng có model risk

Metric có thể sai: spread unit sai, exposure conversion sai, clock lệch, equity stale. Control phải test fault injection.

Câu chắc chắn: control giảm một failure mode trong scope test.

Câu có điều kiện: nếu metric/owner/reset/evidence đúng, layered controls có thể giảm risk operational — không loại market loss.

Nếu trước đây bạn nghĩ “có kill switch = an toàn”, sửa thành “kill switch là một control cần được test”.

e. Monitoring và escalation

Control tự động cần monitoring độc lập: heartbeat, alert delivery, queue lag và last successful snapshot. Alert gửi thất bại là một incident, không phải log phụ.

Escalation card nên có severity, owner, acknowledgement time, containment và recovery evidence. Ví dụ ORPHAN_POSITION severity high: block new requests, snapshot state, notify owner, không auto-resume.

Test alert bằng synthetic event định kỳ; không chờ sự cố thật mới biết kênh chết.

5. Checklist và risk-register lab

a. Checklist

  1. Liệt kê assets/actions cần bảo vệ.
  2. Vẽ sáu layer.
  3. Với mỗi control ghi metric/policy/action/reset/owner/evidence.
  4. Đặt control trước side effect.
  5. Gắn reason code.
  6. Phân soft/hard/kill.
  7. Định priority khi xung đột.
  8. Test unknown/stale/reject/restart.
  9. Test recovery và manual acknowledgement.
  10. Review account aggregation.

Hình 3 — Risk register biến chữ “an toàn” thành control có owner và bằng chứng.

b. Bài tập 10–15 phút

Dùng giấy/Sheets, không terminal/account/tiền thật.

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

Layer Metric giả Policy Action Reset Evidence
Input range invalid FAIL_INIT manual fix init log
Pre-trade spread 18 cap 15 demo BLOCK next event reason
Execution rejects 3 retry cap SAFE review retcodes
Position orphan 1 must be 0 HALT reconcile snapshot
Portfolio total exposure unknown complete data BLOCK_ALL data good account log
Operations heartbeat stale timeout KILL_SWITCH manual alert

Khoanh exposure unknown: fail closed, không thay bằng 0. Kết quả mong đợi là mỗi row có reset/evidence; không chọn threshold live.

c. Fault cards

Thêm ba card: DATA_STALE, SERVER_REJECT, RESTART_UNKNOWN_STATE. Với từng card, điền layer bắt đầu, action và recovery.

Nếu một card không có owner hoặc reset, giữ NEEDS DESIGN.

Thử thêm card ALERT_CHANNEL_DOWN: Operations phải phát hiện qua synthetic heartbeat, lưu evidence cục bộ và chuyển escalation sang kênh dự phòng đã duyệt. Không coi “đã gọi API gửi alert” là người trực đã nhận.

d. Điểm dừng

Dừng nếu control không có reason/evidence, kill switch chưa test, recovery tự động mơ hồ hoặc account aggregation thiếu.

6. Tổng kết

a. Năm ý chính

  • Risk là layered system, không chỉ Stop Loss.
  • Mỗi control cần metric/policy/action/reset/owner/evidence.
  • Pre-trade pass không guarantee execution.
  • Portfolio/operations nhìn failure mà strategy không thấy.
  • Kill switch cần trigger, semantics, recovery và audit.

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

  • Khi exposure unknown, demo xử lý thế nào?
  • OrderCheck pass có guarantee fill không?
  • Soft block khác HALT ra sao?
  • Risk register cần sáu trường nào?

c. Gợi ý đáp án

Xem gợi ý câu 1

Fail closed: BLOCK_ALL, không giả exposure bằng 0. Xem lại mục 1 và mục 5.

Xem gợi ý câu 2

Không; request vẫn có thể fail khi gửi/thực thi. Xem lại mục 2 và mục 3.

Xem gợi ý câu 3

Soft block xét lại event sau; HALT cần recovery/manual gate. Xem lại mục 4.

Xem gợi ý câu 4

Metric, Policy, Action, Reset, Owner, Evidence. Xem lại mục 1 và mục 5.

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

Thuật ngữ Giải thích ngắn
Risk control Rule giới hạn action theo metric.
Fail closed Thiếu bằng chứng thì chặn.
Pre-trade Gate kiểm trước request.
Reconcile Khớp internal state với account state.
Soft block Bỏ action hiện tại, có thể xét lại.
HALT Dừng tới recovery gate.
Kill switch Control ngắt action khẩn cấp.
Orphan position Position không map vào owner/state.
Risk register Bảng control, owner và evidence.

e. Nguồn tham khảo

Bài trước: Các chiến lược EA phổ biến #12. Bài tiếp theo: Những sai lầm phổ biến khi sử dụng EA #14.

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ư, thông số risk, lot, Stop Loss hoặc runbook live.