Mục lục
Trả lời ngắn: State machine trong EA là cách tổ chức chương trình thành các trạng thái chính và chỉ cho phép chuyển qua những đường đã định nghĩa. Mỗi transition cần event, điều kiện kiểm tra và bằng chứng. Nhờ vậy, EA không tự nhận “đã có position” khi request mới chỉ được gửi.
Đọc xong, bạn sẽ hiểu:
- State machine khác một nhóm cờ Boolean ở đâu.
- State, event, guard, action và transition nối với nhau thế nào.
- Vì sao
REQUEST_PENDINGphải đứng trướcACTIVE.- Cách xử lý event tới muộn, restart và state lệch account.
Lưu ý giáo dục: State machine tổ chức hành vi phần mềm. Nó không tạo lợi thế giao dịch, không bảo đảm lợi nhuận và không thay thế kiểm thử.
1. State machine là gì và giải quyết lỗi nào
a. Một thời điểm, một trạng thái chính
State là trạng thái chính mà EA đang ở, chẳng hạn READY hoặc ACTIVE. Finite state machine, gọi ngắn là state machine, là tập state hữu hạn cùng các đường chuyển hợp lệ giữa chúng.
Hãy nghĩ đến đèn giao thông. Đèn có một màu chính tại một thời điểm và chỉ đổi theo tuyến được thiết kế. Nó không vừa đỏ vừa xanh vì hai biến độc lập tình cờ cùng đúng. Ví dụ này chỉ giải thích tính loại trừ; EA còn phải đối chiếu account và event từ terminal.
Hình 1 — Một state chính cùng các đường chuyển rõ giúp EA tránh những tổ hợp cờ mâu thuẫn.
b. Khi nhiều cờ tạo trạng thái không tồn tại
Boolean flag là biến chỉ có hai giá trị đúng/sai. Một EA có thể dùng orderSent, hasPosition, isClosing và hasError. Bốn cờ tạo nhiều tổ hợp, trong đó có tổ hợp vô nghĩa: chưa gửi request nhưng vừa có position vừa đang đóng.
State machine buộc người thiết kế đặt tên cho trạng thái hợp lệ. Nếu EA ở REQUEST_PENDING, nó chưa được chạy logic dành cho ACTIVE. Nếu event không khớp đường chuyển, hệ thống ghi nhận và đối chiếu thay vì âm thầm bật thêm cờ.
c. Điều state machine không làm
State machine không chứng minh signal đúng, risk phù hợp hay request sẽ khớp. Nó cũng không có nghĩa phải tạo nhiều class. Bảng transition rõ và một owner chuyển state đã đủ cho phiên bản nhỏ.
2. Năm thành phần: state, event, guard, action và transition
a. Công thức đọc một đường chuyển
Event là thông báo vừa tới. Guard là điều kiện phải đúng. Action là việc được phép thực hiện. Transition là lần chuyển từ state hiện tại sang state kế tiếp.
Ta đọc một dòng như sau:
CURRENT STATE + EVENT + GUARD → ACTION + NEXT STATE
Ví dụ: REQUEST_PENDING + TradeTransaction + account xác nhận position → ghi evidence + ACTIVE.
Evidence, hay bằng chứng, là dữ liệu chứng minh đường chuyển hợp lệ: position đọc lại từ account, mã kết quả phù hợp hoặc intent key — mã nhận diện ý định để chống lặp — khớp.
Hình 2 — Event chỉ mở khả năng chuyển; guard và evidence mới quyết định transition có hợp lệ hay không.
b. Event giống nhau, kết quả khác nhau
NewTick ở READY có thể mở bước kiểm tra snapshot — gói dữ liệu chụp cùng thời điểm. NewTick ở REQUEST_PENDING không được tạo thêm request cho cùng intent. TradeTransaction ở REQUEST_PENDING có thể kích hoạt đối chiếu; cùng event ở READY cần được xem là bất thường.
Vì vậy, event không tự sở hữu next state. Current state, guard và nguồn sự thật cùng quyết định.
c. Một owner cho side effect
Side effect là hành động làm thay đổi bên ngoài phép tính thuần, như gửi request hoặc ghi state bền vững. Chỉ một khối nên sở hữu quyền chuyển state và phát side effect giao dịch.
Action lúc vào hoặc rời state nên ngắn. Nếu transition vừa đổi state, tính signal mới, sửa risk và gửi thêm request, ranh giới lại trở nên khó kiểm.
3. EA Mây X đi qua một vòng đời
a. Sáu state và một nhánh dừng
READY: chờ snapshot hợp lệ.SETUP_FOUND: signal, filter và risk đã qua; intent key đã tạo.REQUEST_PENDING: request demo đã gửi, chưa tự nhận có position.ACTIVE: account mới đọc xác nhận position thuộc phạm vi EA.EXIT_PENDING: intent thoát đã gửi, đang chờ xác nhận.HALTED: state phần mềm dừng tạo hành động mới vì mismatch, timeout hoặc dữ liệu lỗi.
HALTED không đồng nghĩa tự đóng mọi position. Việc xử lý position thật cần chính sách khẩn cấp riêng.
b. Transition table mẫu
| Current | Event | Guard/evidence | Action | Next |
|---|---|---|---|---|
| READY | New bar | Snapshot hợp lệ, các bước kiểm tra qua | Tạo một intent key | SETUP_FOUND |
| SETUP_FOUND | Phát lệnh nội bộ | Key mới, quyền hợp lệ | Gửi request demo | REQUEST_PENDING |
| REQUEST_PENDING | TradeTransaction | Đọc lại account thấy position | Lưu evidence/log | ACTIVE |
| REQUEST_PENDING | Timeout | Chưa đối chiếu được | Dừng hành động mới | HALTED |
| ACTIVE | Exit intent | Quy tắc thoát hợp lệ | Gửi request thoát demo | EXIT_PENDING |
| EXIT_PENDING | TradeTransaction | Account không còn position thuộc phạm vi EA | Xóa intent | READY |
Câu đoán chắc là: “request được nhận thì EA đã ACTIVE”. Câu có điều kiện là: “EA chỉ chuyển ACTIVE khi event phù hợp đến và lần đọc lại account xác nhận position”. Câu đầu sai nếu request bị từ chối, chưa khớp hoặc state không đối chiếu được.
c. Illegal transition
Illegal transition là đường chuyển không được cho phép. Nếu EA đang READY nhưng nhận dữ kiện về một position chưa biết, nhảy thẳng sang ACTIVE có thể che lỗi restart hoặc giao dịch thủ công.
Phản ứng an toàn là ghi bối cảnh, đọc lại account, xác định quyền quản lý rồi chọn state theo quy tắc khôi phục. Không nên bỏ qua event hoặc đoán.
4. Event tới sai thứ tự, restart và state drift
a. Không dựa vào thứ tự transaction tưởng tượng
Một trade request có thể tạo nhiều TradeTransaction; thứ tự chúng tới terminal không được bảo đảm. MetaQuotes cũng cảnh báo không được coi “một request bằng một Trade event”. OnTradeTransaction
Do đó state machine không nên viết tuyến cứng “ORDER_ADD luôn tới trước DEAL_ADD”. Nó dùng transaction type làm dấu vết, rồi đọc lại order, deal hoặc position cần thiết trước transition.
b. Restart làm mất trí nhớ cục bộ
Sau restart, biến trong bộ nhớ tạm (RAM) về giá trị khởi tạo, nhưng account có thể còn order hoặc position. Persistence là lưu một phần dữ liệu qua restart. Reconciliation, hay đối chiếu, là so state cục bộ với account và lịch sử để dựng lại trạng thái có bằng chứng.
Ví dụ, EA mở lên với READY nhưng account có position mang magic ID — mã nhận diện EA — và mã giao dịch thuộc phạm vi quản lý. Nó không nên tìm signal mới; phải đối chiếu rồi chuyển theo quy tắc khôi phục.
c. Timeout không chứng minh request thất bại
Timeout là hết thời gian chờ quy định. Nó là trigger để đối chiếu hoặc sang HALTED, không phải bằng chứng chắc rằng trade server chưa xử lý request.
State drift là khi state cục bộ khác nguồn sự thật. Dấu hiệu gồm ACTIVE nhưng không thấy position, READY nhưng position tồn tại, hoặc intent chờ quá lâu. Khi chưa giải thích được, fail-closed nghĩa là dừng hành động mới.
5. Checklist và State Transition Card 15 phút
a. Tám câu kiểm tra
- Danh sách state có loại trừ nhau không?
- Ai là owner duy nhất được chuyển state?
- Mỗi transition bắt đầu từ event nào?
- Guard và evidence là gì?
- Action nào được phép chạy đúng một lần?
- Event trùng hoặc tới muộn xử lý ra sao?
- Timeout dẫn tới reconcile hay
HALTED? - Restart dựng state từ nguồn nào?
Hình 3 — Transition Card buộc mỗi đường chuyển có điều kiện, bằng chứng, next state 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 trong 10–15 phút. Chép sáu dòng transition table ở mục 3, rồi thử ba tình huống: event bị lặp, confirmation tới muộn, và restart khi account vẫn có position.
Không cần compile, bật AutoTrading hay gửi request. Mục tiêu là tìm đường chuyển thiếu trên giấy.
c. Mẫu đối chiếu đã điền
| Tình huống | Current | Evidence cần | Kết quả an toàn |
|---|---|---|---|
| New bar lặp | REQUEST_PENDING | Intent key cũ | Không gửi thêm |
| Confirmation tới muộn | HALTED | Đọc lại account + quyền quản lý | Đối chiếu trước transition |
| Restart có position | READY mặc định | Position/account snapshot | Dựng lại state, không tìm setup mới |
6. Tổng kết: state rõ, transition có bằng chứng
a. Năm ý chính
- State machine giữ một trạng thái chính tại một thời điểm.
- Transition cần current state, event, guard, action và next state.
- Request đã gửi chưa đủ để chuyển
ACTIVE. - Event tới muộn, timeout và restart đều cần đối chiếu.
HALTEDdừng action mới; không mặc định là đóng mọi position.
Bài trước giải thích Tick, Candle và Event trong MT5. Bài tiếp theo là Quản lý Position trong EA #4.
b. Câu hỏi tự kiểm tra
- State machine khác nhóm Boolean flag ở đâu?
- Guard và evidence giữ vai trò gì?
- Vì sao timeout không chứng minh request thất bại?
- Restart có position thì EA nên làm gì trước?
c. Gợi ý đáp án
Xem gợi ý câu 1
Nó giới hạn state và transition hợp lệ thay vì cho mọi tổ hợp cờ tồn tại. Xem lại mục 1.
Xem gợi ý câu 2
Guard cho phép đường chuyển; evidence chứng minh dữ kiện đủ để đổi state. Xem lại mục 2.
Xem gợi ý câu 3
Server có thể đã xử lý nhưng confirmation chưa được đối chiếu; timeout chỉ mở recovery. Xem lại mục 4.
Xem gợi ý câu 4
Đọc account, xác định quyền quản lý và đối chiếu trước khi tạo action mới. Xem lại mục 4.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| State | Trạng thái chính hiện tại |
| Transition | Lần chuyển giữa hai state hợp lệ |
| Event | Thông báo mở một lượt xử lý |
| Guard | Điều kiện cho phép transition |
| Evidence | Dữ liệu chứng minh transition hợp lệ |
| Reconciliation | Đối chiếu state với nguồn sự thật |
| Timeout | Hết thời gian chờ quy định |
| State drift | State cục bộ lệch nguồn sự thật |
e. Nguồn tham khảo
- MetaQuotes — Event Handling
- MetaQuotes — OnTradeTransaction
- MetaQuotes — MqlTradeTransaction
- MQL5 — Designing a Strategy State Machine
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. EA và 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