Mục lục
Trả lời ngắn: Quản lý position trong EA là quy trình tìm vị thế mở thuộc phạm vi của EA, nạp dữ liệu mới, quyết định hành động, gửi yêu cầu bằng ticket rồi xác minh lại tài khoản. Nó ngăn EA sửa nhầm vị thế, dùng dữ liệu cũ hoặc coi yêu cầu vừa gửi là kết quả đã hoàn tất.
Đọc xong, bạn sẽ hiểu:
- Position khác order và deal ở điểm nào.
- Netting và hedging làm thay đổi cách nhận diện position ra sao.
- Vì sao ticket, identifier và magic ID không thể dùng thay nhau.
- Cách lập Position Control Card trước khi viết logic thật.
Lưu ý giáo dục: Bài này nói về kiểm soát phần mềm, không đưa tín hiệu giao dịch. Quản lý position đúng không loại bỏ rủi ro kỹ thuật, rủi ro thị trường hoặc mất vốn.
1. Position là gì, khác order và deal ra sao
a. Ba lớp dễ bị gọi chung là “lệnh”
Trong giao diện, người mới thường gọi mọi dòng là “lệnh”. Khi viết EA, ba khái niệm cần tách rõ:
- Order là yêu cầu giao dịch được gửi hoặc đang chờ thực hiện.
- Deal là một lần khớp thực tế làm thay đổi tài khoản.
- Position là trạng thái nắm giữ đang mở sau tác động của một hay nhiều deal.
Hãy hình dung nhà hàng. Phiếu gọi món là order, mỗi lần bếp giao món là deal, còn món hiện có trên bàn là position. Ví dụ này chỉ giúp phân lớp; máy chủ giao dịch còn có nhiều trạng thái khác.
MetaQuotes tách nhóm hàm position khỏi order và lịch sử trong Trade Functions. Một pending order, tức lệnh chờ chưa khớp, không có nghĩa tài khoản đã có position.
b. Một bản ghi position chứa gì
Snapshot, hay bản chụp trạng thái, là nhóm thuộc tính được đọc trong một thời điểm xử lý. Một snapshot position tối thiểu thường gồm:
- symbol, hướng và volume;
- giá mở, giá hiện tại, SL và TP;
- ticket, identifier và magic ID;
- thời gian mở và thời gian cập nhật.
Position Properties liệt kê các trường này. Snapshot chỉ đúng tại lúc đọc, không phải dữ liệu bất biến để giữ mãi trong bộ nhớ tạm (RAM).
c. Quản lý position không phải bộ máy tín hiệu
Bộ máy tín hiệu tìm điều kiện giao dịch. Bộ quản lý position xác định position thuộc trách nhiệm của nó và trạng thái hành động.
Trộn hai vai trò khiến một tick vừa tìm tín hiệu, sửa SL, gửi yêu cầu đóng và cập nhật trạng thái. Bài này chỉ quản lý position đã tồn tại.
2. Netting và hedging đổi cách nhận diện position
a. Một symbol có một hay nhiều position
Netting, hay chế độ bù trừ, cho phép tối đa một position trên mỗi symbol. Hedging, hay chế độ tách riêng, cho phép nhiều position cùng symbol. EA đọc chế độ bằng ACCOUNT_MARGIN_MODE; không đoán từ tài khoản thử nghiệm. MetaQuotes — Account type: netting or hedging
Giả sử tài khoản hedging có hai position EURUSD: 81001 thuộc EA Mây X, 81002 thuộc giao dịch khác. Symbol không đủ xác định dòng được phép quản lý.
Đây là ownership, tức quyền sở hữu logic. EA chỉ được thao tác position khớp phạm vi đã định.
b. Ticket, identifier và magic ID
Ba mã có ba nhiệm vụ:
- Ticket là mã position hiện tại, dùng để select, modify hoặc close đúng đối tượng.
- Identifier là mã vòng đời giúp nối position với order và deal liên quan.
- Magic ID là mã do chương trình gắn để nhận diện nguồn logic.
Theo Position Properties, POSITION_IDENTIFIER giữ nguyên suốt vòng đời, kể cả khi đảo chiều netting làm POSITION_TICKET đổi. Identifier dùng đối soát lịch sử; ticket mới đọc dùng cho thao tác hiện tại.
Magic ID chưa đủ nếu cấu hình bị trùng. Một scope, tức phạm vi quản lý, nên ghép chế độ tài khoản, symbol, magic ID và phiên chiến lược.
Hình 1 — Ticket phục vụ thao tác hiện tại; identifier nối vòng đời; magic và symbol giúp lọc quyền quản lý.
c. Vì sao biến thể hàm theo symbol là lựa chọn có điều kiện
Trong netting, thao tác theo symbol có thể phù hợp. Trong hedging, PositionModify(symbol, ...) tác động ticket thấp nhất. CTrade PositionModify
Vì vậy, câu “sửa theo symbol luôn đúng” là sai. Câu chính xác hơn là: “chỉ dùng biến thể theo symbol khi chế độ tài khoản và quy tắc sở hữu chứng minh chỉ có đúng position cần quản lý”. Nếu có nhiều ticket, chọn bằng ticket cụ thể.
3. Vòng quản lý sáu bước cho EA Mây X
a. Discover: tìm danh sách ứng viên
EA bắt đầu bằng position đang mở, không dùng ticket cũ. PositionsTotal() cho số lượng; PositionGetTicket(index) trả ticket tại chỉ số và tự select. Tài liệu vẫn khuyên select lại ngay trước khi đọc. PositionGetTicket
Nếu danh sách có thể đổi, hãy chụp các ticket rồi xử lý độc lập. Ticket 0 hoặc select thất bại không được biến thành dữ liệu mặc định.
b. Lọc quyền quản lý: chỉ giữ đúng phạm vi
EA Mây X dùng magic 7904, chỉ quản lý EURUSD. Position sai symbol, magic hoặc phạm vi được gắn FOREIGN — ngoài phạm vi — rồi ghi nhật ký và bỏ qua.
Không được sửa position FOREIGN. Position thủ công và position của EA khác có quy tắc riêng.
c. Refresh: nạp lại snapshot mới
Select là chọn position và sao chép dữ liệu vào chương trình. PositionSelectByTicket cảnh báo bản sao có thể vẫn đọc được dù position đã đổi hoặc biến mất. Vì vậy, EA select lại trước khi đọc.
Select thất bại không đồng nghĩa “đã đóng”. Trạng thái MISSING cần reconcile, tức đối chiếu tài khoản và lịch sử.
d. Quyết định, gửi yêu cầu và xác minh
Intent là ý định xử lý được tính từ snapshot mới. Ví dụ: KEEP (giữ nguyên), MODIFY (sửa), CLOSE (đóng) hoặc HALT (dừng hành động mới). Bước quyết định chỉ trả intent và lý do, chưa phát yêu cầu giao dịch.
Khối sở hữu yêu cầu gửi thao tác bằng ticket. Với CTrade, true từ PositionModify hay PositionClose chỉ cho biết kiểm tra cấu trúc thành công, không bảo đảm máy chủ đã thực hiện. Cần kiểm tra mã phản hồi ResultRetcode(). PositionModify, PositionClose
Cuối cùng, EA đợi sự kiện phù hợp hoặc nạp lại tài khoản để xác minh trạng thái thật. OnTradeTransaction có thể nhận nhiều transaction cho một yêu cầu và thứ tự tới không được bảo đảm, nên sự kiện chỉ kích hoạt đối chiếu, không phải giấy chứng nhận độc lập. OnTradeTransaction
Hình 2 — Vòng quản lý chỉ hoàn tất sau verify; mismatch dừng hành động mới để đối chiếu.
4. Năm lỗi dễ làm EA quản lý nhầm
a. Nhầm pending order với position
Lệnh chờ có thể nằm trên tab Trade nhưng chưa phải position. Dùng OrdersTotal() để suy ra số position, hoặc xóa order khi ý định thật là đóng position, là sai lớp dữ liệu.
b. Chỉ lọc symbol
Trên tài khoản hedging, hai ticket EURUSD có thể thuộc hai hệ thống. Lọc chỉ theo symbol khiến EA Mây X chạm position của chiến lược khác. Ít nhất phải có magic và phạm vi chiến lược, sau đó xác minh lại ticket.
c. Tin snapshot cũ
EA đọc volume 0.10, sự kiện khác làm position còn 0.05, rồi quyết định vẫn dựa trên 0.10. Đây là stale data, hay dữ liệu cũ. Cách giảm lỗi là giữ thời gian cập nhật, select lại sát lúc quyết định và từ chối hành động nếu bằng chứng đổi.
d. Tin true là đã hoàn tất
true từ hàm giao dịch không thay thế mã phản hồi và snapshot tài khoản. Yêu cầu có thể vượt kiểm tra cơ bản nhưng bị máy chủ từ chối, hoặc được xử lý theo nhiều bước. Trạng thái cục bộ chỉ đổi sau bằng chứng đã định.
e. Vừa duyệt vừa làm danh sách đổi
Nếu vòng lặp theo chỉ số rồi đóng một position giữa vòng, chỉ số sau có thể trỏ sang phần tử khác. Hãy chụp danh sách ticket trước, select lại từng ticket và coi MISSING là trường hợp cần đối chiếu.
Khi gặp mismatch — dữ liệu không khớp — HALT nghĩa là dừng phát hành động mới trong phạm vi bị ảnh hưởng. Nó không mặc định đóng tất cả; chính sách khẩn cấp cần được thiết kế và kiểm thử riêng.
5. Checklist và Position Control Card 15 phút
a. Mười câu trước khi cho position manager chạy
- Tài khoản đang netting hay hedging?
- Scope gồm tài khoản, symbol, magic và phiên chiến lược nào?
- EA liệt kê position bằng nguồn nào?
- Ticket nào vừa được select lại?
- Snapshot có dấu thời gian cập nhật và đủ thuộc tính không?
- Ticket và identifier đang phục vụ đúng vai trò chưa?
- Intent là
KEEP,MODIFY,CLOSEhayHALT? - Kết quả yêu cầu sẽ được kiểm bằng mã phản hồi nào?
- Trạng thái tài khoản nào xác nhận hành động hoàn tất?
MISSING,FOREIGNhoặc mismatch dẫn tới bỏ qua, đối chiếu hay dừng?
Hình 3 — Control Card biến quyền quản lý, snapshot, intent và bằng chứng thành bốn cột có thể kiểm tra.
b. Bài tập miễn phí, chưa dùng tiền thật
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 tự phân loại theo scope giả lập: tài khoản hedging, EURUSD, magic 7904. Không mở MetaTrader, không bật AutoTrading và không gửi yêu cầu.
c. Mẫu đối chiếu tham khảo
| Ticket | Symbol | Magic | Volume | Scope | Snapshot | Intent | Evidence cần có |
|---|---|---|---|---|---|---|---|
| 81001 | EURUSD | 7904 | 0.10 | OWNED | FRESH | KEEP | Ticket tồn tại, type/volume khớp |
| 81002 | EURUSD | 0 | 0.05 | FOREIGN | FRESH | SKIP | Magic không thuộc EA |
| 81003 | XAUUSD | 7904 | 0.10 | FOREIGN | FRESH | SKIP | Symbol ngoài phạm vi |
| 81004 | EURUSD | 7904 | 0.10 | UNKNOWN | MISSING | HALT | Đối chiếu tài khoản và lịch sử |
Kết quả không phải “EA đã an toàn”. Sản phẩm thực hành cần có bốn quyết định, lý do, bằng chứng và quy tắc dừng. Thử đổi tài khoản sang netting rồi ghi phần nào được đơn giản hóa, phần nào vẫn phải giữ.
6. Tổng kết: đúng position, đúng snapshot, đúng bằng chứng
a. Năm ý chính
- Order là yêu cầu, deal là lần khớp, position là trạng thái nắm giữ đang mở.
- Netting và hedging quyết định một symbol có thể có một hay nhiều position.
- Ticket, identifier và magic ID giải quyết ba bài toán khác nhau.
- Position manager phải lọc ownership và select lại trước khi đọc.
- Yêu cầu chỉ hoàn tất khi mã phản hồi cùng trạng thái tài khoản cung cấp bằng chứng.
Bài trước là State Machine trong EA. Bài tiếp theo sẽ tách lớp còn lại: Quản lý Order trong EA #5.
b. Câu hỏi tự kiểm tra
- Order, deal và position khác nhau thế nào?
- Vì sao chỉ lọc symbol không đủ trên tài khoản hedging?
PositionModify()trảtrueđã chứng minh điều gì?- Khi select lại ticket thất bại, vì sao không được tự kết luận đã close?
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ữ hiện tại. Xem lại mục 1.
Xem gợi ý câu 2
Hedging cho phép nhiều position cùng symbol; cần ticket và ownership scope để chọn đúng. Xem lại mục 2.
Xem gợi ý câu 3
Nó chỉ cho biết kiểm tra cơ bản của cấu trúc thành công; còn phải đọc mã phản hồi và trạng thái tài khoản. Xem lại mục 3.
Xem gợi ý câu 4
Position có thể đã đóng, đổi ticket hoặc snapshot trước bị lỗi; cần đối chiếu tài khoản và lịch sử. Xem lại mục 4.
d. Thuật ngữ cần nhớ
| Thuật ngữ | Giải thích ngắn |
|---|---|
| Position | Trạng thái nắm giữ đang mở |
| Order | Yêu cầu giao dịch |
| Deal | Một lần khớp thực tế |
| Ticket | Mã position dùng cho thao tác hiện tại |
| Identifier | Mã nối vòng đời position |
| Magic ID | Mã nhận diện logic EA |
| Snapshot | Bản chụp thuộc tính tại một thời điểm |
| Ownership scope | Phạm vi EA được phép quản lý |
| Reconcile | Đối chiếu trạng thái với tài khoản và lịch sử |
e. Nguồn tham khảo
- MetaQuotes — Trade Functions
- MetaQuotes — Position Properties
- MetaQuotes — PositionGetTicket
- MetaQuotes — PositionSelectByTicket
- MetaQuotes — Account type: netting or hedging
- MetaQuotes — PositionModify
- MetaQuotes — PositionClose
- 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