Tín hiệu đúng mà lệnh không vào: 12 lý do, 3 tầng nguyên nhân và 3 bước tìm ra
Vận hành15/09/2026 · 18 phút đọc

Tín hiệu đúng mà lệnh không vào: 12 lý do, 3 tầng nguyên nhân và 3 bước tìm ra trong 10 phút

Có một sự cố khi chạy bot mà lần đầu gặp bạn sẽ tưởng mình sai ở đâu đó rất sâu: chiến lược báo tín hiệu, mọi điều kiện đều đúng, và không có lệnh nào được mở.

Log không có lỗi đỏ. EA vẫn chạy. Chart vẫn nhảy giá. Nút AutoTrading vẫn xanh. Nhưng lịch sử giao dịch trống.

Điều làm sự cố này khó chịu không phải vì nó hiếm — nó khá phổ biến — mà vì nó không nói cho bạn biết nó đang ở tầng nào. Một lệnh không vào có thể do EA không chạy, do tài khoản không đủ tiền, hoặc do một dòng cấu hình bạn viết sáu tháng trước. Ba nguyên nhân đó nằm ở ba tầng khác hẳn nhau, và cách sửa cũng khác hẳn nhau.

Bài này chia 12 lý do thành ba tầng, xếp theo thứ tự bạn nên kiểm tra, kèm bảng mã lỗi hay gặp và ba bước để tìm ra nguyên nhân trong khoảng 10 phút.

Một nguyên tắc xuyên suốt: lệnh không vào là một sự kiện có nguyên nhân xác định. Không có chuyện "tự nhiên nó không vào". Nếu bạn chưa tìm ra, đó là vì bạn chưa đọc đúng file — không phải vì nguyên nhân không tồn tại.


1. Vì sao sự cố này khó chịu hơn cả bot chết

So với "bot chết", tín hiệu đúng mà lệnh không vào có ba đặc điểm khiến nó khó xử lý hơn.

Thứ nhất: mọi chỉ số giám sát đều báo xanh. Nếu bạn giám sát theo tiến trình, MT5 vẫn chạy. Nếu giám sát theo nhịp dữ liệu, giá vẫn về. Nếu giám sát theo kết nối, sàn vẫn kết nối. Hệ thống của bạn đang hoạt động — chỉ là nó không mở lệnh. Và hầu hết hệ thống giám sát không được thiết kế để phát hiện "hoạt động nhưng không làm việc đúng".

Thứ hai: thiệt hại không hiện ra ngay. Bot chết thì bạn thấy ngay trong báo cáo. Lệnh không vào thì bạn chỉ thấy khi nhìn lại biểu đồ và tự hỏi "sao chỗ này không có lệnh". Có khi bạn mất vài ngày mới nhận ra.

Thứ ba: nó có thể là lỗi cấu hình có sẵn từ lâu. Ví dụ: một dòng điều kiện chỉ cho phép giao dịch trong khung 14:00–16:00 giờ broker. Nếu bạn đổi sang một sàn có múi giờ khác, khung đó vẫn đúng về mặt cú pháp nhưng sai về mặt thực tế. Bot không lỗi. Bạn không lỗi. Chỉ là hai thứ không còn khớp.

Vì ba đặc điểm này, cách tiếp cận đúng không phải là "đoán rồi sửa" — mà là kiểm tra theo tầng, có thứ tự. Làm ngược lại (đoán từ tầng thấp) là cách mất nhiều giờ nhất.


2. Ba tầng nguyên nhân

Ba tầng nguyên nhân, kiểm từ trong ra ngoài
Ba tầng nguyên nhân, kiểm từ trong ra ngoài

Tầng 1 — EA và terminal. Câu hỏi của tầng này: EA có thật sự đang chạy và được phép giao dịch không? Bốn lý do ở tầng này đều có đặc điểm chung: chúng chặn ở phía trước, nghĩa là lệnh chưa bao giờ được gửi tới sàn. Vì vậy không có mã lỗi của sàn — và đây chính là lý do nhiều người đi tìm ở tầng 2 rồi không thấy gì.

