Mục lục
Trả lời ngắn: Tick là lần cập nhật trạng thái giá, candle là bản tóm tắt dữ liệu trong một timeframe, còn event là thông báo khiến MT5 gọi một hàm xử lý. Chúng liên quan nhưng không đồng nghĩa: một candle nhận nhiều tick, và một event không phải toàn bộ lịch sử dữ liệu.
Đọc xong, bạn sẽ hiểu:
- Tick, candle và event khác nhau ở đầu vào và nhiệm vụ nào.
- Vì sao candle 0 còn đổi, còn candle 1 thường dùng cho logic đóng-bar.
OnTick()báo trạng thái mới nhưng không thay thế lịch sử tick.- Cách điền Event/Data Card mà không bật giao dịch.
Lưu ý giáo dục: Bài này giải thích dữ liệu và vòng đời chương trình. Ví dụ M5 và EA Mây X chỉ để học thiết kế, không phải chiến lược hay tín hiệu mua bán.
1. Tick, candle và event là ba lớp khác nhau
a. Tick là cập nhật, candle là tổng hợp
Tick là lần terminal nhận trạng thái giá mới. Tick có thể chứa Bid, Ask, Last, volume và cờ báo trường nào đổi. Bid là giá chào mua, Ask là giá chào bán, còn Last là giá khớp gần nhất khi trường này có ý nghĩa.
Candle, còn gọi là bar hoặc cây nến, gom dữ liệu theo một timeframe — độ dài của mỗi khoảng, như M1 hay M5. Candle thường có Open, High, Low và Close: giá đầu khoảng, cao nhất, thấp nhất và giá mới nhất/cuối khoảng.
Một candle M5 nhận nhiều tick. Tick mới có thể đổi High, Low hoặc Close của candle đang chạy, nhưng không tự tạo candle mới.
b. Event là lời nhắc chương trình xử lý
Event là thông báo terminal đưa vào chương trình. Event handler là hàm được MT5 gọi để xử lý loại thông báo đó, như OnTick() cho NewTick hay OnTimer() cho Timer event.
Hãy hình dung một camera và chuông cửa. Từng khung hình mới giống tick; bản tóm tắt “năm phút vừa qua” giống candle; chuông báo có việc giống event. Chuông không phải khung hình và cũng không phải bản tóm tắt.
Ví dụ chỉ giúp phân vai; MT5 vẫn có quy tắc queue và timeseries riêng.
Hình 1 — Dữ liệu cập nhật, dữ liệu tổng hợp và thông báo xử lý là ba lớp khác nhau.
c. Bảng tách nhanh
| Khái niệm | Trả lời câu hỏi | Ví dụ đầu ra |
|---|---|---|
| Tick | Trạng thái giá vừa cập nhật thế nào? | Bid, Ask, Last, time, flags |
| Candle | Khoảng thời gian này diễn biến ra sao? | Open, High, Low, Close |
| Event | Chương trình cần chạy handler nào? | NewTick, Timer, TradeTransaction |
Trong bài kiến trúc EA trước, event shell mở workflow còn data module tạo snapshot — gói dữ liệu chụp cùng thời điểm. Nhận thông báo chưa có nghĩa dữ liệu đã đủ.
2. Tick chứa gì và OnTick thực sự báo gì
a. MqlTick là một gói dữ liệu
MqlTick là cấu trúc MQL5 chứa thời gian, Bid, Ask, Last, volume và flags. Hàm SymbolInfoTick() đặt trạng thái giá mới nhất của mã vào cấu trúc này. MqlTick SymbolInfoTick
Flags cho biết phần nào của tick đã đổi. EA không nên giả định mọi trường luôn có cùng ý nghĩa.
Ví dụ giả định, tick A cập nhật Bid/Ask còn Last giữ nguyên. Nếu EA chỉ nhìn Last rồi kết luận “không có gì đổi”, nó đã bỏ qua loại cập nhật mình thực sự nhận.
b. OnTick là thông báo NewTick
OnTick() là handler được gọi khi NewTick event xuất hiện cho mã gắn với chart của EA. Các event được xử lý lần lượt. Nếu một NewTick đang ở trong hàng đợi hoặc đang được xử lý, NewTick khác không được thêm tiếp vào queue của chương trình. Event Handling
Queue, hay hàng đợi, là nơi event chờ tới lượt. Nó giống quầy lấy số: nhân viên xử lý từng lượt, nhưng tờ số không chứa toàn bộ hồ sơ khách hàng.
Vì vậy, số lần OnTick() chạy không phải bản sao hoàn chỉnh của lịch sử tick. OnTick() báo trạng thái thị trường đổi; terminal có thể nhận một nhóm thay đổi nhưng chỉ gọi handler một lần. Muốn phân tích lịch sử, EA phải đọc dữ liệu tick bằng hàm phù hợp. CopyTicks
c. Handler nặng tạo ra giả định sai
Nếu OnTick() tải nhiều dữ liệu và chạy vòng lặp dài, handler sau phải chờ. Việc không cần từng tick nên chuyển sang đúng event.
Câu đoán chắc là: “mỗi thay đổi giá luôn tạo đúng một lần gọi OnTick() mà EA đếm được”. Câu có điều kiện là: “OnTick() báo EA rằng trạng thái thị trường đã đổi; nếu cần lịch sử từng tick, phải đọc từ nguồn tick”. Câu đầu sai khi event bị gộp theo cơ chế queue hoặc code xử lý quá lâu.
3. Candle hình thành theo timeframe và vì sao index 0 còn đổi
a. Một candle M5 được xây như thế nào
Giả sử candle M5 mở lúc 10:00. Tick đầu tiên đặt Open. Từ 10:00 đến trước 10:05, High có thể tăng, Low có thể giảm và Close đổi theo cập nhật mới nhất. Khi khoảng 10:05 bắt đầu, terminal chuyển sang bar mới.
Đây chỉ là minh họa; khoảng trống thị trường khiến timeframe không luôn nhận tick đều.
b. Timeseries đếm từ hiện tại về quá khứ
Timeseries là chuỗi dữ liệu theo thời gian. MQL5 thường dùng reverse indexing, nghĩa là index 0 nằm gần hiện tại nhất.
Trong timeseries giá, bar 0 là khoảng hiện tại chưa hoàn tất; bar 1 là khoảng trước đã đóng. Tài liệu MetaQuotes nêu index 0 chứa bar hiện tại chưa hoàn tất, còn index 1 chứa bar trước. Timeseries Indexing Direction
Hình 2 — Candle 0 còn nhận tick; khi bar mới mở, bar vừa hoàn tất lùi thành candle 1.
c. Candle 1 ổn định hơn, không phải lời hứa bất biến
Logic đóng-bar thường đọc index 1 vì Open, High, Low và Close của khoảng trước đã chốt theo dữ liệu terminal hiện có. Candle 0 còn chạy nên một signal nhìn thấy giữa bar có thể biến mất trước lúc đóng.
Lịch sử có thể được đồng bộ hoặc xây lại, nên candle 1 chỉ ổn định hơn cho logic đóng-bar trong snapshot hiện tại.
Phát hiện bar mới thường dựa vào thời gian mở. EA lưu thời gian đã xử lý; nếu giá trị mới khác khóa cũ, nó đánh giá. Đếm tick không đủ vì số tick mỗi bar không cố định.
4. Chọn đúng cửa: Tick, Timer hay TradeTransaction
a. Ba event, ba nhiệm vụ
- NewTick: báo trạng thái thị trường vừa đổi; phù hợp để đọc tick/snapshot hoặc kiểm tra bar mới.
- Timer: event định kỳ; phù hợp cho kiểm tra sức khỏe hệ thống hoặc việc không cần từng tick.
- TradeTransaction: báo thay đổi liên quan quá trình xử lý request, order, deal và position; phù hợp cho vòng xác nhận giao dịch.
MQL5 còn các event khác; danh sách chính thức nằm tại Event Handling.
b. Event không sở hữu dữ liệu thay nhau
Timer không tự tạo tick. NewTick không chứng minh deal đã khớp. TradeTransaction không thay data module. Handler chỉ mở workflow; workflow vẫn kiểm tra dữ liệu và lỗi.
Ba lỗi thường gặp:
- Dồn mọi việc vào
OnTick()dù nhiều việc chỉ cần định kỳ. - Đọc candle 0 nhưng mô tả kết quả như bar đã đóng.
- Dùng số lần event làm lịch sử dữ liệu.
Điểm dừng là khi nguồn dữ liệu trả lỗi, bar chưa sẵn sàng, snapshot quá cũ hoặc event không đúng quyền. Khi đó EA không tạo hành động mới chỉ để “chạy cho đủ”.
5. Checklist và Event/Data Card 15 phút
a. Tám câu trước khi viết handler
- Trigger là Tick, Timer hay TradeTransaction?
- Handler cần dữ liệu mới nhất hay lịch sử?
- Timeframe nào và bar 0 hay bar 1?
- Snapshot gồm những trường nào?
- Freshness — độ mới còn hợp lệ — được đo bằng time nào?
- New-bar key hoặc duplicate key là gì?
- Đọc dữ liệu lỗi thì thử lại, chờ hay dừng an toàn?
- Event này được phép thay đổi state hoặc gửi request không?
Hình 3 — Một card ngắn buộc người viết nối đúng thông báo, dữ liệu, khóa chống lặp và điểm dừng.
b. Bài tập miễn phí, chưa dùng tiền thật
Dùng giấy hoặc Google Docs; có thể mở MetaEditor chỉ để xem tên handler. Không compile, bật AutoTrading hay gửi lệnh.
Điền Event/Data Card cho EA Mây X trong 10–15 phút. Mục tiêu là ghi đúng trigger và dữ liệu, không tạo chiến lược.
c. Mẫu tham khảo đã điền
| Field | EA Mây X | Khi nào dừng |
|---|---|---|
| Trigger | NewTick | Không coi mỗi call là một tick lịch sử |
| Data | Tick mới nhất + candle M5 | Đọc/copy lỗi thì dừng |
| Candle | Index 1 để đánh giá bar đã đóng | Index 0 còn đổi |
| New-bar key | Thời gian mở bar hiện tại | Key trùng thì WAIT |
| Other event | Timer kiểm tra sức khỏe hệ thống | Timer không tự tạo signal |
| Confirmation | TradeTransaction | Không dùng NewTick để tự xác nhận deal |
Tự kiểm: nếu không có tick, việc nào vẫn cần chạy? Hai NewTick có bị trùng key không? CopyRates() thiếu dữ liệu thì dừng ở đâu?
6. Tổng kết: thông báo đúng, dữ liệu đúng, thời điểm đúng
a. Năm ý chính
- Tick là cập nhật trạng thái giá; candle là dữ liệu tổng hợp theo timeframe.
- Event báo chương trình chạy handler, không thay thế dữ liệu.
OnTick()không phải bản sao của toàn bộ tick history.- Candle 0 chưa hoàn tất; candle 1 ổn định hơn cho logic đóng-bar.
- Event/Data Card nối trigger, data, key, freshness và stop condition.
Bài trước xây bản đồ kiến trúc Expert Advisor. Bài tiếp theo là State Machine trong EA #3, nơi các event làm hệ thống chuyển trạng thái có kiểm soát.
b. Câu hỏi tự kiểm tra
- Tick khác candle ở điểm nào?
- Vì sao không dùng số lần
OnTick()làm lịch sử tick? - Candle 0 và candle 1 khác nhau ra sao?
- TradeTransaction nên sở hữu việc gì?
c. Gợi ý đáp án
Xem gợi ý câu 1
Tick là cập nhật; candle gom nhiều cập nhật trong một timeframe. Xem lại mục 1.
Xem gợi ý câu 2
Queue có thể không gọi handler riêng cho mọi thay đổi; lịch sử phải đọc bằng hàm dữ liệu. Xem lại mục 2.
Xem gợi ý câu 3
Candle 0 đang chạy và còn đổi; candle 1 là bar trước đã đóng theo dữ liệu hiện có. Xem lại mục 3.
Xem gợi ý câu 4
Nó xử lý thông báo thay đổi giao dịch và hỗ trợ vòng xác nhận, không thay NewTick. Xem lại mục 4.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Tick | Một lần cập nhật trạng thái giá |
| Candle | Bản tóm tắt OHLC trong một timeframe |
| Timeframe | Độ dài thời gian của mỗi candle |
| Event | Thông báo terminal gửi chương trình |
| Handler | Hàm xử lý một loại event |
| Queue | Hàng đợi event chờ xử lý |
| Timeseries | Chuỗi dữ liệu theo thời gian |
| Freshness | Mức độ dữ liệu còn mới và dùng được |
e. Nguồn tham khảo
- MetaQuotes — Event Handling
- MetaQuotes — OnTick
- MetaQuotes — CopyTicks
- MetaQuotes — MqlTick
- MetaQuotes — SymbolInfoTick
- MetaQuotes — Timeseries and Indicators Access
- MetaQuotes — Indexing Direction
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. Dữ liệu, EA và mọi thị trường đều có rủi ro kỹ thuật lẫn rủi ro mất vốn.
Bài tiếp theo