EA chỉ hoạt động trong tester trực quan cần kiểm tra xem quyết định phụ thuộc dữ liệu hay thứ được vẽ trên biểu đồ. Đối tượng đồ họa không nên thay tín hiệu tường minh. Trước khi đổi chiến lược, so chế độ, phiên bản, dữ liệu và chỗ đầu tiên nhật ký khác nhau. Mô hình dưới không chạy MT5: nó tách một số khỏi đầu vào chưa có, không đổi thiếu dữ liệu thành 0 và không đặt lệnh.

Chế độ trực quan khác ở đâu?

Tài liệu tester MQL5 nêu rằng ngoài thử nghiệm trực quan, đối tượng đồ họa không được vẽ và truy vấn thuộc tính đối tượng đã tạo nhận giá trị 0. Ngoại lệ này không áp cho chế độ trực quan. Đây là hành vi trong tài liệu nền tảng, không thí nghiệm chúng tôi vừa chạy trên EA của bạn; chưa chứng minh mọi chênh lệch test đều có nguyên nhân đó.

Nếu EA đọc giá đường kẻ hoặc trạng thái nút, ghi nhận riêng bước ấy với dữ liệu giá/chỉ báo. Xác định giá trị có sẵn trong chế độ hiện tại trước khi tính. Trạng thái “chưa đọc được” có thể dừng chẩn đoán trước phép so, tránh nhận số 0 kỹ thuật làm giá hợp lệ. Có biểu đồ hiện ra không xác nhận mọi đầu vào đã sẵn sàng.

Tách tín hiệu số khỏi đối tượng biểu đồ thế nào?

Mô phỏng học tập không giao dịch. Đặt tín hiệu dương 1.1050 và ngưỡng 1.1040, điều kiện “tín hiệu lớn hơn ngưỡng”. So số tường minh với đường đọc đối tượng bị đánh dấu không khả dụng. Đây không phải báo giá hoặc log MT5: chúng tôi chọn trạng thái để minh họa luồng dữ liệu.

Thiếu đầu vào khác giá bằng 0

Cuộn ngang để xem hết sơ đồ.

Thiếu đầu vào khác giá bằng 0Mô phỏng do tác giả đặt: 1.1050 lớn hơn 1.1040. Đối tượng không đọc được là null trong mô hình; không đánh giá điều kiện.Số tường minh1.1050Ngưỡng: 1.1040Thiếu đối tượngnullChưa có đầu vàoKết quả mô hìnhtrue / unknownKhông gửi lệnhKiểm tra giá trị và khả dụng riêng.Mô hình tự đặt — số hư cấu.
Mô hình: 1.1050 > 1.1040 là true. Đối tượng chưa có được giữ null; đường ấy chưa được đánh giá. Null là quy ước trang này, không khẳng định hàm MQL5 trả null.
Cùng một ngưỡng, ba kiểu đầu vào
Đường dữ liệuĐầu vàoĐánh giá mô hình
Số tường minh1.10501.1050 > 1.1040: true.
Đối tượng không khả dụngnull: chưa có giá trịKhông đánh giá điều kiện.
Thay thế sai0 thay cho thiếu giá trị0 > 1.1040: trông như kết quả false thông thường.

Hàng cuối là phiên bản lỗi để đối chiếu, không đường bảo vệ. Số 0 trả lời câu hỏi về số; null mô hình nói thiếu đầu vào. Nếu đảo điều kiện thành “nhỏ hơn ngưỡng”, số 0 thay thế thậm chí trông như đạt tiêu chí. Không sửa chương trình bằng một giá trị mặc định tùy tiện hoặc tự lấy giá trên biểu đồ cũ.

Phân biệt dữ liệu với đối tượng trên biểu đồ

Ví dụ học tập chạy trong trình duyệt. Không kết nối tài khoản hoặc API, không gửi đầu vào hay lưu bền vững. Không nhập mật khẩu hoặc dữ liệu cá nhân.

Đây là mô phỏng quy tắc do chúng tôi đặt, không phải chạy EA trong MT5. Dùng số dương với dấu chấm thập phân, 10⁻⁸–10⁸, tối đa 15 chữ số. Đối tượng không có thì dữ liệu là null; phiên bản sai riêng thay nó bằng 0. Kết quả không xác định nguyên nhân EA của bạn bị lỗi.