Tầng 2 — Sàn và tài khoản. Câu hỏi: lệnh đã tới sàn chưa, và sàn trả lời gì? Sáu lý do ở tầng này hầu như luôn để lại mã trả về (retcode) trong log. Đây là tầng dễ chẩn đoán nhất — nếu bạn có log.

Tầng 3 — Kiểm soát nội bộ. Câu hỏi: chính EA của bạn có đang chặn lệnh không? Đây là tầng khó nhất, vì nó không phải lỗi kỹ thuật mà là lỗi thiết kế: bộ lọc giờ, bộ lọc ngày, giới hạn số lệnh, cờ bật/tắt trong cấu hình. Tầng này không để lại dấu vết nào nếu bạn không tự viết log cho nó.

Thứ tự kiểm tra quan trọng vì một lý do rất thực tế: lỗi ở tầng trên che mất lỗi ở tầng dưới. Nếu AutoTrading đang tắt, bạn sẽ không bao giờ thấy mã lỗi của sàn — vì chưa có lệnh nào được gửi. Tìm ở tầng 2 trong trường hợp đó là hoàn toàn vô ích.


3. Tầng 1 — Bốn lý do phía EA và terminal

3.1. EA không nạp lên chart

Đây là lý do phổ biến nhất, và cũng là lý do dễ kiểm tra nhất.

Biểu hiện: ở góc trên bên phải của chart không có tên EA (hoặc có tên nhưng kèm biểu tượng mặt cười buồn). Trong tab Journal có dòng expert ... removed.

Nguyên nhân thường gặp:

  • Bạn quên kéo EA lên chart sau khi khởi động lại MT5. Đây là trường hợp hay gặp nhất khi mọi thứ khác đều đúng.
  • EA bị gỡ khi terminal tắt. Nếu bạn dùng profile và profile không được lưu, chart có thể mở lại mà không có EA.
  • File EA không còn ở đúng thư mục. Nếu bạn cập nhật MT5 hoặc chuyển sang chế độ portable, thư mục dữ liệu thay đổi và MT5 không tìm thấy EA.
  • EA bị chặn bởi cài đặt bảo mật của terminal. Một số bản MT5 yêu cầu xác nhận cho phép EA của bên thứ ba chạy.

Cách kiểm tra trong 10 giây: nhìn góc trên phải chart. Nếu không có tên EA và biểu tượng mặt cười, mọi chẩn đoán tiếp theo đều vô nghĩa.

3.2. AutoTrading bị tắt

Nút AutoTrading ở thanh công cụ MT5 là một công tắc tổng. Khi nó tắt, EA vẫn chạy, vẫn tính toán, vẫn in log — nhưng mọi lệnh gửi đi đều bị chặn ngay tại terminal.

Có ba đường dẫn tới trạng thái này, và điều đáng chú ý là hai trong ba đường không do bạn bấm:

  1. Bạn bấm nhầm. Ít gặp nhưng có.
  2. Terminal bị tắt và mở lại. MT5 ghi nhớ trạng thái AutoTrading trong một số trường hợp và không ghi nhớ trong một số trường hợp khác — tùy cách tắt.
  3. Một EA khác gọi hàm tắt AutoTrading. Nếu bạn có nhiều EA trên cùng terminal và một trong số đó có logic tắt giao dịch khi gặp sự cố, nó có thể tắt cho cả terminal.

Biểu hiện trong log: dòng trade is disabled (mã 10027 hoặc thông báo tương tự). Nếu bạn thấy dòng này, hãy kiểm tra nút AutoTrading trước khi làm bất cứ việc gì khác.

Một chi tiết quan trọng cho vận hành: trạng thái AutoTrading không được lưu bền qua mọi kiểu khởi động lại. Vì vậy với VPS chạy 24/7, đây là thứ bạn phải kiểm tra sau mỗi lần máy khởi động lại — cùng lúc với kiểm tra MT5 đã mở chưa.

3.3. Tín hiệu chưa từng xuất hiện

Đây là lý do "không phải lỗi" hay gặp nhất, và nó thường bị chẩn đoán sai thành lỗi.

Chuyện xảy ra: bạn nhìn biểu đồ, thấy rõ ràng là điểm vào lệnh. Bạn mở log, không thấy dòng nào. Bạn kết luận "bot bị lỗi".

