Mục lục
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. Ledger R23 dùng số liệu giả lập, không dự báo kết quả thật.
Trả lời ngắn: Robustness test là quá trình cố tình thay đổi nhẹ từng giả định quanh một candidate EA đã khóa, rồi chạy lại bằng cùng thước đo và hard gate. Mục tiêu là phát hiện candidate quá nhạy trước khi đi tiếp, không phải chứng minh EA chắc chắn có lãi hoặc sẵn sàng chạy live.
Đọc xong, bạn sẽ hiểu:
- Robustness khác optimization, Monte Carlo và forward test ở đâu.
- Cách stress từng trục để biết điều gì làm kết quả suy giảm.
- Vì sao một required scenario FAIL phải dừng cả candidate.
1. Robustness Test là gì, và khác optimization ở đâu?
Bài #22 đã chọn P20-S15 làm candidate, tức bộ input được khóa để kiểm tiếp. Robustness test không quay lại tìm bộ “đẹp hơn”. Nó cố làm candidate hiện tại lung lay bằng vài thay đổi có chủ đích.
Hãy đặt một ly nước lên bàn rồi rung bàn nhẹ. Chiếc ly không cần chịu được động đất, nhưng nếu chỉ một cú chạm nhỏ đã làm đổ, ta nên phát hiện trước khi bê khay ra phục vụ. Một thay đổi có chủ đích như vậy gọi là stress hoặc perturbation.
Bốn công việc dễ bị gọi lẫn:
- Optimization thay nhiều bộ input để tìm candidate.
- Robustness test giữ candidate làm tâm rồi đổi giả định nhỏ để đo độ nhạy.
- Monte Carlo tạo nhiều đường đi từ luật randomization đã khóa, tập trung vào path risk.
- Forward/OOS test chạy candidate trên một đoạn dữ liệu không dùng để tối ưu. MetaTrader 5 cũng mô tả forward testing là chạy lại những kết quả tối ưu tốt trên một giai đoạn khác (MetaTrader 5 Help — Strategy Optimization).
Một bài test không thay cho ba bài còn lại. Candidate chịu được parameter lân cận vẫn có thể hỏng trên dữ liệu mới. Candidate qua forward test vẫn có thể quá nhạy với spread.
Hình 1 — Mỗi stress run chỉ hợp lệ khi candidate và baseline đã được khóa.
Robustness PASS chỉ nói candidate chưa vỡ dưới ma trận stress đã định. Nó không nói ma trận bao phủ tương lai, càng không bảo đảm lợi nhuận.
2. Protocol OAT: đổi một giả định, giữ phần còn lại
Trước stress, chạy một baseline: run gốc dùng làm mốc. Với P20-S15, baseline giả lập là:
score 0.78 · max DD 8% · 68 trades
Sau đó dùng OAT — one axis at a time: mỗi run chỉ đổi một trục. Nếu vừa tăng spread, vừa đổi parameter, vừa dịch sample, ta không biết thủ phạm nào làm score giảm.
Ví dụ làm bánh cũng thế. Muốn biết lò lệch 5°C có ảnh hưởng không, hãy giữ bột, thời gian và khuôn như cũ. Đổi ba thứ rồi thấy bánh xẹp chỉ tạo thêm câu hỏi.
Bốn nhóm stress trong R23:
- Parameter neighbor: giá trị sát candidate, như Lookback 19/21 hoặc StopATR 1.4/1.6.
- Cost/spread: giả định phí và chênh lệch Bid–Ask xấu hơn.
- Execution delay: thêm thời gian từ lúc EA gửi yêu cầu đến khi tester thực thi.
- Sample shift: dịch ngày bắt đầu nhưng giữ nguyên độ dài.
MetaTrader 5 Strategy Tester cho phép chọn no/fixed/random delay, nhiều tick mode, custom symbol settings và advanced settings như commission (MetaTrader 5 Help — Strategy Testing). Đây là công cụ để dựng stress; phần mềm không tự quyết stress nào phù hợp với EA của bạn.
Trong MQL5 tester, spread được lấy từ dữ liệu lịch sử và luôn được xem là floating; chế độ real ticks dùng tick do broker tích lũy, nhưng vẫn có quy tắc đồng bộ và xử lý dữ liệu thiếu (MQL5 Reference — Testing Trading Strategies). Vì vậy phải ghi rõ nguồn dữ liệu và cách tạo spread stress.
Hình 2 — OAT đổi một trục mỗi run để truy được nguyên nhân suy giảm.
Mức metric xấu đi so với baseline gọi là degradation. Đừng chỉ hỏi “có còn lời không”; hãy so cùng score, DD và trades, cùng đơn vị, cùng sizing.
3. Ledger R23: bảy PASS vẫn không cứu một hard FAIL
Protocol giả lập R23:OAT:V1 freeze EA hash, candidate P20-S15, sample, fixed sizing và output schema. Ba hard gate được khóa trước:
- Score
≥ 0.50 - Max DD
≤ 12% - Trades
≥ 50
Đây là gate của ví dụ R23, không phải chuẩn chung cho mọi EA. Mỗi required scenario — tình huống contract bắt buộc — phải PASS cả ba gate.
| Run | Thay đổi duy nhất | Score | Max DD | Trades | Verdict |
|---|---|---|---|---|---|
| BASE | P20-S15 | 0.78 | 8% | 68 | REFERENCE |
| R1 | Lookback 19 | 0.74 | 9% | 70 | PASS |
| R2 | Lookback 21 | 0.73 | 9% | 66 | PASS |
| R3 | StopATR 1.4 | 0.76 | 9% | 69 | PASS |
| R4 | StopATR 1.6 | 0.72 | 8% | 65 | PASS |
| R5 | Costs +25% | 0.64 | 11% | 68 | PASS |
| R6 | Fixed delay 200 ms | 0.60 | 12% | 67 | PASS |
| R7 | Spread +50% | 0.42 | 14% | 66 | FAIL — score, DD |
| R8 | Sample start +1 tháng | 0.58 | 11% | 59 | PASS |
R1–R4 cho thấy vùng parameter gần candidate không sụp. R5 và R6 xấu đi nhưng còn trong gate. R8 dịch sample một tháng, giữ nguyên độ dài, vẫn PASS.
R7 thì khác: score 0.42 thấp hơn gate 0.50 và DD 14% cao hơn gate 12%. Trades 66 vẫn đủ, nhưng một metric đạt không bù hai metric trượt.
Nếu lấy trung bình tám stress run, tôi đã che lỗi. Required scenario giống bài kiểm định phanh xe: không thể lấy điểm radio đẹp để bù phanh hỏng.
Hình 3 — Bảy PASS không bù được required spread scenario trượt hai hard gate.
Verdict:
7 PASS + 1 REQUIRED FAIL = REJECT/HALT
Failure owner là spread sensitivity. Bước kế tiếp là xem lại logic chi phí, bộ lọc spread hoặc thiết kế EA, rồi lập protocol mới. Không được âm thầm nới gate hay xóa R7.
R23 chắc chắn phát hiện candidate trượt stress spread đã định. Nếu stress đủ đại diện cho điều kiện cần phòng, kết quả có thể giúp sàng lọc candidate. Nó vẫn không dự đoán mọi spread tương lai.
4. Sai lầm, giới hạn và rủi ro
Sai lầm đầu tiên là đổi nhiều trục trong một run. OAT mất ý nghĩa nếu R7 vừa tăng spread vừa đổi StopATR.
Thứ hai là xem kết quả rồi mới bịa stress. Stress list phải khóa trước; nếu không, người test dễ bỏ qua điều kiện làm EA xấu.
Thứ ba là tạo stress vô lý chỉ để “thử cho ghê”. Delay 30 giây có thể không liên quan với EA giữ lệnh nhiều tuần, còn spread +5% có thể quá nhẹ với scalper. Mức stress cần gắn với log, broker và use case.
Thứ tư là chạy lại đến khi PASS. Nếu random delay là một required scenario, seed/rule và số lần chạy phải được khóa. Chọn riêng lần đẹp là cherry-pick.
Thứ năm là lấy trung bình để bù hard fail. Aggregate rule của R23 yêu cầu mọi scenario PASS; bảy điểm xanh không đổi được R7 đỏ.
Robustness test cũng có giới hạn:
- OAT tìm độ nhạy cục bộ, không đo interaction khi nhiều trục đổi cùng lúc.
- Tester mô phỏng delay, spread và tick; mô phỏng vẫn không phải execution live.
- Một ma trận hữu hạn không thể bao phủ mọi chế độ thị trường.
- Candidate PASS có thể vẫn overfit cùng sample hoặc chung một lỗi code.
Do đó robustness là gate sàng lọc, không phải giấy chứng nhận an toàn.
5. Checklist robustness fail-closed
- Freeze EA version/hash và candidate ID.
- Lưu baseline cùng score, DD, trades và raw report.
- Ghi danh sách required scenario trước khi chạy.
- Nêu trục, đơn vị, hướng và mức thay đổi.
- Chỉ đổi một trục trong mỗi OAT run.
- Giữ sample, sizing và metric schema khi trục đó không phải mục tiêu.
- Khóa hard gate và aggregate rule.
- Kiểm log/error sau từng run.
- So metric với baseline và gate, không chỉ nhìn lợi nhuận.
- Lưu input set, tester settings và raw result.
- Gắn failure owner và next action.
- Freeze verdict; không sửa lịch sử.
Đứng ngoài nếu chưa biết spread, commission hoặc delay nào là có lý cho môi trường dự kiến.
Dừng ngay nếu EA hash lệch, dữ liệu thay đổi ngoài chủ đích, tester có error hoặc một required scenario trượt hard gate. Fail-closed nghĩa là bằng chứng thiếu hay mâu thuẫn thì chưa đi tiếp.
6. Bắt đầu từ đâu: Robustness Sheet 15 phút
Dùng Google Sheets hoặc LibreOffice Calc miễn phí. Đây là bài tập số giả lập, chưa dùng tiền thật.
Phút 0–4: nhập contract
Ghi R23:OAT:V1, baseline P20-S15, ba gate và aggregate “all required scenarios PASS”.
Phút 4–10: dán ledger
Dán BASE và R1–R8 ở mục 3. Tạo cột gate:
=IF(AND(Score>=0.50, DD<=12%, Trades>=50), "PASS", "FAIL")
BASE là REFERENCE, không tính vào số stress PASS.
Mẫu đối chiếu đã điền
| Kiểm tra | Kết quả mẫu |
|---|---|
| Baseline | 0.78 / 8% / 68 |
| Required hard fail | R7 spread +50% → 0.42 / 14% / 66 |
| Failure owner | spread sensitivity |
| Aggregate | REJECT/HALT |
Phút 10–15: kiểm và kết luận
Đếm bảy stress PASS, một stress FAIL. Đối chiếu R7: score trượt, DD trượt, trades đạt. Ghi:
NEXT: REDESIGN / COST FILTER REVIEW
Không sửa gate, không xóa R7 và không chuyển candidate sang vốn thật. Nếu sheet trả ACCEPT, công thức aggregate đang sai.
7. Tổng kết
a. Năm ý chính
- Robustness test cố làm candidate lung lay; optimization tìm candidate.
- OAT đổi một trục mỗi run để truy nguyên nhân.
- Baseline, scenario list, metric và gate phải freeze trước.
- Required hard fail không được bù bằng trung bình.
- Robustness PASS vẫn chưa phải live-ready; R23 FAIL phải halt.
b. Câu hỏi tự kiểm tra
- Robustness khác parameter optimization ở đâu?
- Vì sao OAT không đổi spread và StopATR trong cùng run?
- R7 trượt những gate nào?
- Aggregate của R23 là gì và bước tiếp theo ra sao?
c. Gợi ý đáp án
Xem gợi ý câu 1
Optimization tìm candidate; robustness stress candidate đã khóa. Xem mục 1.
Xem gợi ý câu 2
Đổi hai trục khiến ta không biết trục nào gây suy giảm. Xem mục 2.
Xem gợi ý câu 3
R7 trượt score 0.50 và DD 12%; trades vẫn đạt. Xem mục 3.
Xem gợi ý câu 4
`REJECT/HALT`; xem lại spread sensitivity và thiết kế trước protocol mới. Xem mục 3 và 5.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Robustness test | Thử độ nhạy khi giả định thay đổi nhỏ. |
| Candidate | Bộ input đã chọn để kiểm tiếp. |
| Stress | Thay đổi có chủ đích trong một run. |
| Baseline | Run gốc dùng làm mốc. |
| OAT | Mỗi run chỉ đổi một trục. |
| Parameter neighbor | Giá trị sát candidate trên một input. |
| Degradation | Mức metric xấu đi so baseline. |
| Required scenario | Stress contract bắt buộc phải vượt qua. |
| Hard gate | Điều kiện bắt buộc; trượt là loại. |
| Interaction | Ảnh hưởng khi nhiều trục đổi cùng lúc. |
e. Nguồn tham khảo
- MetaTrader 5 Help — Strategy Testing
- MetaTrader 5 Help — Strategy Optimization
- MQL5 Reference — Testing Trading Strategies
- MQL5 Reference — TesterStatistics
- MQL5 Reference — Testing Statistics
Bài #22 đã chọn candidate; bài #23 vừa cố làm nó vỡ và phát hiện spread sensitivity. Sau khi thiết kế lại và pass protocol mới, Live Validation cho EA #24 mới là bước quan sát EA trong môi trường chạy thật có kiểm soát.
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. Backtest và robustness test không loại bỏ rủi ro mất vốn.
Bài tiếp theo