Bạn chạy một backtest trong MT5 bằng cách mở Strategy Tester qua View > Strategy Tester (hoặc Ctrl+R), chọn Expert Advisor, symbol, khung thời gian, khoảng ngày và chế độ mô phỏng, rồi bấm Start. Năm phút sau bạn có một bản báo cáo. Câu hỏi gấp không phải là làm sao tới được đó — mà là trong các con số trên báo cáo ấy, con số nào thật sự mang đúng ý nghĩa bạn đang gán cho nó.
Hướng dẫn này làm cả hai nửa: phần thao tác, và phần đọc hiểu. Phần đọc hiểu chính là nơi bằng chứng trên trang này được rút ra, bởi chúng tôi có 23 lần chạy đã hoàn tất trong hồ sơ, và báo cáo của chúng tự mâu thuẫn với chính mình theo một kiểu mà gần như không ai chịu kiểm tra.
Bạn nhận được gì từ một lần chạy hoàn tất
Sản phẩm là một bản báo cáo gồm hai nửa: khối kết quả (số lệnh, hệ số lợi nhuận, sụt giảm, lãi ròng) và danh sách lệnh nằm phía sau nó. Cả hai đều quan trọng, nhưng chỉ nửa đầu được đem đi trích dẫn.
Thứ bạn phải nói được ở cuối không phải là “nó lãi 3.023 $”. Mà là: bộ quy tắc này, trên symbol và khung thời gian này, trong cửa sổ này, với mô hình tick này, trên một tài khoản 10.000 $, đã tạo ra chừng này lệnh, ở mức hệ số lợi nhuận này, và lúc tệ nhất đã chìm sâu tới mức này. Mỗi mệnh đề trong câu đó là một thiết lập do bạn chọn, và đổi bất kỳ cái nào cũng đổi câu trả lời. Đó là lý do phần thiết lập được đặt trước phần thao tác ở đây.
Thiết lập: dữ liệu và tùy chọn quyết định câu trả lời
Dưới đây là một lần chạy thật mà chúng tôi đã thực hiện và công bố, trích ra để bạn đặt đầu vào và đầu ra cạnh nhau. Đây là bản ghi phía sau Stillwater, một chiến lược chỉ mua trên USD/JPY ở biểu đồ 5 phút.
| Thiết lập | Lần chạy này | Vì sao đặt như vậy |
|---|---|---|
| Expert | Stillwater (19 inputs) | Toàn bộ input mà báo cáo được xác minh là có mang — bề mặt bạn sẽ phải nhập lại để tái lập nó |
| Symbol | USDJPY_DUKA | Một symbol lịch sử tick chuyên dụng, tách khỏi symbol báo giá thật để lần chạy lặp lại được |
| Period | M5 | Biểu đồ mà các quy tắc đánh giá trên đó; bộ lọc xu hướng đọc M30 từ bên trong EA |
| Khoảng ngày | 2019-01-01 → 2026-07-01 | 7,5 năm, đủ dài để chứa nhiều hơn một chế độ thị trường |
| Modelling | Every tick based on real ticks (Model 4) | Bất cứ thứ gì giao dịch trong ngày đều cần đường đi bên trong nến được đo, chứ không phải nội suy |
| Deposit | 10.000 USD | Cố định ở mọi lần chạy tại đây, để các tỷ lệ phần trăm sụt giảm còn so sánh được |
| Leverage | Yêu cầu 1:500 — chạy ở 1:100 | Xem bên dưới. Ô này không đúng như vẻ ngoài của nó |
| Optimisation | Disabled | Một lượt chạy duy nhất. Dò tham số là công việc khác, với những cái bẫy khác |
Có hai dòng trong bảng đó đáng được nói dài hơn một ô bảng.
Chất lượng dữ liệu là thiết lập mà cả kết quả tựa lên. Mọi con số khác trong báo cáo đều được tính chồng lên chuỗi giá mà trình kiểm thử đã dùng, nên con số chất lượng mô phỏng đặt giới hạn cho việc phần còn lại của báo cáo nói về chiến lược của bạn được tới đâu. Bản ghi đã công bố của lần chạy trên nêu 100% chất lượng lịch sử trên 229 triệu tick thật, đọc thẳng từ báo cáo của trình kiểm thử. Một lần chạy trên dữ liệu nến nội suy sẽ cho ra một tập lệnh khác hẳn, chứ không chỉ khác mức khớp — trình kiểm thử giả định một đường đi trơn tru giữa các mức giá mà nó biết, còn một chiến lược đặt cắt lỗ sát thì giao dịch ngay trên chính giả định đó. Nếu bạn chưa đọc xem terminal của mình thật sự đang giữ dữ liệu tick nào cho symbol đó, thì đấy là thứ phải kiểm tra đầu tiên, trước cả chiến lược.
Ô leverage là một yêu cầu, không phải một thiết lập. Ở cả 23 lần chạy trong hồ sơ, trình kiểm thử được yêu cầu 1:500 và bài kiểm thử chạy ở 1:100 — 0 trên 23 lần con số được yêu cầu có hiệu lực. Đây không phải phỏng đoán từ việc đọc lại ô đó: nó được chốt bằng cách đo mức ký quỹ mà một vị thế thật sự chiếm bên trong bài kiểm thử, 126,39 USD, khớp với phép tính ở đòn bẩy 100 chứ không khớp với phép tính ở đòn bẩy 500. Hệ quả thực tế là một thiết kế nhạy với ký quỹ — grid, martingale, bất cứ thứ gì chồng vị thế — có thể vượt qua một backtest ở mức đòn bẩy mà nó sẽ chẳng bao giờ gặp, hoặc trượt một backtest ở mức đòn bẩy mà nó vốn sẽ không dùng. Hãy đối chiếu con số ký quỹ trong báo cáo với phép tính của chính bạn, thay vì tin vào cái ô bạn đã gõ vào.
Từng bước: chạy bài kiểm thử trong MT5
- Mở View > Strategy Tester (
Ctrl+R). Bảng điều khiển neo ở đáy terminal, với các tab Settings, Inputs, Agents và Journal. - Ở tab Settings, chọn Expert Advisor, rồi chọn Symbol và Period. Hãy chọn đúng symbol bạn sẽ giao dịch thật — đặc tả hợp đồng, chứ không chỉ giá, đến từ nó, và kích thước hợp đồng cùng quy tắc ký quỹ khác nhau giữa các biến thể của cùng một cặp ở một nhà môi giới.
- Đặt khoảng ngày. Hãy dùng một giai đoạn tùy chỉnh với ngày From và To ghi rõ, thay vì “Last month”, để người chỉ đọc báo cáo của bạn vẫn tái lập được lần chạy.
- Chọn chế độ Modelling. Every tick based on real ticks cho mọi thứ giao dịch trong ngày; Every tick sinh từ nến M1 cho các hệ thống chậm hơn; các chế độ thô hơn dành cho việc quét tham số, tuyệt đối không dành cho một con số bạn đem đi công bố.
- Đặt Deposit, loại tiền và đòn bẩy, và cứ để Optimisation ở trạng thái tắt cho lượt chạy đầu. Ghi lại mức đòn bẩy bạn đã yêu cầu — bạn sẽ đối chiếu nó với các con số ký quỹ trong báo cáo chứ không mặc định là nó đúng.
- Mở tab Inputs và đọc từng giá trị. Đây là tab âm thầm mang theo các chỉnh sửa của lần chạy trước, và đó là lý do bản ghi của chúng tôi xác minh input dựa trên báo cáo đã hoàn tất chứ không dựa trên file mà chúng tôi tưởng là mình đã nạp. Một lần chạy trong tập này mang tới 362 input.
- Bấm Start. Cứ để Visual mode tắt trừ khi bạn đang gỡ lỗi logic vào lệnh — nó chậm hơn nhiều và nó cám dỗ bạn ngồi xem thay vì đo.
- Khi chạy xong, mở các tab Results, Graph và Backtest, rồi nhấp chuột phải trong báo cáo và lưu nó lại. Bản báo cáo đã lưu, chứ không phải ảnh chụp màn hình đường cong vốn, mới là thứ bạn sẽ đem ra so sánh về sau.
- Ghi lại bản build của terminal cùng với kết quả. 23 lần chạy của chúng tôi trải trên các build 6090 và 6140; hai lần chạy cùng một chiến lược dưới hai build khác nhau không nghiễm nhiên là cùng một thí nghiệm.
- Kiểm tra symbol thật sự đang giữ lịch sử nào
- Chọn chế độ mô phỏng khớp với thời gian nắm giữ
- Đặt symbol, khung thời gian và một khoảng ngày ghi rõ
- Đọc từng giá trị trên tab Inputs
- Chạy một lượt với optimisation đã tắt
- Lưu báo cáo, không phải ảnh chụp màn hình
- Đọc cả hai dòng sụt giảm trước dòng lợi nhuận
Đọc kết quả: các con số trong báo cáo thật sự nói gì
Lấy đúng đầu ra của lần chạy đó. Đây là những gì trả về:
| Kết quả | Giá trị | Nó phải vượt qua điều gì trước khi bạn đi tiếp |
|---|---|---|
| Tổng số lệnh | 416 | Đủ để con số trung bình đang mô tả một mẫu, không phải một giai thoại |
| Hệ số lợi nhuận | 1,28 | Trên 1,0 với biên đủ để sống sót qua những chi phí bạn chưa mô phỏng |
| Lãi ròng | 3.023,01 USD | Trên mức nạp 10.000 — một mức sinh lời, không phải một điểm số |
| Sụt giảm theo balance | 5,82% (747,57) | Cú lõm sâu nhất tính trên lệnh đã đóng |
| Sụt giảm theo equity | 6,11% (787,60) | Cú lõm sâu nhất tính cả vị thế đang mở — cái mà bạn sẽ phải ngồi nhìn |
| Tỷ lệ thắng | 60,82% | Đứng một mình thì vô nghĩa; hãy đọc nó cùng mức cắt lỗ và mục tiêu, ở đây là 100 và 200 pip |
| Điều kiện kiểm thử | |
|---|---|
| ID thí nghiệm | EXP-BACKTEST-RUNBOOK-001 |
| ID lần chạy | stillwater__gate_v2_duka_realticks__2019-01-01_2026-07-01 |
| Bản build MT5 | 6140 |
| Đặc tả hợp đồng | Exness-MT5Trial5 |
| Symbol / khung thời gian | USDJPY_DUKA M5 |
| Giai đoạn | 2019-01-01 – 2026-07-01 |
| Mô hình | Every tick based on real ticks (Model 4) |
| Deposit | 10,000 USD |
| Đòn bẩy yêu cầu | 1:500 |
| Đòn bẩy hiệu lực | 1:100 |
| Đo ngày | 2026-08-23 |
| Kiểm chứng lần cuối | 2026-08-25 |
Có ba thứ trong báo cáo đó thường xuyên bị đọc sai.
Hai dòng sụt giảm là hai câu hỏi khác nhau. Sụt giảm theo balance đo đường cong vốn tính trên lệnh đã đóng; sụt giảm theo equity tính cả phần lãi lỗ trôi nổi của các vị thế còn đang mở. Trên 23 lần chạy của chúng tôi, dòng equity sâu hơn ở mọi lần, và độ rộng của khoảng cách đó không đoán được từ phần mô tả chiến lược: hẹp nhất là 0,04 điểm (0,67% so với 0,71%) và rộng nhất là 11,10 điểm (14,52% so với 25,62%, tỷ số 1,76). Một chiến lược đóng lệnh nhanh thì khoảng cách nhỏ. Một chiến lược ngồi chịu đựng biến động ngược chiều thì khoảng cách lớn, và đó đúng là kiểu chiến lược mà bạn cần biết mức sụt giảm của nó nhất trước khi rót tiền vào.
MT5 in mỗi mức sụt giảm hai lần, theo hai định nghĩa. Maximal được đo tại thời điểm số tiền lớn nhất; Relative được đo tại thời điểm tỷ lệ phần trăm lớn nhất. Đó là hai thời điểm khác nhau trong cùng một lần chạy, nên hai con số không phải hai góc nhìn về một sự kiện. Trong các lần chạy của chúng tôi, 16 lần được ghi theo định nghĩa Maximal và 5 lần theo Relative — và quy trình ghi các bản ghi đó từ chối ghép một con số balance kiểu Maximal với một con số equity kiểu Relative, bởi một trang hiển thị cả hai sẽ là đang so sánh hai khoảnh khắc khác nhau. Khi bạn trích một mức sụt giảm, hãy nêu kèm định nghĩa của nó.
Các con số tổng của chính báo cáo đều đã làm tròn, và cửa sổ của nó có thể không phải cửa sổ bạn định nói tới. Tính lại từ danh sách lệnh đã công bố, hệ số lợi nhuận của cùng lần chạy đó là 1,2843 chứ không phải 1,28 như trong báo cáo — vô hại ở đây, và không hề vô hại khi bạn đang so hai ứng viên cách nhau ba chữ số thập phân. Quan trọng hơn, lần chạy 416 lệnh đó tách thành 404 lệnh tính đến mốc cắt công bố 2026-04-01 và 12 lệnh sau mốc đó. 12 lệnh về sau trả về hệ số lợi nhuận 2,3317. Không con số nào sai cả; chúng trả lời hai câu hỏi khác nhau, và cái mốc cắt là một ngày do con người chọn, không phải thứ trình kiểm thử in ra. Nếu bạn định chia một lần chạy thành “phần tôi đã khớp lên” và “phần tôi không khớp”, hãy viết ra đường ranh nằm ở đâu trước khi bạn nhìn vào nửa sau. Cách đọc báo cáo backtest MT5 thực hiện đúng phép chia đó trên cả 23 lần chạy và cho thấy con số đầu báo cáo xê dịch tới đâu.
Những cái bẫy âm thầm làm hỏng một lần chạy
Cải thiện nó: đổi một thứ, chạy lại, so sánh
Vòng lặp này buồn tẻ một cách có chủ ý. Đổi một biến, chạy lại, và ghi lại cả hai kết quả. Đổi hai biến cùng lúc thì bạn không quy được khác biệt cho biến nào cả.
Thứ tự mang lại nhiều thông tin nhất trên mỗi lần chạy là:
- Đổi cửa sổ thời gian trước khi đổi chiến lược. Chạy riêng 2019–2022 và 2022–2026. Nếu hai nửa không đồng thuận thì các tham số đang mô tả một giai đoạn duy nhất, và không mức tinh chỉnh nào sửa được điều đó.
- Đổi symbol. Một quy tắc chỉ chạy được trên một cặp là một sự thật về cặp đó. Tập của chúng tôi có cùng những hướng tiếp cận chung trên USD/JPY, EUR/GBP, AUD/CAD, NZD/USD, một chỉ số và một cặp crypto, chính vì lý do này.
- Đổi chế độ mô phỏng. Chạy lại ứng viên còn sống sót trên một mô hình thô hơn. Nếu kết quả sụp đổ thì lợi thế đã sống bên trong cây nến, và đường đi trong nến là phần ít đáng tin nhất của bất kỳ mô phỏng nào.
- Chỉ khi đó mới đổi tham số — và hãy coi mọi thiết lập mà bạn phải dò mới ra là một tuyên bố yếu hơn một thiết lập bạn chọn từ đầu.
Hãy dừng lặp khi một thay đổi không còn đẩy kết quả ra khỏi vùng nhiễu của các lần chạy trước, hoặc khi bạn nhận ra mình đang chọn thiết lập dựa trên những gì báo cáo gần nhất nói. Điều kiện dừng thứ hai mới là điều kiện thật, và nó tới sớm hơn người ta tưởng. Công cụ phân tích backtest hữu ích ở đây vì nó đọc ngược ra các con số chính của một báo cáo đã lưu, biến việc so hai lần chạy thành một phép tính thay vì một phép nhớ.
Bước tiếp theo: chạy forward test trước khi vào thật
Một lần backtest sạch sẽ là bước đầu tiên trong bốn bước, không phải vạch đích.
Tối ưu hóa, nếu quy tắc có tham số đáng dò. Hãy ghi lại toàn bộ dải tìm kiếm, chứ không chỉ lượt chạy thắng — một kết quả mà bạn phải đi tìm mới ra là bằng chứng về cuộc tìm kiếm, và chính cái dải đó nói cho người đọc biết bạn đã tìm kỹ đến đâu. Tối ưu hóa tham số đi hết lượt chạy đó và đọc lại tám cuộc dò có ghi nhận của chính chúng tôi: 116 tổ hợp, và không một thiết lập nào chúng tôi sẵn sàng phát hành.
Rồi đi walk-forward. Khớp trên một đoạn, đo trên đoạn kế tiếp, rồi lặp lại. Đây là bước duy nhất trong bốn bước tấn công trực diện vào tối ưu hóa quá mức, và đó là lý do nó đáng giá hơn một backtest dài hơn.
Rồi forward test trên một tài khoản demo. Đây là nơi độ trễ, báo giá lại và mức spread giãn ra thật sự cuối cùng mới bước vào thí nghiệm. Hãy chạy đủ lâu để nhìn chiến lược thua rồi hồi lại, bởi con số bạn thật sự cần không phải mức sinh lời — mà là liệu bạn có ngồi chịu nổi mức sụt giảm bạn đã đo ở trên hay không.
Rồi mới quyết định. Hãy viết ra trước, mức lỗ nào sẽ khiến bạn tắt nó đi. Một ngưỡng dừng bạn đặt trước khi rót tiền là một quyết định; một ngưỡng bạn đặt giữa lúc đang sụt giảm là một phản ứng.
Nếu bạn muốn một tham chiếu đã làm sẵn trước khi tự chạy, mỗi mục trong danh mục EA đã công bố đều mang theo danh sách lệnh đã đóng đầy đủ, cả hai dòng sụt giảm và manifest chạy phía sau chúng, còn cách chúng tôi kiểm thử nêu tiêu chuẩn mà các bản ghi đó phải chịu. Phần còn lại của các hướng dẫn backtesting đi sâu hơn vào các bước tối ưu hóa và walk-forward mà trang này chỉ mới chỉ tay tới. Không có gì ở đây hứa hẹn một kết quả: mọi con số trên trang này đều mô tả những lần chạy đã xảy ra rồi.