Trả lời ngắn: Tick Data Quality trong backtest EA là mức dữ liệu phù hợp với câu hỏi mà bài test cần trả lời. Dữ liệu tốt phải có nguồn, phạm vi thời gian, độ phủ, độ chi tiết và giới hạn rõ; nhiều tick hơn hoặc nhãn “real ticks” chưa chứng minh kết quả đáng tin hay giống giao dịch live.

Đọc xong, bạn sẽ hiểu: real ticks khác ticks được tester sinh ra thế nào; bốn mode trả lời câu hỏi gì; vì sao có fallback; và cách lập Tick Data Contract để chấp nhận, gắn nhãn, kiểm tra lại hoặc loại một run.

Lưu ý giáo dục: T19 là ví dụ dữ liệu giả để học kiểm định. Bài không đánh giá broker, không khuyên dùng EA, symbol hay thiết lập giao dịch nào.

1. Data quality là phù hợp mục đích, không phải một con số đẹp

a. Tick là gì, “đủ tốt” nghĩa là gì?

Tick là một lần cập nhật thị trường mà EA có thể nhận như thay đổi Bid, Ask, Last hoặc volume. Tick Data Quality không chỉ hỏi “có bao nhiêu tick”, mà hỏi dữ liệu có đủ để kiểm chứng hành vi EA đang quan tâm hay không.

Một EA chỉ ra quyết định khi bar mới mở cần ít thông tin hơn EA kéo trailing stop trong bar, đo spread từng tick hoặc xử lý thứ tự chạm stop và target. Cùng một file lịch sử có thể phù hợp cho câu hỏi thứ nhất nhưng không phù hợp cho câu hỏi thứ hai. Đây là phù hợp mục đích: chất lượng phải gắn với dependency của hệ thống.

Hình dung camera an ninh chụp một ảnh mỗi giờ và camera quay video liên tục. Cả hai đều “phủ” một ngày, nhưng ảnh theo giờ không trả lời được ai bước vào trước. Open-price data và tick stream khác nhau theo cách tương tự.

b. Hai lớp không được trộn

Lớp thứ nhất là chất lượng đầu vào: nguồn, thời gian, coverage, gap, Bid/Ask/spread, session và tính nhất quán. Lớp thứ hai là mức mô phỏng execution: latency, hàng đợi, trượt giá, thanh khoản và quy tắc broker.

Dữ liệu lịch sử chi tiết hơn có thể giảm một nguồn sai số, nhưng không tái tạo đầy đủ lớp execution. Vì vậy 100% REAL TICKS không có nghĩa LIVE EXECUTION.

Hình 1 — Data quality chỉ có nghĩa khi gắn nguồn, coverage và hành vi EA cần kiểm chứng.

2. Bốn tester mode và nguồn dữ liệu thực sự dùng

a. Real ticks và generated ticks

Real ticks là lịch sử tick do broker lấy từ sàn hoặc nhà cung cấp thanh khoản. Generated ticks là chuỗi tester dựng từ dữ liệu bar, thường là M1. MetaTrader 5 có bốn hướng chạy chính:

  • Every tick based on real ticks: dùng real tick history nếu broker có.
  • Every tick: mô phỏng tick từ M1 bars.
  • 1 Minute OHLC: dùng các điểm Open, High, Low, Close của mỗi phút.
  • Open prices only: một tick tại giá mở bar.

Tài liệu MQL5 mô tả real ticks, Every tick từ M1, 1 Minute OHLC và Open prices as các mức chi tiết khác nhau. Open prices chỉ phù hợp với EA được thiết kế để tính ở giá mở/completed bar. MQL5 — Generating ticks in tester

Hình 2 — Mỗi tester mode trả lời một loại câu hỏi khác nhau về hành vi EA.

b. Real mode vẫn có thể chứa fallback

Trong real-tick testing, tester đối chiếu tick với minute bar. Tick vượt High/Low hoặc không khớp Open/Close của phút có thể bị loại; tester dùng generated ticks cho phút đó. Khi minute bar có nhưng thiếu tick data, ticks cũng có thể được sinh theo Every tick. MQL5 — Testing trading strategies