Nhưng nếu tab Experts hoàn toàn im lặng — không có dòng SKIP, không có dòng điều kiện chưa đủ — thì rất có thể EA đang không đánh giá tín hiệu trên nến đó. Có bốn biến thể:

  • EA chỉ chạy khi có nến mới (`new bar`). Nếu bạn restart bot giữa nến, EA sẽ chờ tới nến tiếp theo. Trông như bot im lặng.
  • EA được cấu hình cho một khung thời gian khác với chart bạn đang xem. Biểu đồ H1 đẹp, nhưng EA đọc M15.
  • Điều kiện thật sự chưa đủ. Biểu đồ nhìn "rõ" với mắt người, nhưng điều kiện trong code có thêm một vế bạn quên — ví dụ yêu cầu chỉ báo phải ở dưới một mức cụ thể.
  • EA đang ở trạng thái chờ (cooldown) sau một lệnh trước đó. Nhiều EA có thời gian chờ tối thiểu giữa hai lệnh.

Cách xử lý: thêm một dòng log in ra giá trị của từng điều kiện, không chỉ in ra kết quả. Ví dụ thay vì chỉ in khong du dieu kien, hãy in rsi=32.1 (can <30) | spread=1.8 (can <2.0) | gio=13:45 (can 14:00-16:00). Một dòng log như vậy biến một cuộc điều tra nhiều giờ thành một lần đọc.

3.4. EA đang ở chế độ chỉ đọc

Đây là lý do ít gặp nhưng gây bối rối nhất: terminal vẫn đang ở chế độ Strategy Tester.

Trong MT5, khi bạn đang xem kết quả backtest hoặc đang tối ưu tham số, một số thành phần của giao diện chuyển sang chế độ chỉ đọc. Nếu bạn để terminal ở tab này rồi khởi động lại, có trường hợp EA trên chart không nhận được quyền gửi lệnh.

Biểu hiện: EA chạy, log có dòng khởi tạo, nhưng không có lệnh nào — không có cả mã lỗi. Cách kiểm tra: nhìn xem terminal đang ở tab nào, và thoát khỏi Strategy Tester trước khi để bot chạy thật.


4. Tầng 2 — Sáu lý do phía sàn và tài khoản

Đây là tầng "tốt" để chẩn đoán, vì nó trả lời bằng mã số.

4.1. Không đủ margin

Biểu hiện: retcode 10019 — trong log là no money.

Điều đáng chú ý: lệnh có thể bị từ chối dù tài khoản còn tiền, nếu margin khả dụng không đủ tại thời điểm gửi. Có ba trường hợp hay gặp:

  • Bạn đã có lệnh đang mở chiếm phần lớn margin khả dụng.
  • Khối lượng của lệnh mới lớn hơn dự tính (ví dụ EA tính sai do thay đổi đòn bẩy của tài khoản).
  • Đòn bẩy của tài khoản bị sàn hạ xuống trong một số khung giờ hoặc trước tin lớn — điều này có thật ở một số sàn.

Cách xử lý: kiểm tra margin khả dụng trước khi gửi, và log lại giá trị đó mỗi lần có lệnh bị từ chối. Con số này giúp bạn biết là "thiếu một chút" hay "thiếu hoàn toàn" — hai tình huống có cách xử lý khác nhau.

4.2. Symbol đổi tên có hậu tố

Đây là lý do tôi xếp vào nhóm nguy hiểm nhất, vì nó xảy ra khi bạn đổi sàn và không ai báo cho bạn.

Nhiều sàn phát hành cùng một cặp tiền với nhiều loại tài khoản khác nhau, và phân biệt bằng hậu tố: EURUSD.a, EURUSD.pro, EURUSD_raw, EURUSD.m. Nếu EA của bạn tìm EURUSD mà tài khoản chỉ có EURUSD.pro, lệnh sẽ thất bại.

Biểu hiện: retcode 10013 (invalid request) hoặc mã 4301 (unknown symbol). Đôi khi mã trả về không rõ ràng và bạn chỉ thấy "lỗi không xác định".

