Trang chủ > Blog > OnTick và OnTimer trong MQL5: cách dùng khi thiết kế EA

MQL5Phát triển EAMT5

OnTick và OnTimer trong MQL5: cách dùng khi thiết kế EA

Đăng: 2026-10-29Thời gian đọc: khoảng 3 phút
⏱ Bài viết này phản ánh thông tin tại thời điểm đăng. Các số liệu hiệu suất EA (PF, DD, lợi nhuận hàng năm) thay đổi theo giao dịch thực và việc kiểm chứng lại — hãy xem thông tin mới nhất trên các trang EA. Xem kết quả EA mới nhất →

Kết luận: quyết định theo "nến mới", xử lý theo thời gian bằng OnTimer

Xin nói kết luận trước. Với EA ra quyết định giao dịch trên khung thời gian dài như H1 hoặc H4, chỉ cần đưa ra quyết định ở tick đầu tiên của cây nến mới là đủ. Nếu lặp lại cùng một phép tính ở mỗi tick, bạn chỉ tốn CPU mà quyết định không thay đổi. Ngược lại, với những tác vụ cần chạy ngay cả khi không có tick, hãy dùng OnTimer. Ví dụ: ghi trạng thái ra file vào cuối tuần, hoặc dọn dẹp lệnh vào một giờ cố định.

Tuy nhiên, cách nào đúng còn tùy vào chiến lược. Bài viết này sẽ làm rõ sự khác biệt giữa hai cơ chế, cùng những điểm người chọn EA có thể tự kiểm tra.

So sánh nhà môi giới khuyên dùng →

🎁 Tải EA miễn phí

📧 Khóa học email miễn phí (8 email) + gói 13 chỉ báo MT5 dành riêng cho người đăng ký

Ngay sau khi đăng ký, bạn nhận được liên kết tải gói dành riêng cho người đăng ký gồm 13 chỉ báo MT5 của chúng tôi: tệp đã biên dịch (.ex5), mã nguồn và hướng dẫn cài đặt. Sau đó là 8 email về nền tảng giao dịch tự động, cách đọc backtest đúng và cách chọn sàn (mỗi ngày một email trong 5 ngày đầu, sau đó vào ngày thứ 7, 14 và 30 kể từ khi đăng ký). Bạn cũng được báo trước mỗi lần tăng giá của các phiên bản bán trên MQL5 Market (giá ra mắt tăng dần theo doanh số). Trên trang này, EA của chúng tôi miễn phí khi có tài khoản thật tại sàn đối tác.

* Quyền riêng tư được bảo vệ nghiêm ngặt. Bạn có thể hủy đăng ký bất cứ lúc nào.

Cơ chế: chạy theo tick và chạy theo thời gian

OnTick (chạy theo tick)

OnTick được gọi mỗi khi có giá mới (tick) đến với cặp tiền mà EA đang chạy. Trong lúc thị trường biến động mạnh, hàm có thể được gọi nhiều lần mỗi giây. Vào cuối tuần khi thị trường đứng yên, hàm không được gọi lần nào.

Có một đặc điểm cần biết. Tick đến trong lúc lần xử lý OnTick trước chưa xong sẽ không được xếp hàng chờ mà bị bỏ qua. Nghĩa là EA có mỗi lần xử lý quá nặng sẽ bỏ lỡ tick khi giá biến động nhanh.

OnTimer (chạy theo thời gian)

OnTimer được gọi theo khoảng thời gian đặt bằng EventSetTimer(). Hàm chạy độc lập với biến động giá nên vẫn được gọi cả khi thị trường đóng cửa. Mỗi EA chỉ có một bộ hẹn giờ, và nếu xử lý bị nghẽn thì sự kiện cũng bị bỏ qua tương tự. Ngoài ra, không có gì đảm bảo hàm được gọi đúng khít khoảng thời gian đã chỉ định.

Hạng mụcOnTickOnTimer
Điều kiện kích hoạtGiá được cập nhậtHết một khoảng thời gian
Khi thị trường đóng cửaKhông được gọiĐược gọi
Số lần được gọiThị trường càng sôi động càng nhiềuGần như không đổi
Phù hợp vớiQuyết định vào lệnh và đóng lệnhTổng hợp định kỳ, tác vụ theo giờ cố định
Lưu ý chínhXử lý nặng sẽ làm bỏ lỡ tickVẫn chạy dù chưa có giá mới

Cách viết để không lãng phí CPU với chiến lược tần suất thấp

Với chiến lược quyết định trên khung H4, dù OnTick được gọi hàng nghìn lần trong 4 giờ của một cây nến, giá trị của nến đã đóng dùng để ra quyết định vẫn không đổi. Vì vậy, chúng tôi thường áp dụng cách viết chỉ cho phần xử lý nặng chạy "khi nến thay đổi", như sau:

datetime g_lastBar = 0;

void OnTick()
{
   datetime cur = iTime(_Symbol, PERIOD_H4, 0);
   if(cur == g_lastBar) return;   // Cùng một cây nến thì không làm gì
   g_lastBar = cur;
   // Ở đây dùng nến đã đóng (shift 1) để ra quyết định
}