Công cụ đổi được hai số dương hữu hạn: 10⁻⁸ đến 10⁸, tối đa 15 chữ số theo hướng dẫn ô nhập. Giữ dấu chấm trong ô số/ký hiệu mã dù văn bản tiếng Việt có thể dùng dấu phẩy. Chế độ không trực quan giữ đường đối tượng ở null; chế độ trực quan của mô hình cho nó mang số tín hiệu. Trang không đọc biểu đồ, kết nối tài khoản/API, chạy MT5 hay tạo tín hiệu đầu tư. Bài phân biệt false với “không thể đánh giá”, không xác định nguyên nhân EA thực.

Ghi chế độ chương trình mà không giao dịch

Các cờ MQL_TESTER, MQL_VISUAL_MODE, MQL_OPTIMIZATION mô tả môi trường chạy; TERMINAL_BUILD là số build terminal. Ghi giá trị thực thay vì đoán qua vẻ ngoài cửa sổ. Các cờ bằng nhau cũng chưa chứng minh dữ liệu/tham số giống nhau.

Đoạn EA chẩn đoán độc lập sau chỉ ghi cấu hình trong OnInit và để OnTick trống; không gửi, sửa lệnh hoặc quản lý vị thế. Lưu thành tệp MQ5 riêng, tự biên dịch trong MetaEditor và giữ kết quả/log thật của terminal. OnInit mô tả chữ ký khởi tạo, PrintFormat mô tả đầu ra định dạng. Chúng tôi chưa biên dịch hoặc chạy đoạn này trong MT5 tại đây.

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

Không thêm OnInit thứ hai vào EA hiện có hoặc thay khởi tạo của nó bằng đoạn này. Muốn thêm log phải giữ luồng hiện tại. Tài liệu tester nêu ngoại lệ OnInit đối với hạn chế PrintFormat khi tối ưu hóa; vắng log ở giai đoạn khác không chứng minh giai đoạn ấy chưa chạy. Kiểm tra môi trường và cách ghi log trước khi suy luận.

Tìm khác biệt đầu tiên thay vì chỉ so lợi nhuận

Lập cặp hồ sơ: trực quan/không trực quan, build terminal và phiên bản mã, inputs, symbol/timeframe, mô hình tạo tick, ngày bắt đầu yêu cầu/thực tế, ảnh chụp dữ liệu đầu vào, phí và trạng thái đầu. Giữ tệp cấu hình cùng mã định danh phiên bản. Nếu khác các khai báo này, chưa quy hết chênh lệch cho cửa sổ biểu đồ. Công cụ so hai hồ sơ backtest giúp sắp xếp kiểm tra.

Tìm bước sớm nhất khác: đọc thành công, thời điểm dữ liệu, độ sẵn sàng chỉ báo, tín hiệu, điều kiện rồi quyết định. Ghi “lãi 120 thay vì 80” không định vị được bước. Giữ log gốc và lập bảng nhỏ bên cạnh; đừng bịa lại giá trị chương trình trước đó không ghi.

Mỗi quan sát cần mã, đầu vào được yêu cầu, thời điểm hoặc vị trí trong chuỗi, trạng thái chấp nhận và giá trị nếu có. Ghi mọi thứ không có định danh ổn định có thể che chỗ phân kỳ. Hai mức giá trông giống nhau không chứng minh chúng thuộc cùng nến/bước. Thiết kế bản ghi giúp đối chiếu, không bảo đảm tự tìm mọi phụ thuộc.

Tách “giá đúng” khỏi “giá của đúng quan sát”

Ví dụ bổ sung ba quan sát hư cấu, ngưỡng 1.1040 và điều kiện >. 101 đọc được 1.1050: true. 102 không đọc được: unknown. 103 đọc được 1.1040: false vì bằng ngưỡng không phải lớn hơn. Nếu giữ âm thầm giá 1.1050 của 101 để lấp 102, phép so ở 102 lại true nhưng không có tín hiệu mới nào được xác nhận. Giá còn lưu trong bộ nhớ không tự là đầu vào hợp lệ cho quan sát hiện tại.

