Mục lục
Trả lời ngắn: Session Engine trong EA là bộ nhận thời gian máy chủ, lịch phiên giao dịch của từng mã và cửa sổ do chiến lược đặt, rồi biên dịch thành các khoảng được phép. Nó trả
PASS,BLOCKhoặcUNKNOWNkèm bằng chứng; nó không tạo tín hiệu hay tự gửi giao dịch.
Đọc xong, bạn sẽ hiểu:
- Vì sao giờ máy cá nhân không thể thay lịch phiên của máy chủ.
- Cách giữ nhiều phiên và khoảng nghỉ trong cùng một ngày.
- Khác biệt giữa phiên báo giá, phiên giao dịch và cửa sổ của chiến lược.
- Cách trả
UNKNOWNkhi clock hoặc lịch chưa đủ bằng chứng.
Lưu ý giáo dục: Mọi giờ và khoảng đệm trong bài là dữ liệu demo để học thiết kế phần mềm. Chúng không phải lịch của nhà môi giới, thời điểm nên giao dịch hay cam kết giảm rủi ro.
1. Session Engine là bộ biên dịch lịch, không phải StartHour
a. Năm đầu vào và một quyết định
Một mã sản phẩm (symbol) có thể có lịch riêng theo từng ngày. Session Engine nhận:
- ảnh chụp thời gian (clock snapshot) gồm giờ, nguồn lấy giờ và độ mới;
- phiên giao dịch (trade session) của symbol;
- cửa sổ người dùng (user window) do chiến lược đặt;
- khoảng đệm (buffer) sau lúc mở và trước lúc đóng;
- phiên bản bộ quy tắc.
Engine trả quyết định phiên cùng mã lý do, bằng chứng, khoảng hiện tại và mốc chuyển trạng thái tiếp theo:
PASS: thời gian nằm trong cửa sổ cuối và mọi dữ liệu cần thiết đã sẵn sàng;BLOCK: lịch đã rõ nhưng thời gian nằm ngoài;UNKNOWN: clock hoặc lịch thiếu, cũ, chưa đồng bộ hay chưa đủ để kết luận.
b. Ranh giới công việc
Session Engine không phát hiện crossover, không đọc lịch tin, không đo biến động, không tính rủi ro và không gửi yêu cầu giao dịch. PASS chỉ nghĩa ứng viên hành động (candidate) qua cổng phiên. Bộ lọc (Filter), rủi ro (Risk) và thực thi (Execution) vẫn còn quyền từ chối.
Như thư viện nghỉ trưa, một khoảng 08:00–17:00 sẽ nuốt giờ nghỉ. Đồng hồ điện thoại cũng không thay bảng giờ chính thức.
2. Bốn nguồn dữ liệu phải đứng riêng
a. Clock snapshot: giờ nào và mới tới đâu
Giờ máy chủ (server time) là cơ sở của lịch demo này. Giờ máy cá nhân (local time) chỉ phản ánh máy đang chạy terminal, không tự trở thành giờ phiên.
TimeCurrent() trả thời gian máy chủ cuối cùng đã biết. Trong OnTick, đó là thời gian cập nhật giá (tick) đang xử lý; ở hàm xử lý sự kiện (handler) khác, nó là thời gian báo giá (quote) cuối của một symbol trong cửa sổ Market Watch. Giá trị này do máy chủ giao dịch tạo và không phụ thuộc cài đặt giờ trên máy. TimeCurrent
TimeTradeServer() trả giờ máy chủ ước tính do terminal tính và phụ thuộc cài đặt thời gian máy tính; trong Strategy Tester, nó bằng TimeCurrent(). Bộ chuyển đổi clock (Clock Adapter) phải chọn nguồn rồi log source, sampledAt và độ mới. TimeTradeServer
b. Trade session khác quote session
SymbolInfoSessionTrade() lấy giờ bắt đầu/kết thúc phiên giao dịch theo symbol, thứ trong tuần và chỉ số phiên (session index). Index bắt đầu từ 0; from/to là số giây tính từ 00:00, còn phần ngày trong giá trị trả về phải bỏ qua. Hàm trả true khi lấy được dữ liệu và false nếu không. SymbolInfoSessionTrade
SymbolInfoSessionQuote() có quy ước gọi hàm tương tự nhưng trả phiên báo giá (quote session). Có quote không tự chứng minh đang được phép giao dịch. Decision dùng trade sessions; quote sessions chỉ là bằng chứng khác nếu policy thật sự cần. SymbolInfoSessionQuote
c. User window và buffers không sửa lịch broker
User window là cửa sổ hẹp hơn do chiến lược (strategy) đặt. Khoảng chờ sau mở (open delay) và khoảng tránh sát giờ đóng (close guard) cắt nhỏ trade session, không tạo thêm giờ mà nhà môi giới (broker) không công bố.
Mọi giá trị 5 phút, 10 phút trong bài là demo. Không có một buffer đúng cho mọi symbol hay hệ thống.
3. Tám bước biên dịch thành cửa sổ cuối
a. Từ clock đến danh sách khoảng
- Kiểm symbol, phiên bản policy và độ sẵn sàng của clock.
- Dùng
TimeToStruct()đổi thời gian sangMqlDateTime. - Đọc
day_of_week, giờ, phút và giây. - Duyệt
session_indextừ0, ghi từng khoảng trade lấy được.
MqlDateTime.day_of_week dùng 0 cho Sunday đến 6 cho Saturday. TimeToStruct() trả false nếu chuyển đổi lỗi; lỗi này phải thành UNKNOWN, không phải “ngoài phiên”. MqlDateTime, TimeToStruct
b. Từ interval thô đến compiled window
- Chuẩn hóa (normalize) từng khoảng theo quy tắc đã kiểm thử.
- Lấy phần giao nhau (intersection) giữa trade session và user window.
- Áp open delay/close guard riêng cho từng interval.
- So giờ máy chủ hiện tại (
serverNow) với danh sách cuối rồi tính mốc chuyển tiếp (next transition).
Quy tắc đầu/cuối khoảng, phiên qua nửa đêm hoặc to=00:00 phải có bộ dữ liệu kiểm thử cố định (test fixture) theo quy ước thực tế. Không đoán một quy tắc rồi áp cho mọi broker.
Cửa sổ đã biên dịch (compiled window) là khoảng cuối sau khi lấy phần giao nhau và áp buffers.
Nếu giao diện dữ liệu (API) trả false, điều chắc chắn chỉ là lời gọi đó không cung cấp session được yêu cầu. Adapter phải quyết định snapshot đã hoàn tất hay gặp lỗi. Khi chưa chứng minh được trạng thái sẵn sàng (readiness), kết quả là UNKNOWN, không tự biến thành BLOCK.
Hình 1 — Session Engine chỉ quyết định sau khi clock, lịch giao dịch và policy cùng đủ bằng chứng.
4. Demo hai phiên: đừng nuốt mất giờ nghỉ
a. Dữ liệu đầu vào
Toàn bộ giờ dưới đây là demo theo server time:
- trade session
S0:09:00–11:30; - trade session
S1:13:00–17:00; - user window:
09:10–16:50; - open delay:
5 phút; - close guard:
10 phút.
Sau khi áp buffers và lấy intersection:
W0 = 09:10–11:20;W1 = 13:05–16:50.
Khoảng 11:20–13:05 vẫn phải được giữ. Nối hai window thành 09:10–16:50 sẽ cho PASS trong lúc lịch gốc đang nghỉ.
Hình 2 — Hai phiên sau khi cắt cửa sổ và đệm vẫn phải giữ nguyên khoảng nghỉ 11:20–13:05.
b. Bốn phiếu quyết định phiên
| Tình huống | Bằng chứng demo | Quyết định | Lý do | Mốc tiếp |
|---|---|---|---|---|
| A | 11:45, W0 đã đóng, W1 ở sau |
BLOCK | SESSION_BREAK |
13:05 |
| B | 13:02 < 13:05 |
BLOCK | OPEN_DELAY |
13:05 |
| C | 13:10 ∈ 13:05–16:50 |
PASS | IN_COMPILED_WINDOW |
16:50 |
| D | session API false, snapshot chưa sẵn sàng |
UNKNOWN | SESSION_DATA_UNAVAILABLE |
RELOAD |
Tình huống A và B đều BLOCK nhưng lý do khác nhau. Tình huống D không đủ bằng chứng để nói mở hay đóng. Mã lý do và mốc tiếp giúp hệ thống biết chờ hoặc tải lại dữ liệu.
Hình 3 — Cùng một lịch demo, evidence khác nhau tạo BLOCK, PASS hoặc UNKNOWN với mốc chuyển tiếp rõ.
5. Bảy lỗi và giới hạn cần nhớ
- Dùng TimeLocal làm nguồn thật: máy cá nhân có thể khác giờ phiên.
- Một StartHour cho mọi symbol: lịch có thể khác theo mã và ngày.
- Quote session thay trade session: có báo giá chưa chắc được giao dịch.
- Chỉ đọc index 0: bỏ mất phiên thứ hai và mốc chuyển tiếp.
- Gộp giờ nghỉ: biến khoảng đóng đã biết thành PASS.
falsethành đóng (closed): lỗi hoặc snapshot chưa sẵn sàng phải giữUNKNOWN.- Kiểm thử quá khứ giống vận hành thật: tester làm local, server và GMT time bằng nhau; điều đó không chứng minh múi giờ khi chạy thật tự đúng. Testing Trading Strategies
Giới hạn: Session Engine chỉ kiểm lịch và clock. Nó không biết chất lượng thị trường, tin tức (news), biến động (volatility), quyền tài khoản hay khả năng thực thi. Lịch ngày lễ hoặc lịch thay thế đặc biệt (override) cũng không được đoán nếu adapter không có nguồn; thiếu bằng chứng thì UNKNOWN.
6. Checklist và Session Worksheet 15 phút
a. Mười hai câu kiểm
- Symbol nào đang được xét?
- Clock lấy từ nguồn nào?
- Clock sampled lúc nào và còn fresh không?
- Policy version là gì?
- Day-of-week đã đổi đúng chưa?
- Có bao nhiêu trade session?
- Đã đọc đủ index
0, 1, ...chưa? from/tođang được hiểu theo seconds-from-midnight chưa?- User window là gì?
- Buffer áp riêng từng interval chưa?
- Compiled windows có giữ break không?
- Decision có reason, evidence và next transition không?
Điểm dừng: thiếu clock source/freshness hoặc session snapshot readiness thì trả UNKNOWN. Không tự đổi sang giờ local và không lấy lịch cũ cho qua.
b. Bài tập miễn phí
Dùng giấy hoặc Google Sheets trong 10–15 phút. Chép hai session demo, cắt user window, áp buffers rồi kiểm bốn case. Không mở MT5, không kết nối tài khoản và không dùng tiền thật.
c. Mẫu đối chiếu
| Tình huống | Thời điểm | Bằng chứng cửa sổ | Kết quả mẫu |
|---|---|---|---|
| A | 11:45 |
giữa W0 và W1 | BLOCK / SESSION_BREAK / 13:05 |
| B | 13:02 |
trước W1 3 phút | BLOCK / OPEN_DELAY / 13:05 |
| C | 13:10 |
nằm trong W1 | PASS / IN_COMPILED_WINDOW / 16:50 |
| D | không chắc | snapshot chưa ready | UNKNOWN / SESSION_DATA_UNAVAILABLE / RELOAD |
Sản phẩm bài tập cần giữ là timeline và bảng quyết định, không phải cấu hình giao dịch.
7. Tổng kết: dùng đúng giờ, giữ đúng khoảng nghỉ
a. Năm ý chính
- Session Engine biên dịch clock, trade sessions, user window và buffers.
- Server time, local time,
TimeCurrentvàTimeTradeServerkhông phải một thứ. - Quote session không thay được trade session.
- Nhiều session phải giữ từng interval và khoảng nghỉ.
PASSchỉ qua cổng phiên; dữ liệu thiếu phải thànhUNKNOWN.
Bài trước là Risk Engine trong EA. Bài tiếp theo là News Filter trong EA #11.
b. Câu hỏi tự kiểm tra
- Vì sao không nên dùng
TimeLocallàm giờ phiên mặc định? session_index=0có đủ cho mọi ngày không?falsetừSymbolInfoSessionTrade()nên thành trạng thái nào?- Vì sao
11:45trong demo là BLOCK?
c. Gợi ý đáp án
Xem gợi ý câu 1
Giờ máy cá nhân không tự khớp giờ máy chủ và lịch của symbol. → xem mục 2.
Xem gợi ý câu 2
Không; một ngày có thể có nhiều session, nên phải xử lý danh sách index. → xem mục 3.
Xem gợi ý câu 3
Nếu snapshot chưa được chứng minh sẵn sàng, phải trả UNKNOWN thay vì tự kết luận closed. → xem mục 3.
Xem gợi ý câu 4
`11:45` nằm trong break giữa W0 đóng lúc `11:20` và W1 mở lúc `13:05`. → xem mục 4.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Session Engine | Bộ biên dịch lịch phiên thành quyết định có bằng chứng. |
| Clock snapshot | Ảnh chụp giờ, nguồn và độ mới. |
| Trade session | Khoảng broker công bố cho hoạt động giao dịch. |
| Quote session | Khoảng broker phát báo giá. |
| User window | Cửa sổ hẹp hơn do policy đặt. |
| Buffer | Khoảng đệm sau mở hoặc trước đóng. |
| Compiled window | Khoảng cuối sau intersection và buffers. |
| Next transition | Mốc thời gian đổi trạng thái tiếp theo. |
| UNKNOWN | Chưa đủ dữ liệu để kết luận trong hay ngoài phiên. |
e. Nguồn tham khảo
- MQL5 SymbolInfoSessionTrade
- MQL5 SymbolInfoSessionQuote
- MQL5 TimeCurrent
- MQL5 TimeTradeServer
- MQL5 MqlDateTime
- MQL5 TimeToStruct
- MQL5 Strategy Tester time simulation
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. Session gate không thể loại bỏ rủi ro thị trường, dữ liệu hoặc thực thi.
Bài tiếp theo