Do đó phần trăm real ticks trong report mô tả nguồn gốc của stream, không phải điểm tổng hợp cho độ đúng chiến lược. 90% REAL phải đi cùng câu hỏi: 10% còn lại nằm ở đâu, có trùng phiên EA hoạt động không, và hành vi EA có phụ thuộc các phút đó không?

c. API trả dữ liệu chưa chắc trả đủ

CopyTicksRange() lấy ticks trong một khoảng millisecond và xếp từ cũ đến mới. Flags phân biệt thay đổi thông tin Bid/Ask với thay đổi giao dịch Last/Volume. Hàm có thể báo timeout và trả phần đang có, hoặc cắt vì buffer nhỏ; consumer phải ghi coverage thực nhận thay vì gọi request “thành công” là đầy đủ. MQL5 — CopyTicksRange

Giống chuyến hàng 10 thùng mới giao 8: đã nhận hàng không đồng nghĩa đã nhận đủ.

3. Demo T19: cùng cửa sổ, ba event stream khác nhau

a. Đóng băng Data Contract

T19 dùng contract T19:DATA:V1: cùng EA build/input, symbol giả, cửa sổ 2026-01-05 00:00–01:00 server time và cùng setting. Chỉ source/model thay đổi. Mọi con số dưới đây là synthetic, không phải thống kê của MT5 hay broker.

Dataset R chạy real-tick mode. Trong 60 minute slots, 54 phút có real ticks và 6 phút dùng generated fallback: 90% REAL, nhãn MIXED.

Dataset G chạy Every tick từ đủ 60/60 M1 bars. Intra-minute path được sinh, nên nhãn GENERATED_M1.

Dataset O chạy Open prices only, có 60 bar-open events. Nó không cung cấp thứ tự event bên trong bar.

b. Kết quả khác không có nghĩa mode nào “sinh lời hơn”

EA giả của T19 quan sát spread và thứ tự trigger bên trong phút. R đếm 12 trigger, G đếm 9, O đếm 5. Đây chỉ là event count để thấy stream không tương đương; không phải trade result hay profit comparison.

  • R: ACCEPT_WITH_LABEL, vì còn 6 fallback minutes cần công bố và kiểm tra segment.
  • G: ACCEPT_WITH_LABEL cho research proxy, không thay validation real-tick.
  • O: REJECT cho EA intrabar vì event order không tồn tại.
  • Không có report/source: RECHECK, không đoán coverage.

Hình 3 — Cùng cửa sổ nhưng nguồn và mode khác nhau tạo event stream không tương đương.

Nếu EA chỉ đọc bar đã đóng, O có thể phù hợp với một câu hỏi research khác. Quyết định trên áp dụng cho dependency intrabar của T19, không phải luật chung rằng Open prices luôn vô dụng.

4. Chín lỗi và Tick Data Contract

a. Chín lỗi thường gặp

  1. Every tick = real ticks: sai nguồn; Every tick thường sinh stream từ M1.
  2. 100% real = live truth: bỏ qua execution, latency và future regime.
  3. Tick count cao = chất lượng cao: count không nói gap nằm ở đâu hay field nào đổi.
  4. Bỏ qua fallback: report mixed bị kể như toàn bộ real.
  5. So hai contract khác nhau: window, timezone, symbol specs hoặc build/input đã đổi.
  6. Bỏ Bid/Ask và session: spread logic được test trên stream không đủ field.
  7. Nhận partial API result như complete: timeout/small buffer không được audit.
  8. Dùng Open prices cho intrabar logic: tester không có event order cần thiết.
  9. Xóa cache đến khi curve đẹp: biến data handling thành lựa chọn kết quả.

Với EA đa symbol, từng instrument tạo tick sequence riêng; bar mới có thể xuất hiện ở các thời điểm khác nhau. Synchronization phải là phần contract chứ không được mặc định. MQL5 — Multicurrency testing

b. Contract cần ghi gì?

Một Tick Data Contract nên chứa:

  • dataset ID/hash, broker/server và symbol;
  • requested window, server timezone và session calendar;
  • tester mode, real/generated coverage và M1 bar coverage;
  • Bid/Ask/Last/volume availability, spread policy;
  • gaps, anomalies, mismatch/fallback segments;
  • EA dependency: bar-open, intrabar, spread, multi-symbol;
  • EA build, input set và environment;
  • decision ACCEPT | ACCEPT_WITH_LABEL | RECHECK | REJECT;
  • report, log hoặc audit artifact làm bằng chứng.