Kiểm tra giá trị và mã quan sát; không phải nhật ký MT5 thực
MãGiá trị/trạng thái hiện tạiĐường có kiểm traLỗi giữ giá cũ
1011.1050 / cótruetrue
102null / thiếuunknowntrue từ giá của 101
1031.1040 / cófalsefalse nếu cập nhật đúng

Trong ví dụ này, thêm cặp observation_id và available giúp phát hiện lỗi che dữ liệu thiếu; đó là tên trường do bài đề xuất, không API mới của MQL5. Từng chiến lược phải định nghĩa độ mới hợp lệ riêng; không tự cho một số giây chờ phổ quát. Đổi múi giờ hiển thị sang Việt Nam UTC+7 không biến hai timestamp khác nhau thành cùng quan sát; giữ cả offset/múi giờ gốc khi đối chiếu.

Thiết kế lại tín hiệu cần thay gì?

Khối tính nên trả giá trị và trạng thái khả dụng rõ ràng; lớp đồ họa chỉ hiển thị giá trị đó. Tắt vẽ khi ấy không cố ý đổi nguồn đầu vào. Thử các giá trị kiểm soát: lớn hơn, nhỏ hơn, bằng ngưỡng và thiếu dữ liệu. Kiểm tra thêm giá cũ khác mã quan sát. Đây là đề xuất thiết kế, không bảo đảm hai tester toàn chương trình giống nhau: phiên bản, dữ liệu, phí và phụ thuộc khác vẫn cần đối chiếu.

Không có mã nguồn, gửi tác giả EA cặp hồ sơ và khác biệt đầu tiên đã ghi. Không thay chẩn đoán bằng loạt lệnh thử trên tài khoản thật. Hướng dẫn backtest MT4/MT5 đi tiếp vào chuẩn bị thử nghiệm; mô hình không chứng minh lợi nhuận hay quyền dùng dịch vụ tài chính nào tại Việt Nam.

Dữ liệu thiếu khác dữ liệu cũ còn trong bộ nhớ

Dữ liệu thiếu khác dữ liệu cũ còn trong bộ nhớBa quan sát hư cấu, điều kiện giá trị > 1.1040; chưa có lệnh nào.PHÉP TÍNH GIẢ ĐỊNH101: 1.1050, sẵn sàngtrue102: thiếu đầu vàounknown103: 1.1040, sẵn sàngfalse
Dữ liệu thiếu khác dữ liệu cũ còn trong bộ nhớ. Ba quan sát hư cấu, điều kiện giá trị > 1.1040; chưa có lệnh nào.

Lưu giá trị, khả dụng và mã quan sát. Số cũ vẫn hợp lệ về kiểu nhưng có thể không hợp lệ cho bước hiện tại.

Trên màn hình nhỏ, bạn có thể cuộn ngang hoặc phóng to sơ đồ. Các giá trị và kết luận cũng có ở phần văn bản bên dưới.

101: 1.1050, sẵn sàng
true – Đọc hiện tại lớn hơn ngưỡng.
102: thiếu đầu vào
unknown – Không lấy lại 1.1050 của 101 rồi báo true.
103: 1.1040, sẵn sàng
false – Bằng ngưỡng không thỏa điều kiện lớn hơn.

Ba việc có thể làm tiếp

  1. Hoàn thành hồ sơ hai chế độ: phiên bản mã/build, inputs, dữ liệu, phạm vi. Đánh dấu chưa xác nhận; cùng tệp EA không chứng minh tất cả cấu hình và dữ liệu giống nhau.
  2. Tách thiếu giá trị với 0: chạy mô hình 1.1050 so 1.1040 rồi đặt bằng nhau. Đối tượng chưa có vẫn null, bất kể kết quả đường số. Không cần tài khoản giao dịch.
  3. Ghi giai đoạn phân kỳ: ở cấu hình demo tách biệt hoặc tester, lấy bản ghi chẩn đoán không đặt lệnh và so chuỗi. Xác định giá trị, trạng thái hay điều kiện đổi; mô tả lỗi không là khuyến nghị đầu tư hoặc chứng nhận chương trình an toàn.