Cách xử lý: không bao giờ viết tên symbol cứng trong code. Hãy đọc tên symbol từ một biến cấu hình, và thêm một bước kiểm tra trong OnInit:

  • Duyệt danh sách symbol có trong terminal.
  • Tìm tên khớp chính xác trước.
  • Nếu không có, thử tìm tên khớp sau khi bỏ hậu tố.
  • Nếu tìm thấy, ghi lại tên thật đang dùng vào log; nếu không tìm thấy, báo lỗi rõ ràng và dừng.

Một dòng log ghi tên symbol thật khi khởi động sẽ tiết kiệm cho bạn hàng giờ về sau.

4.3. Filling mode không khớp

Đây là lý do rất "kỹ thuật" nhưng lại gây ra nhiều ca lệnh không vào nhất trong vài năm gần đây.

Mỗi sàn chỉ chấp nhận một số chế độ khớp lệnh nhất định (fill by market, fill by limit, IOC...). Nếu EA gửi lệnh với chế độ khớp mà sàn không hỗ trợ, lệnh bị từ chối.

Biểu hiện: retcode 10030unsupported filling mode. Nhưng có sàn trả về mã chung chung, khiến bạn tưởng là lỗi khác.

Cách xử lý đúng: đọc chế độ khớp mà symbol hỗ trợ và dùng đúng chế độ đó. Trong MQL5 có thuộc tính SYMBOL_FILLING_MODE cho biết symbol hỗ trợ gì. Thay vì đặt cứng một giá trị, hãy kiểm tra và chọn giá trị phù hợp:

  • Nếu symbol hỗ trợ khớp theo giá thị trường, dùng giá trị đó.
  • Nếu chỉ hỗ trợ khớp theo lệnh giới hạn, dùng giá trị còn lại.
  • Nếu cả hai không được hỗ trợ, ghi log và dừng — đây là trường hợp bạn cần nói chuyện với sàn.

Thêm một chi tiết thực tế: cùng một sàn có thể có nhiều symbol hỗ trợ các chế độ khác nhau. Nên kiểm tra theo từng symbol, đừng suy ra cho cả tài khoản.

4.4. Khối lượng sai bước nhỏ nhất

Ba con số của symbol mà EA phải tôn trọng:

  • Khối lượng tối thiểu — ví dụ 0,01 lot.
  • Bước khối lượng — ví dụ 0,01 (không được gửi 0,015).
  • Khối lượng tối đa — ví dụ 100 lot.

Nếu EA tính khối lượng theo vốn (ví dụ 1% rủi ro chia khoảng cách stop) rồi gửi một số không chia hết cho bước, sàn sẽ từ chối.

Biểu hiện: retcode 10014 — invalid volume.

Đây là lỗi rất hay gặp ở các bot dùng khối lượng động, và đặc biệt hay gặp ở những tài khoản có bước khối lượng khác 0,01. Cách xử lý rất đơn giản nhưng phải làm đúng thứ tự:

  1. Tính khối lượng theo công thức.
  2. Chia lấy phần nguyên theo bước rồi nhân lại — đừng làm tròn lên.
  3. Kiểm tra lại xem kết quả có nhỏ hơn khối lượng tối thiểu không; nếu có, quyết định rõ ràng: bỏ lệnh, hay dùng khối lượng tối thiểu.
  4. Ghi log cả khối lượng tính được và khối lượng thực gửi — chênh lệch giữa hai con số này là thứ bạn cần biết khi gỡ lỗi.

Bước 3 là bước hay bị bỏ. Nếu bạn luôn dùng khối lượng tối thiểu khi tính ra nhỏ hơn, bạn đang tăng rủi ro so với thiết kế trong những ca đó. Đó là quyết định cần được viết rõ trong code, không phải quyết định ngầm.

4.5. Mã đang ở chế độ chỉ đóng lệnh

Một số sàn cho phép mở lệnh nhưng không cho đóng trong vài phút quanh giờ nghỉ, hoặc ngược lại. Một số sàn chuyển symbol sang chế độ chỉ đóng trước tin lớn.

Biểu hiện: retcode 10018 — market closed. Nhưng cũng có trường hợp sàn báo lỗi khác và bạn không nghĩ tới khả năng này.