Thiếu origin, window, timezone hoặc report thì RECHECK. Granularity không thể trả lời dependency thì REJECT. ACCEPT_WITH_LABEL không phải “gần đạt”; nó nói run chỉ được sử dụng trong phạm vi và giới hạn đã ghi.

5. Worksheet T19 trong 15 phút

a. Cách làm

Dùng giấy hoặc Google Sheets cùng report/log đã có; chưa cần live account và không dùng tiền thật. Chép bốn hàng dưới, đánh dấu nguồn nào biết chắc, nguồn nào unknown. Không tối ưu tham số trong bài tập này.

b. Mẫu đối chiếu

Dataset Origin/model Coverage Trigger count Fit for intrabar EA Decision
R real ticks + fallback 54/60 real, 6/60 generated 12 usable with disclosed gap audit ACCEPT_WITH_LABEL
G Every tick from M1 60/60 M1 bars, generated path 9 research proxy only ACCEPT_WITH_LABEL
O Open prices only 60 bar-open events 5 event order unavailable REJECT
U report/source missing unknown unknown cannot assess RECHECK

Sau đó trả lời:

  • Sáu fallback minutes của R nằm trong hay ngoài phiên EA hoạt động?
  • G có đủ Bid/Ask/spread cho dependency không?
  • Nếu đổi timezone hoặc date window, contract có còn là V1 không?
  • Có thể lặp run từ cùng dataset/build/input không?

Kết quả mong đợi là bạn giữ được unknown ở U, không điền một phần trăm tưởng tượng.

6. Tổng kết: gắn kết quả với data contract

a. Năm ý chính

  • Data quality là phù hợp với câu hỏi, không chỉ nhiều records.
  • Real ticks, generated M1, OHLC và Open prices tạo event streams khác nhau.
  • Real mode có thể chứa fallback; percentage phải đi cùng segment evidence.
  • So sánh run chỉ có nghĩa khi contract, build/input và window được khóa.
  • Thiếu evidence thì RECHECK; mode không đủ chi tiết thì REJECT.

Bài trước là Adaptive Position Sizing trong EA. Bài tiếp theo là Walk-Forward Analysis cho EA #20.

b. Câu hỏi tự kiểm tra

  • Vì sao 90% REAL chưa đủ kết luận dataset tốt cho T19?
  • Every tick khác real ticks ở nguồn nào?
  • Vì sao Open prices bị reject cho EA intrabar nhưng không phải mọi EA?
  • CopyTicksRange timeout có cho phép gọi coverage là complete không?

c. Gợi ý đáp án

Xem gợi ý câu 1

Cần biết 6 fallback phút ở đâu và EA có phụ thuộc chúng không. → xem mục 2–3.

Xem gợi ý câu 2

Every tick sinh stream từ M1; real ticks đến từ lịch sử tick của broker. → xem mục 2.

Xem gợi ý câu 3

T19 cần event order trong bar; EA chỉ đọc completed bar có dependency khác. → xem mục 1 và 3.

Xem gợi ý câu 4

Không; phải ghi số records/khoảng thực nhận và phần còn thiếu. → xem mục 2.

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 dữ liệu thị trường.
Real tick Tick lịch sử từ broker hoặc nguồn thanh khoản.
Generated tick Tick tester dựng từ bar data.
Coverage Phần requested window có bằng chứng dữ liệu.
Fallback Đoạn thiếu/mismatch được thay bằng generated ticks.
Granularity Độ chi tiết thời gian và sự kiện.
Intrabar Sự kiện xảy ra bên trong một bar.
Data Contract Bộ nguồn, scope và model bị khóa cho run.
Synchronization Mức đồng bộ dữ liệu giữa series/symbols.
RECHECK Chưa đủ evidence để quyết định.

e. Nguồn tham khảo

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. Lịch sử tốt hơn chỉ giảm một nguồn bất định; nó không loại bỏ rủi ro thị trường, execution hoặc thay đổi regime.