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. Ví dụ O22 dùng số liệu giả lập, không đại diện hiệu suất tương lai.
Trả lời ngắn: Parameter optimization là quá trình chạy EA nhiều lần trên cùng một hợp đồng kiểm thử, mỗi lần dùng một bộ input khác nhau, để tìm candidate đáng kiểm tiếp. Nó giúp so sánh có quy tắc, nhưng không tự chứng minh EA bền, có lãi tương lai hay sẵn sàng chạy tiền thật.
Đọc xong, bạn sẽ hiểu:
- Cách range, step và số parameter tạo thành số lượt test.
- Vì sao hard gate phải đứng trước bảng xếp hạng.
- Cách chọn một candidate trong vùng ổn định thay vì đuổi theo một điểm số lẻ.
1. Parameter Optimization là gì, và không phải phép tìm “EA tốt nhất”?
EA thường có vài input, tức các giá trị bên ngoài điều khiển hành vi của nó. Chu kỳ đường trung bình, khoảng Stop Loss, khung giờ giao dịch hay mức rủi ro đều có thể là input. Trong MQL5, biến khai báo bằng input được người dùng đặt từ cửa sổ Properties và được khởi tạo lại trước OnInit(); bản thân chương trình chỉ đọc, không tự sửa giá trị đó trong lúc chạy (MQL5 Reference — Input Variables).
Một backtest hỏi: “Bộ input này đã chạy thế nào?” Parameter optimization hỏi: “Trong danh sách bộ input định trước, bộ nào đáng kiểm tiếp?” Không câu nào trả lời “bộ nào sẽ kiếm tiền”. Nếu dữ liệu, chi phí hoặc EA sai, cả bảng có thể vô dụng.
Hãy hình dung quán ăn thử chín công thức sốt trên cùng một nhóm khách. Quán có thể chọn vài công thức được chấm khá để đem sang buổi nếm độc lập. Nếu vừa thử công thức vừa đổi nhóm khách, đổi giá nguyên liệu và sửa luật chấm, kết quả không còn so được.
Vì vậy phải tách:
- Search sample: đoạn dữ liệu dùng để tìm candidate.
- Validation sample: đoạn dữ liệu tách riêng để kiểm candidate sau khi chọn.
Tester chạy nhiều bộ input, nhưng phần mềm chạy đúng lệnh không có nghĩa hợp đồng nghiên cứu đúng (MetaTrader 5 Help — Strategy Optimization).
Hình 1 — Optimization chỉ đề cử candidate sau hard gate và kiểm vùng lân cận.
Search không phải validation. Bộ thắng search mới là ứng viên; nó còn phải qua robustness, dữ liệu ngoài mẫu và kiểm tra thực thi.
2. Range, step, pass và criterion vận hành ra sao?
Mỗi parameter bật tối ưu có ba mốc:
- Range: điểm đầu và điểm cuối được phép thử.
- Step: khoảng nhảy giữa hai giá trị liên tiếp.
- Value: giá trị dùng khi parameter không được bật tối ưu hoặc khi chạy một test riêng.
Nếu Lookback chạy từ 10 đến 30, step 10, nó có ba giá trị: 10, 20, 30. Với các mốc hợp lệ, số giá trị được tính:
floor((stop - start) / step) + 1
Một combination là một bộ gồm một giá trị từ mỗi parameter. Một pass là một lượt tester chạy một combination. Hai parameter, mỗi parameter có ba giá trị, tạo 3 × 3 = 9 pass. Nó giống quầy áo có ba size và ba màu: mỗi size ghép với đủ ba màu.
MQL5 cho phép đặt value/start/step/stop bằng ParameterSetRange() (MQL5 Reference — ParameterSetRange). Những mốc này phải được lưu cùng kết quả.
Có hai cách tìm phổ biến:
- Complete enumeration chạy mọi combination trong search space. Nó dễ kiểm toán nhưng có thể rất lâu khi số trục tăng.
- Genetic search dùng kết quả theo criterion để tập trung vào các vùng hứa hẹn, nhờ đó giảm số pass. Nó nhanh hơn, nhưng không có nghĩa đã thử toàn bộ search space.
Tài liệu MetaTrader nêu rõ complete chạy mọi tổ hợp, còn genetic dùng quá trình chọn lọc theo criterion và chạy ít lượt hơn (MetaTrader 5 Help — Optimization Types).
Hình 2 — Complete duyệt toàn bộ search space; genetic giảm số pass theo criterion.
Criterion là con số dùng để xếp hạng pass. Có thể dùng Profit Factor, drawdown, Sharpe Ratio, Complex Criterion hoặc giá trị tùy chỉnh. Trong MQL5, OnTester() có thể trả về custom criterion; khi genetic optimization xếp hạng, giá trị cao hơn được coi là tốt hơn (MQL5 Reference — OnTester).
Criterion không phải lá bùa. Một pass ít lệnh hoặc drawdown lớn vẫn có thể đứng đầu. Hard gate là điều kiện bắt buộc xét trước thứ hạng. Số trades và drawdown có thể lấy qua TesterStatistics() (MQL5 Reference — TesterStatistics).
Nói ngắn: hard gate quyết định pass có được vào vòng xếp hạng hay không; criterion chỉ xếp những pass còn sống.
3. Grid O22: chọn plateau thay vì đuổi theo một đỉnh
Ta dùng thí nghiệm giả lập O22:GRID:V1. EA chạy fixed sizing trên cùng search sample, cùng tick mode, cùng chi phí. Hai parameter:
Lookback ∈ {10, 20, 30}StopATR ∈ {1.0, 1.5, 2.0}
Đây là grid 3×3, nên complete enumeration chạy đúng chín pass. Custom score càng cao càng tốt, nhưng hai hard gate được khóa trước:
- Max DD
≤ 12% - Số trades
≥ 50
Kết quả mẫu:
| Pass ID | Lookback | StopATR | Score | Max DD | Trades | Gate |
|---|---|---|---|---|---|---|
| P10-S10 | 10 | 1.0 | 0.31 | 15% | 92 | FAIL |
| P10-S15 | 10 | 1.5 | 0.92 | 18% | 81 | FAIL |
| P10-S20 | 10 | 2.0 | 0.35 | 11% | 70 | PASS |
| P20-S10 | 20 | 1.0 | 0.68 | 10% | 76 | PASS |
| P20-S15 | 20 | 1.5 | 0.78 | 8% | 68 | PASS — CANDIDATE |
| P20-S20 | 20 | 2.0 | 0.72 | 8% | 60 | PASS |
| P30-S10 | 30 | 1.0 | 0.65 | 9% | 63 | PASS |
| P30-S15 | 30 | 1.5 | 0.74 | 8% | 56 | PASS |
| P30-S20 | 30 | 2.0 | 0.69 | 7% | 48 | FAIL |
Nếu nhìn mỗi score, P10-S15 thắng với 0.92. Nhưng nó chịu DD 18%, vượt gate 12%, nên bị loại. Nếu tôi tưởng score cao nhất tự động thắng, tôi đã chọn sai P10-S15.
P20-S15 có score 0.78, DD 8% và 68 trades. Các hàng xóm P20-S10, P20-S20, P30-S10, P30-S15 cũng đạt gate.
Vùng nhiều combination gần nhau cùng đạt gọi là plateau; điểm cao cô lập là spike. Plateau chưa chứng minh EA robust, chỉ bớt mong manh hơn một điểm lẻ.
Hình 3 — Điểm 0.92 bị loại bởi DD; P20-S15 được giữ làm candidate trong vùng đạt gate.
Verdict của O22 là:
P20-S15 → CANDIDATE ONLY / ROBUSTNESS PENDING
Optimization chạy các combination được phương pháp chọn theo contract. Chỉ khi sample, chi phí và thực thi đủ đại diện, candidate mới có thể đáng kiểm tiếp.
4. Sai lầm, giới hạn và rủi ro
Đầu tiên là bật quá nhiều parameter. Mười parameter, mỗi cái mười giá trị, tạo 10^10 combination. Genetic search giảm tính toán nhưng không sửa được câu hỏi quá rộng.
Thứ hai là dùng cùng sample để tìm, sửa và tuyên bố chiến thắng. Nhìn kết quả rồi nới range hay đổi step khiến ta học thêm tiếng ồn.
Thứ ba là chọn top row. Score 0.92 trượt hard gate; top row đạt gate vẫn có thể là spike hoặc quá ít trades.
Thứ tư là đổi luật sau trận. Thấy DD 18% rồi nâng gate từ 12% lên 20% biến hàng rào thành cái cớ.
Thứ năm là coi genetic đã duyệt hết. Genetic ưu tiên vùng criterion cao; complete mới chạy toàn bộ combination trong range.
Thứ sáu là quên version và chi phí. Khác code, spread, commission, tick mode hoặc sizing thì không còn cùng thí nghiệm.
Ba giới hạn lớn:
- Lịch sử không bảo đảm chế độ thị trường tương lai giống search sample.
- Nhiều pass trên cùng một plateau có thể cùng chịu một bias dữ liệu.
- Tick model, spread và execution sai có thể làm cả grid cùng sai, chứ không chỉ một row.
“Đạt optimization” không phải “đạt live”. Candidate còn phải qua robustness, out-of-sample và kiểm tra vận hành.
5. Checklist chạy optimization fail-closed
Trước khi bấm Start, tạo Optimization Contract:
- Ghi EA version và EA hash, dấu vân tay của file đã test.
- Khóa symbol, timeframe, search sample và múi giờ.
- Khóa tick mode, spread, commission, delay và quy tắc sizing.
- Chỉ bật parameter có giả thuyết rõ; ghi start, stop, step và đơn vị.
- Tính tổng pass trước khi chạy.
- Chọn complete hay genetic và ghi lý do.
- Khóa criterion cùng chiều xếp hạng.
- Khóa hard gate, kể cả minimum trades.
- Chạy thử một đến hai pass để bắt lỗi.
- Chạy grid; không sửa contract giữa chừng.
- Export raw result, error log, file set.
- Lọc hard gate trước, rồi mới xem criterion và hàng xóm.
- Freeze candidate ID để kiểm tiếp.
Đứng ngoài nếu chưa có sample tách biệt, chưa biết chi phí hoặc tổng pass vượt budget.
Dừng ngay nếu tester báo pass lỗi, lịch sử thay đổi, EA hash lệch, criterion/gate bị sửa hoặc candidate chỉ còn một spike cô lập. Fail-closed nghĩa là thiếu bằng chứng thì chưa đi tiếp, không tự điền bằng hy vọng.
6. Bắt đầu từ đâu: Optimization Sheet 15 phút
Bạn chỉ cần Google Sheets hoặc LibreOffice Calc miễn phí. Bài tập dùng số giả lập, chưa dùng tiền thật.
Phút 0–3: khóa contract
Điền:
- Contract:
O22:GRID:V1 - Method: complete enumeration
- Sizing: fixed
- Lookback:
10 → 30, step10 - StopATR:
1.0 → 2.0, step0.5 - Gates: DD
≤ 12%, trades≥ 50
Phút 3–5: tính search space
Lookback có 3 giá trị. StopATR có 3 giá trị. Tổng là 3 × 3 = 9 pass. Nếu sheet ra con số khác, dừng và sửa range/step.
Phút 5–10: nhập ledger
Dán đủ chín row O22 ở mục 3. Thêm cột:
Gate = IF(AND(DD<=12%, Trades>=50), "PASS", "FAIL")
Mẫu đối chiếu đã điền
| Kiểm tra | Kết quả mẫu |
|---|---|
| Search space | 3 × 3 = 9 pass |
| Hard fail | P10-S10, P10-S15, P30-S20 |
| Candidate | P20-S15 |
| Trạng thái | CANDIDATE ONLY / ROBUSTNESS PENDING |
Phút 10–13: kiểm vùng lân cận
Tô các ô PASS trên grid. P20-S15 có nhiều hàng xóm PASS; P10-S15 score cao nhưng đã bị loại.
Phút 13–15: ghi verdict
Điền:
Selected: P20-S15
Status: CANDIDATE ONLY
Next gate: ROBUSTNESS TEST #23
Nếu bảng sai, xem lại công thức. Chín pass không tạo ra xác suất thành công hay lý do chạy vốn thật.
7. Tổng kết
a. Năm ý chính
- Parameter optimization so sánh nhiều bộ input theo một contract đã khóa.
- Range và step quyết định số combination; số pass tăng theo tích các trục.
- Complete duyệt toàn bộ search space; genetic giảm pass theo criterion.
- Hard gate loại pass trước khi criterion xếp hạng.
- Plateau chỉ giúp chọn candidate đáng kiểm tiếp; chưa chứng minh robustness hay lợi nhuận tương lai.
b. Câu hỏi tự kiểm tra
- Hai parameter có lần lượt 4 và 5 giá trị tạo bao nhiêu combination?
- Criterion khác hard gate ở đâu?
- Vì sao
P10-S15không được chọn dù score 0.92? - Sau khi freeze
P20-S15, bước kế tiếp là gì?
c. Gợi ý đáp án
Xem gợi ý câu 1
Có 4 × 5 = 20 combination. Xem lại mục 2.
Xem gợi ý câu 2
Hard gate quyết định được vào vòng xếp hạng; criterion xếp các pass còn lại. Xem lại mục 2.
Xem gợi ý câu 3
DD 18% vượt hard gate 12%, nên row bị loại trước khi so score. Xem lại mục 3.
Xem gợi ý câu 4
Khóa candidate rồi chuyển sang Robustness Test #23, chưa chạy tiền thật. Xem lại mục 5–6.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Input | Giá trị bên ngoài điều khiển hành vi EA. |
| Range | Điểm đầu và cuối được phép thử. |
| Step | Khoảng nhảy giữa hai giá trị liên tiếp. |
| Combination | Một bộ giá trị từ các input bật tối ưu. |
| Pass | Một lượt tester chạy một combination. |
| Criterion | Con số dùng để xếp hạng pass. |
| Hard gate | Điều kiện bắt buộc, trượt một điều kiện thì loại. |
| Plateau | Vùng nhiều bộ gần nhau cùng đạt. |
| Candidate | Bộ input được khóa để kiểm tiếp. |
| EA hash | Dấu vân tay nhận diện file EA đã test. |
e. Nguồn tham khảo
- MetaTrader 5 Help — Strategy Optimization
- MetaTrader 5 Help — Optimization Types
- MQL5 Reference — Input Variables
- MQL5 Reference — OnTester
- MQL5 Reference — TesterStatistics
- MQL5 Reference — Testing Statistics
- MQL5 Reference — ParameterSetRange
Bạn vừa đi từ Monte Carlo Test #21 sang khâu chọn parameter có kỷ luật. Bài tiếp theo, Robustness Test cho EA #23, sẽ cố tình làm khó candidate để xem nó chịu được thay đổi nhỏ đến đâu.
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à optimization không loại bỏ rủi ro mất vốn.
Bài tiếp theo