Cách phòng: coi giờ giao dịch và trạng thái symbol là dữ liệu cần đọc, không phải giả định. Trong MQL5 có các thuộc tính mô tả giờ giao dịch và trạng thái trade của symbol. Hãy kiểm tra trước khi gửi thay vì gửi rồi xử lý lỗi.

4.6. Giá lệch quá ngưỡng cho phép

Đây là lý do bạn hoặc sàn chủ động từ chối lệnh, khác với các lý do trên.

Có hai hướng:

  • Sàn từ chối: retcode 10004 (requote) hoặc 10006 (rejected). Sàn báo giá đã thay đổi và không muốn khớp ở giá cũ.
  • EA từ chối: nhiều EA có tham số "độ lệch giá tối đa cho phép" (maximum deviation). Nếu giá hiện tại lệch quá ngưỡng so với giá EA tính, EA tự bỏ lệnh.

Hướng thứ hai là hướng nhiều người quên — vì nó do chính code của họ quyết định. Nếu bot của bạn im lặng đúng lúc thị trường biến động, hãy kiểm tra tham số này trước.

Một chi tiết quan trọng: ngưỡng lệch giá nên thay đổi theo loại bot. Bot scalping cần ngưỡng rất chặt vì 0,2 pip đã ảnh hưởng tới lợi nhuận. Bot swing có thể để ngưỡng rộng hơn nhiều. Đặt cùng một con số cho mọi bot là cách chắc chắn gây ra vấn đề ở một trong hai.


5. Tầng 3 — Hai lý do thuộc về chính bạn

5.1. Bộ lọc giờ hoặc ngày chặn lệnh

Đây là lý do khó tìm nhất trong cả 12, vì nó không tạo ra lỗi nào.

Bộ lọc giờ là đoạn code như: "chỉ mở lệnh trong khoảng 14:00–16:00" hoặc "không giao dịch thứ Sáu" hoặc "tránh 30 phút quanh tin". Các đoạn này rất hợp lý trong thiết kế, và rất khó thấy khi gỡ lỗi.

Ba biến thể hay gặp:

  • Giờ sai múi giờ. Bạn viết bộ lọc theo giờ Việt Nam nhưng MT5 trả về giờ sàn. Xem bài về múi giờ và DST ở cuối bài này.
  • Ngày sai do sàn hạch toán. Một số sàn đặt "ngày" theo giờ New York, nghĩa là nến của bạn có thể thuộc ngày hôm sau so với giờ Việt Nam.
  • Bộ lọc chồng nhau. Một bộ lọc cho phép 14:00–16:00, một bộ lọc khác chặn 15:00–15:30. Bạn chỉ nhớ cái đầu.

Cách xử lý không phải là "kiểm tra lại code" — mà là in ra quyết định của bộ lọc. Ví dụ: mỗi khi bộ lọc chặn, in một dòng bo_loc_gio: chan (gio_san=15:12, khung=14:00-16:00, ngay=Thu). Dòng log này không tốn gì và biến một vấn đề vô hình thành hữu hình.

5.2. Giới hạn số lệnh của chính EA

Nhiều EA có những giới hạn "an toàn" do người viết tự thêm:

  • Tối đa N lệnh mỗi ngày.
  • Tối đa N lệnh đang mở cùng lúc.
  • Không mở lệnh mới nếu lệnh trước vẫn đang mở.
  • Thời gian chờ tối thiểu giữa hai lệnh.

Tất cả đều hợp lý. Nhưng nếu giới hạn đó được ghi trong cấu hình mà bạn không nhớ, bot sẽ im lặng đúng lúc bạn cần nó giao dịch.

Điều đáng chú ý: giới hạn thường bị chạm sau một ngày biến động. Nếu bot hoạt động tốt cả tháng rồi đột nhiên im lặng một ngày, hãy kiểm tra xem số lệnh trong ngày đó đã chạm giới hạn chưa.

Cách xử lý: mỗi khi chặn vì giới hạn, in log kèm ba con số: giới hạn, số hiện tại, thời điểm giới hạn sẽ được đặt lại. Ba con số này trả lời được câu hỏi "bot im vì lý do gì và bao giờ nó hoạt động lại".