Một điểm quan trọng nữa là tạo handle của chỉ báo một lần duy nhất trong OnInit, không tạo lại trong OnTick mỗi lần. Nếu dùng OnTimer, hãy gọi EventKillTimer() trong OnDeinit để dừng bộ hẹn giờ.

Khi chạy nhiều EA trên nhiều chart ở VPS, những khác biệt này sẽ thể hiện thành mức tải CPU. Cách chọn VPS được tổng hợp tại Thông tin VPS.

Những điều người chọn EA có thể tự kiểm tra

Dù không xem được mã nguồn, bạn vẫn có thể kiểm tra phần nào các điểm sau:

  • Mô tả và tham số: có thiết lập như "chỉ quyết định ở nến mới" hay không
  • Mức dùng CPU của VPS: nếu gỡ một EA ra mà tải giảm rõ rệt, có thể EA đó đang xử lý nặng ở mỗi tick
  • Nhật ký Expert: kiểm tra xem có nội dung giống hệt nhau xuất hiện ở mỗi tick không
  • Kết quả trong Strategy Tester: với EA quyết định theo giá mở cửa của nến, kết quả giữa chế độ "Open prices only" và "Every tick" không nên chênh lệch lớn. Nếu lệch nhiều, EA đang phản ứng cả với biến động giá giữa nến

Về cách cài EA và các thiết lập cơ bản, xem Cách cài đặt EA.

Hạn chế và lưu ý

Xin nói rõ cả những mặt bất lợi.

  • Không theo dõi rủi ro giữa nến: nếu chỉ quyết định ở nến mới thì EA sẽ không phản ứng với biến động đột ngột giữa chừng. Nếu không thiết kế để cắt lỗ bằng lệnh dừng (stop) gắn sẵn vào lệnh, bạn có thể phải chịu khoản lỗ ngoài dự kiến.
  • Độ trễ của nến mới: dù nến mới đã hình thành, xử lý vẫn chưa chạy cho đến khi tick đầu tiên của nến đó đến. Với cặp tiền hoặc khung giờ ít biến động, quyết định có thể chậm hơn thời điểm nến bắt đầu.
  • OnTimer dễ lệch giữa Tester và thực tế: trong Tester, bộ hẹn giờ được gọi theo thời gian ảo nên khoảng cách không nhất thiết giống tài khoản thực.
  • Xử lý nhẹ hơn không làm kết quả tốt hơn: giảm tải CPU không giúp EA dễ thắng hơn. Chiến lược tốt hay không là vấn đề khác.

Với EA khung H4 và ít lệnh như ETHEREUM EA, sự khác biệt về thiết kế này càng khó nhận ra. Dù vậy, phạm vi bạn kiểm tra được từ bên ngoài là có hạn. Chúng tôi chỉ có thể khẳng định về mã do chính chúng tôi viết.

Tóm tắt

  • OnTick được gọi khi có giá đến, OnTimer được gọi theo khoảng thời gian cố định
  • Sự kiện đến trong lúc đang xử lý sẽ bị bỏ qua chứ không xếp hàng. Xử lý nặng dẫn đến bỏ lỡ sự kiện
  • Với chiến lược tần suất thấp, chỉ quyết định khi có nến mới sẽ không lãng phí CPU
  • Dùng OnTimer cho các tác vụ cần chạy cả lúc không có tick
  • Rủi ro giữa nến được bảo vệ bằng lệnh dừng. Xử lý nhẹ không làm kết quả tốt hơn
  • Các kinh nghiệm khác được tổng hợp tại Kiến thức EA và MT5

📧 Khóa học email miễn phí (8 email) + gói 13 chỉ báo MT5 dành riêng cho người đăng ký

Ngay sau khi đăng ký, bạn nhận được liên kết tải gói dành riêng cho người đăng ký gồm 13 chỉ báo MT5 của chúng tôi: tệp đã biên dịch (.ex5), mã nguồn và hướng dẫn cài đặt. Sau đó là 8 email về nền tảng giao dịch tự động, cách đọc backtest đúng và cách chọn sàn (mỗi ngày một email trong 5 ngày đầu, sau đó vào ngày thứ 7, 14 và 30 kể từ khi đăng ký). Bạn cũng được báo trước mỗi lần tăng giá của các phiên bản bán trên MQL5 Market (giá ra mắt tăng dần theo doanh số). Trên trang này, EA của chúng tôi miễn phí khi có tài khoản thật tại sàn đối tác.

* Quyền riêng tư được bảo vệ nghiêm ngặt. Bạn có thể hủy đăng ký bất cứ lúc nào.

Bạn có câu hỏi về EA hay Forex?

Bạn có thể đăng câu hỏi trên diễn đàn giao dịch Nattzy (đăng ký miễn phí). Không nhất thiết liên quan đến bài viết này — cài đặt EA, chọn sàn môi giới, v.v. đều được.

Hỏi trên Nattzy ↗

Bình luận & câu hỏi