Mục lục
Trả lời ngắn: Quản lý order trong EA là theo dõi một yêu cầu giao dịch từ lúc hình thành ý định, kiểm tra trước gửi, nhận ticket, đọc trạng thái, đối chiếu sự kiện đến khi kết thúc. Quy trình này giúp EA không coi
truelà đã khớp, không gửi trùng sau timeout và không sửa order ngoài phạm vi.
Đọc xong, bạn sẽ hiểu:
- Order khác deal và position ở điểm nào.
- Vì sao phải đọc
ORDER_STATEcùng khối lượng còn lại.- Cách nối danh sách order hiện hành với order lịch sử.
- Cách lập Order Ledger trước khi viết logic giao dịch.
Lưu ý giáo dục: Bài này chỉ mô tả kiểm soát phần mềm, không đưa hướng giao dịch, mức giá hoặc khối lượng khuyến nghị. Order được quản lý đúng vẫn có rủi ro kỹ thuật, trượt giá và mất vốn.
1. Order là yêu cầu có vòng đời, không phải position
a. Ba bản ghi, ba vai trò
Order là yêu cầu thực hiện một hoạt động giao dịch. Deal là một lần khớp thực tế. Position là trạng thái nắm giữ đang mở sau tác động của một hay nhiều deal. Đây là ba lớp dữ liệu khác nhau.
Hãy nghĩ đến phiếu gửi bưu kiện. Tạo phiếu giống tạo order; xử lý một chặng giống một lần khớp; vị trí món hàng là dữ kiện tổng hợp. So sánh này không mô phỏng đầy đủ máy chủ giao dịch.
MetaQuotes định nghĩa order là cách chính thức hóa yêu cầu thực hiện hoạt động giao dịch. Order Properties Một order được chấp nhận chưa chứng minh deal đã xuất hiện hay position đã thay đổi.
b. Order hiện hành và order lịch sử
Order hiện hành là order còn trong danh sách đang chờ xử lý, chẳng hạn trạng thái PLACED hoặc PARTIAL. Order lịch sử là bản ghi order đã rời danh sách hiện hành vì được khớp, hủy, từ chối hoặc hết hạn.
Do đó OrdersTotal() == 0 chỉ nói danh sách hiện hành đang trống. Nó không nói “EA chưa từng gửi order” và cũng không chứng minh yêu cầu trước thất bại. Muốn biết kết cục, EA phải đối chiếu lịch sử và các deal liên quan.
c. Snapshot tối thiểu của một order
Snapshot, hay bản chụp trạng thái, là nhóm thuộc tính được đọc trong cùng lượt xử lý:
- ticket, symbol, loại order và trạng thái;
- magic ID và nguồn tạo order;
- khối lượng ban đầu, khối lượng còn lại;
- giá yêu cầu, SL, TP và giá stop-limit nếu có;
- thời gian tạo, thời gian hoàn tất và thời điểm hết hạn.
Ticket nhận diện order cụ thể. Magic ID hỗ trợ xác định phạm vi quản lý. Comment chỉ là dữ kiện phụ, không nên làm khóa sở hữu duy nhất.
2. Đọc trạng thái thay vì đoán từ một lần gọi hàm
a. Các trạng thái quan trọng
Order state, hay trạng thái order, mô tả order đang ở đâu trong vòng đời. ORDER_STATE_REQUEST_ADD nghĩa là đang đăng ký; ORDER_STATE_PLACED là đã được chấp nhận; ORDER_STATE_PARTIAL là khớp một phần; ORDER_STATE_FILLED là đã khớp đủ. Các nhánh kết thúc khác gồm CANCELED, REJECTED và EXPIRED. Order Properties
Loại order không phải trạng thái order. Loại trả lời yêu cầu mang hình thức nào; trạng thái trả lời nó đang ở giai đoạn nào. Chính sách khớp và thời hạn là thuộc tính riêng.
Hình 1 — Ticket nhận diện order; trạng thái và khối lượng còn lại cho biết nó đang ở giai đoạn nào.
b. true không có nghĩa đã khớp
OrderSend() trả true khi yêu cầu vượt kiểm tra cơ bản và được chấp nhận để xử lý; đó không phải bằng chứng giao dịch đã hoàn tất. MetaQuotes yêu cầu kiểm tra mã phản hồi retcode; sự kiện thực thi có thể đến sau phản hồi ban đầu. OrderSend
Câu “true nghĩa là FILLED” là sai. Chỉ ghi FILLED khi trạng thái, lịch sử và deal phù hợp xác nhận. Nếu mã phản hồi chỉ nói order đã được đặt, ledger giữ PLACED.
c. Khớp một phần không phải đã xong
ORDER_VOLUME_INITIAL là khối lượng ban đầu. ORDER_VOLUME_CURRENT là khối lượng còn lại. Ví dụ giả lập: ban đầu 10, còn lại 4; chênh lệch 6 đã được xử lý, nhưng order chưa kết thúc.
Nó giống phiếu xuất kho 10 món còn 4 món chờ. Thực thi thật còn phụ thuộc loại order, chính sách khớp và máy chủ. EA không xóa ý định chỉ vì thấy deal đầu tiên.
3. Vòng quản lý sáu bước cho Order Ledger
a. Intent: tạo ý định có mã chống trùng
Intent key, hay mã ý định, nhận diện một mục đích duy nhất của EA. Nó gắn với phạm vi chiến lược, symbol, thời điểm tín hiệu và phiên xử lý. Nếu cùng mã đang chờ, EA không phát thêm yêu cầu.
Ý định giữ bộ thuộc tính mong muốn nhưng chưa phải order thật. Nó chỉ chuyển sang bước gửi khi kiểm tra trước đạt.
b. Preflight: kiểm tra trước gửi
Preflight là kiểm tra trước khi tạo hành động bên ngoài. Nó gồm quyền giao dịch, trạng thái symbol, tham số hợp lệ, chính sách khớp/thời hạn và giới hạn nội bộ. Duplicate guard, hay chốt chống trùng, chặn một ý định bị gửi hai lần.
OrderCheck() hỗ trợ kiểm tra yêu cầu trước OrderSend() và trả mã lỗi, ký quỹ dự kiến cùng số dư sau thao tác. Kiểm tra thành công vẫn không bảo đảm hoạt động cuối cùng sẽ được thực hiện. OrderCheck
c. Gửi và theo dõi bằng ticket
Sau khi gửi, EA lưu mã ý định, ticket, mã phản hồi và thời gian. Track, hay theo dõi, là lấy danh sách hiện hành rồi select — chọn và nạp — đúng ticket trước khi đọc.
OrderGetTicket(index) tự chọn order và sao chép dữ liệu vào môi trường chương trình. Bản sao vẫn có thể đọc được dù order đã biến mất hoặc thuộc tính đã đổi, nên tài liệu khuyên gọi lại ngay trước lúc dùng. OrderGetTicket
EA Mây X lọc symbol, magic ID và phiên chiến lược. Ticket ngoài phạm vi được gắn FOREIGN rồi bỏ qua; ticket 0 hoặc select thất bại không được đổi thành order giả.
d. Reconcile và archive: đối chiếu rồi chốt sổ
Reconcile, hay đối chiếu, là ghép mã phản hồi, sự kiện, danh sách hiện hành, lịch sử và deal để xác định trạng thái thật. OnTradeTransaction có thể được gọi nhiều lần cho một yêu cầu; thứ tự các biến đổi giao dịch đến phần mềm đầu cuối không được bảo đảm. OnTradeTransaction
Archive, hay chốt sổ, là lưu trạng thái kết thúc, lý do, thời gian và bằng chứng rồi đóng ý định. Nó chỉ xảy ra với FILLED, CANCELED, REJECTED hoặc EXPIRED; không chỉ vì timeout.
Hình 2 — Bộ quản lý theo dõi từ ý định đến trạng thái kết thúc; timeout chỉ mở đối chiếu.
4. Sáu lỗi làm order bị lặp hoặc mất dấu
a. Coi true là FILLED
Đây là lỗi rút ngắn vòng đời. true và mã phản hồi ban đầu chỉ nói về xử lý yêu cầu, không thay thế trạng thái, lịch sử hoặc deal.
b. Gửi lại ngay khi timeout
Timeout là hết thời gian chờ, không chứng minh máy chủ chưa nhận yêu cầu. Nếu tự gửi lại, một ý định có thể tạo hai order. EA phải dừng hành động mới cho mã đó và đối chiếu.
c. Chỉ tìm trong danh sách hiện hành
Order 92003 không còn hiện hành có thể đã chuyển FILLED, CANCELED hoặc EXPIRED. MISSING nghĩa là chưa tìm thấy ở nguồn vừa đọc; nó không phải trạng thái kết thúc.
d. Tin snapshot cũ
Sau sửa, xóa hoặc khớp một phần, bản sao cũ có thể sai. EA select lại trước quyết định; nếu order rời danh sách hiện hành, nó tìm trong lịch sử.
e. Nhầm khối lượng ban đầu với còn lại
Ở PARTIAL, khối lượng còn lại mới cho biết phần chưa xử lý. Dùng khối lượng ban đầu có thể làm ledger và phép tính rủi ro sai.
f. Sửa hoặc xóa order ngoài phạm vi
OrderModify() và OrderDelete() phải dùng ticket đã xác minh quyền quản lý. Hàm trả thành công chưa chắc thao tác giao dịch đã thực hiện; cần kiểm tra ResultRetcode() và đọc lại trạng thái. OrderModify, OrderDelete
Khi dữ liệu không khớp, trạng thái dừng chỉ chặn hành động mới trong phạm vi bị ảnh hưởng. Nó không mặc định đóng position hay xóa mọi order.
5. Checklist và bài tập Order Ledger 15 phút
a. Mười câu trước khi vận hành
- Mã ý định được tạo từ những trường nào?
- Phạm vi gồm tài khoản, symbol, magic và phiên chiến lược nào?
- Chốt chống trùng chặn mã đang chờ ra sao?
- Preflight đã kiểm yêu cầu và chính sách chưa?
- Ticket/mã phản hồi nào nối với ý định?
- Order vừa được select lại hay đang dùng snapshot cũ?
ORDER_STATEhiện tại là gì?- Khối lượng ban đầu/còn lại có khớp
PARTIALkhông? - Danh sách hiện hành, lịch sử và deal cung cấp bằng chứng nào?
MISSINGhoặc timeout dẫn tới đối chiếu hay dừng?
Hình 3 — Ledger giữ riêng phạm vi, vị trí bản ghi, trạng thái, hành động kế tiếp và bằng chứng.
b. Bài tập miễn phí, không gửi order
Dùng giấy hoặc Google Sheets trong 10–15 phút. Chép bảng dưới, che hai cột cuối rồi điền lại. Tất cả ticket và volume là dữ liệu giả lập; không mở MetaTrader, không bật AutoTrading.
c. Mẫu đối chiếu tham khảo
| Ticket | Phạm vi | Snapshot hiện hành | Lịch sử | Trạng thái | Hành động | Bằng chứng |
|---|---|---|---|---|---|---|
| 92001 | OWNED | FRESH | — | PLACED | KEEP | Ticket + trạng thái khớp |
| 92002 | OWNED | FRESH | — | PARTIAL | RECONCILE | Khối lượng ban đầu/còn lại |
| 92003 | OWNED | MISSING | FOUND | FILLED | ARCHIVE | History + deal link |
| 92004 | FOREIGN | FRESH | — | PLACED | SKIP | Magic ngoài phạm vi |
Sản phẩm cần có là bốn quyết định cùng lý do và bằng chứng. Giải thích vì sao 92003 MISSING không được tự gửi lại. Bài tập kiểm cách hiểu, không chứng minh EA an toàn.
6. Tổng kết: theo dõi order đến khi có bằng chứng kết thúc
a. Năm ý chính
- Order là yêu cầu có vòng đời, không phải deal hoặc position.
- Trạng thái, khối lượng ban đầu và còn lại phải được đọc cùng nhau.
truetừ hàm gửi, sửa hoặc xóa chưa chứng minh thao tác đã hoàn tất.- Order biến mất khỏi danh sách hiện hành cần được tìm trong lịch sử và deal.
- Mã ý định cùng chốt chống trùng ngăn gửi lại khi timeout chưa rõ kết quả.
Bài trước là Quản lý Position trong EA. Bài tiếp theo sẽ mở rộng sang Money Management Engine trong EA #6.
b. Câu hỏi tự kiểm tra
- Order, deal và position khác nhau thế nào?
- Vì sao
OrderSend() == truechưa phảiFILLED? - Khối lượng ban đầu và còn lại nói điều gì ở
PARTIAL? MISSINGsau timeout cần dẫn tới bước nào?
c. Gợi ý đáp án
Xem gợi ý câu 1
Order là yêu cầu, deal là lần khớp, position là trạng thái nắm giữ. Xem lại mục 1.
Xem gợi ý câu 2
`true` chỉ xác nhận bước kiểm tra/chấp nhận xử lý; cần mã phản hồi, trạng thái và lịch sử. Xem lại mục 2.
Xem gợi ý câu 3
Giá trị ban đầu là tổng lượng, giá trị hiện tại là phần còn chờ. Xem lại mục 2.
Xem gợi ý câu 4
Đối chiếu danh sách hiện hành, lịch sử, deal và mã phản hồi trước hành động mới. Xem lại mục 4.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Order | Yêu cầu thực hiện hoạt động giao dịch |
| Order state | Giai đoạn hiện tại trong vòng đời order |
| Intent key | Mã nhận diện một ý định duy nhất |
| Preflight | Kiểm tra trước khi gửi yêu cầu |
| Partial fill | Order mới khớp một phần |
| Current volume | Khối lượng còn chờ xử lý |
| Reconcile | Đối chiếu nhiều nguồn để tìm trạng thái thật |
| Archive | Chốt sổ ý định khi có bằng chứng kết thúc |
| Duplicate guard | Điều kiện chặn gửi trùng ý định |
e. Nguồn tham khảo
- MetaQuotes — Order Properties
- MetaQuotes — OrderGetTicket
- MetaQuotes — OrderSelect
- MetaQuotes — OrderCheck
- MetaQuotes — OrderSend
- MetaQuotes — OrderModify
- MetaQuotes — OrderDelete
- MetaQuotes — OnTradeTransaction
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