6. Ba bước tìm ra nguyên nhân trong 10 phút

Ba bước tìm ra lệnh không vào trong 10 phút
Ba bước tìm ra lệnh không vào trong 10 phút

Bước 1 — Journal của terminal

Journal là log của bản thân terminal, không phải của EA. Đây là nơi ghi lại những sự kiện ở mức hệ thống: EA được nạp, EA bị gỡ, lệnh bị từ chối ở mức terminal, kết nối bị mất.

Cách đọc nhanh: mở Journal, lọc theo khoảng thời gian quanh tín hiệu, tìm các dòng có chứa failed, disabled, invalid, removed. Bốn từ này bao được phần lớn thông báo ở tầng 1 và tầng 2.

Một lưu ý về cách đọc: đọc từ dưới lên. Dòng cuối cùng thường là nguyên nhân gần nhất, và trong nhiều trường hợp là nguyên nhân duy nhất.

Bước 2 — Tab Experts của EA

Đây là nơi EA in ra quyết định của chính nó. Và đây cũng là bước bị bỏ qua nhiều nhất — vì nhiều EA không in gì cho nhánh "không gửi lệnh".

Nếu EA của bạn thuộc loại đó, đây là một lỗi thiết kế log, và nó là lý do bạn đang mất thời gian. Cách sửa rất đơn giản: thêm một dòng log cho mỗi nhánh quyết định. Cụ thể là mỗi điều kiện được đánh giá, in ra:

  • Tên điều kiện.
  • Giá trị thực tế.
  • Ngưỡng cần đạt.
  • Kết quả đúng hay sai.

Ví dụ một dòng log tốt:

mql5
// In ra GIA TRI THUC TE cua tung dieu kien, khong chi in ket qua.
PrintFormat("[SIG] bar=%s | rsi=%.1f (can<30 %s) | spread=%.1f (can<2.0 %s) | gio=%s (can 14:00-16:00 %s)",
            TimeToString(iTime(_Symbol, PERIOD_CURRENT, 0)),
            rsi,   rsi   < 30   ? "OK" : "FAIL",
            spread, spread < 2.0 ? "OK" : "FAIL",
            TimeToString(TimeCurrent(), TIME_MINUTES),
            trong_khung_gio ? "OK" : "FAIL");

Bốn tham số trong một dòng, và bất kỳ lần nào bot không vào lệnh, bạn đọc một dòng là biết ngay điều kiện nào chặn. So với việc đọc code, cách này nhanh hơn ít nhất mười lần.

Bước 3 — Lịch sử giao dịch của tài khoản

Bước này để trả lời một câu hỏi mà hai bước trên không trả lời được: lệnh có tới sàn không?

Nếu Journal nói "lệnh được gửi" và lịch sử không có gì, bạn đang ở nhóm lỗi tầng 2 (sàn từ chối) hoặc vấn đề đồng bộ dữ liệu. Nếu Journal nói "lệnh bị từ chối" và lịch sử không có gì, bạn có mã lỗi để tra. Nếu cả hai đều trống, bạn đang ở tầng 1 hoặc tầng 3.

Cách làm cụ thể: đếm số lệnh trong khoảng thời gian đó, rồi so với số tín hiệu mà EA báo. Con số chênh lệch chính là thứ bạn cần giải thích — và nó thường nhỏ hơn bạn tưởng, nghĩa là vấn đề chỉ nằm ở một nhánh điều kiện cụ thể chứ không phải toàn bộ bot.


7. Bảng mã lỗi hay gặp

Mười hai lý do lệnh không vào dù tín hiệu đúng
Mười hai lý do lệnh không vào dù tín hiệu đúng
NghĩaViệc cần làm ngay
10004RequoteKiểm tra ngưỡng lệch giá, xem có đang gửi đúng lúc spread giãn
10006RejectedXem thông báo kèm theo; thường là ngưỡng lệch giá hoặc chế độ khớp
10013Invalid requestKiểm tra tên symbol, chế độ khớp, khối lượng
10014Invalid volumeLàm tròn theo bước khối lượng, kiểm tra tối thiểu và tối đa
10016Invalid stopsStop-loss quá gần giá; kiểm tra mức tối thiểu của sàn
10018Market closedKiểm tra giờ giao dịch và trạng thái của symbol
10019No moneyKiểm tra margin khả dụng, không chỉ số dư
10027Trade disabledKiểm tra nút AutoTrading và quyền giao dịch của tài khoản
10030Unsupported filling modeĐọc chế độ khớp symbol hỗ trợ và dùng đúng chế độ đó
4301Unknown symbolTên symbol sai hoặc kèm hậu tố bạn chưa cập nhật

Cách dùng bảng này: khi có mã lỗi, tra một dòng rồi làm đúng việc ở cột ba. Đừng sửa nhiều thứ cùng lúc — mỗi lần chỉ sửa một nguyên nhân, rồi chạy lại để xác nhận. Sửa ba thứ cùng lúc nghĩa là bạn sẽ không biết thứ nào có tác dụng, và lần sau gặp lại bạn vẫn không biết.

Một điều đáng nhớ về mã lỗi: mã trả về từ sàn là thông tin, không phải kết luận. Mã 10013 (invalid request) có thể do ba nguyên nhân khác nhau. Vì vậy bảng này là điểm bắt đầu, không phải điểm kết thúc — và nó chỉ hữu ích nếu bạn có log đủ chi tiết để biết tham số nào đã bị sai.


8. Viết log để lần sau tự trả lời

Nếu bạn chỉ làm một việc sau khi đọc bài này, hãy làm việc này: viết lại lớp log của EA theo hướng "mọi nhánh quyết định đều để lại một dòng".

Một lớp log đủ dùng nên có bốn nhóm dòng:

Nhóm 1 — Nhịp sống. Một dòng mỗi nến (hoặc mỗi phút) ghi giờ, giá, và trạng thái kết nối. Nhóm này giúp bạn biết bot còn sống, và cũng giúp so khoảng thời gian khi cần điều tra.

Nhóm 2 — Đánh giá điều kiện. Mỗi điều kiện, một dòng, kèm giá trị thực tế và ngưỡng. In cả khi điều kiện đúng và khi sai — nếu chỉ in khi sai, bạn sẽ không biết bot có đang đánh giá hay không.

Nhóm 3 — Quyết định gửi lệnh. Các tham số của lệnh: symbol thật, khối lượng đã làm tròn, giá, stop-loss, chế độ khớp, ngưỡng lệch giá. Nhóm này trả lời được phần lớn câu hỏi ở tầng 2.

Nhóm 4 — Kết quả. Mã trả về, và nếu thất bại thì thông báo kèm theo. Đây là nhóm duy nhất bạn không tự viết được — nó đến từ sàn — nhưng bạn phải in nó ra thay vì bỏ qua.

Điểm quan trọng nhất về lớp log này: nó phải đọc được bởi người khác, không chỉ bởi bạn lúc viết code. Nếu một dòng log cần bạn nhớ ba thứ để hiểu, nó sẽ vô dụng đúng lúc bạn mệt nhất. Hãy viết như đang viết cho chính mình ba tháng sau, lúc 3 giờ sáng.


9. Câu hỏi thường gặp

Hỏi: Bot chạy tốt nhiều tháng, tự nhiên hôm nay không vào lệnh. Nên kiểm tra gì trước?

Theo thứ tự: (1) AutoTrading có bật không; (2) EA còn trên chart không; (3) giới hạn số lệnh trong ngày đã chạm chưa; (4) có tin lớn trong khung đó không. Bốn thứ này giải thích phần lớn các ca "tự nhiên". Nếu cả bốn đều bình thường, hãy mở log và đọc — đừng suy đoán.

Hỏi: Lệnh không vào nhưng log hoàn toàn trống. Nghĩa là gì?

Nghĩa là EA không đánh giá tín hiệu trên nến đó, hoặc EA đang không chạy. Kiểm tra theo thứ tự: EA có trên chart không, tab Experts có dòng nào không, và nến có phải nến mới không. Trường hợp phổ biến nhất là EA chỉ chạy theo nến mới và bạn đang xem một nến đang hình thành.

Hỏi: Có nên bật log ở mức chi tiết nhất có thể không?

Không. Log rất chi tiết làm sinh ra ba vấn đề: file phình nhanh, bạn khó tìm thông tin cần, và quan trọng nhất — bạn quen bỏ qua log. Hãy bật chi tiết trong giai đoạn gỡ lỗi, rồi hạ xuống mức nhóm 1 + nhóm 3 khi bot đã ổn định. Giữ thêm một cờ cấu hình để bật log chi tiết khi cần.

Hỏi: Tôi có nên dùng cùng một tên symbol cho mọi sàn không?

Không — hãy để tên symbol là cấu hình, và có bước kiểm tra khi khởi động. Bước kiểm tra này nên tìm nhiều biến thể (khớp chính xác trước, rồi tới bỏ hậu tố), và ghi lại tên thật nó chọn. Một dòng log lúc khởi động rẻ hơn nhiều so với nửa ngày tìm lỗi.

Hỏi: Làm sao phân biệt "EA từ chối gửi" và "sàn từ chối nhận"?

Nhìn xem có mã trả về hay không. Nếu có mã trả về, lệnh đã tới sàn và sàn đã trả lời — đó là nhóm tầng 2. Nếu không có mã nào, lệnh chưa bao giờ được gửi — nhóm tầng 1 hoặc tầng 3. Quy tắc này giải quyết được phần lớn ca mơ hồ, và nó là lý do bạn cần in mã trả về ra log.

Hỏi: Nên kiểm tra những thứ này bao lâu một lần?

Không theo lịch định kỳ, mà theo sự kiện. Bốn sự kiện cần kiểm tra: sau mỗi lần VPS khởi động lại, sau mỗi lần cập nhật MT5, sau mỗi lần đổi sàn hoặc đổi tài khoản, và sau mỗi lần bạn sửa logic EA. Bốn sự kiện này là bốn lúc mà cấu hình có thể lệch khỏi thực tế.


10. Checklist và tóm lại

Khi lệnh không vào (làm theo thứ tự):

  • [ ] Nút AutoTrading có đang bật không?
  • [ ] EA có trên chart không (tên và biểu tượng ở góc trên phải)?
  • [ ] Terminal có đang ở tab Strategy Tester không?
  • [ ] Tab Experts có dòng nào trong khoảng thời gian đó không?
  • [ ] Có mã trả về (retcode) trong log không? Nếu có, tra bảng ở mục 7.
  • [ ] Giới hạn số lệnh trong ngày của EA đã chạm chưa?
  • [ ] Bộ lọc giờ và ngày có đang chặn không — và bạn có log in ra quyết định đó không?
  • [ ] Tên symbol trong cấu hình có khớp tên thật trong terminal không?

Ba việc nên làm để lần sau nhanh hơn:

  1. In giá trị của từng điều kiện, không chỉ in kết quả. Đây là việc có tỉ lệ giá trị trên công sức cao nhất.
  2. Không viết tên symbol cứng trong code. Đọc từ cấu hình và kiểm tra khi khởi động.
  3. Làm tròn khối lượng theo bước của symbol, và ghi log cả giá trị tính và giá trị gửi.

Ba nguyên tắc để nhớ:

  • Kiểm tra theo tầng, từ trong ra ngoài. Lỗi ở tầng trên che mất lỗi ở tầng dưới — nên kiểm tầng 1 trước tầng 2.
  • Có mã trả về nghĩa là lệnh đã tới sàn. Không có mã nghĩa là lệnh chưa bao giờ được gửi. Quy tắc này chia đôi toàn bộ không gian vấn đề.
  • Lệnh không vào luôn có nguyên nhân xác định. Nếu bạn chưa tìm ra, bạn chưa đọc đúng file — không phải nguyên nhân không tồn tại.

Và nếu bạn chỉ làm được một việc: hãy thêm dòng log in ra giá trị thực tế của từng điều kiện, kèm ngưỡng và kết quả đúng hay sai. Đó là việc tốn 15 phút, và nó biến mọi lần bot im lặng từ một cuộc điều tra thành một lần đọc log.

Đọc xong rồi? Hãy thử ngay — miễn phí 7 ngày.