Các loại giao dịch thương mại
Ngoài việc thực hiện các hoạt động giao dịch, các chương trình MQL có thể phản hồi các sự kiện giao dịch. Điều quan trọng cần lưu ý rằng các sự kiện như vậy không chỉ xảy ra do hành động của chương trình, mà còn vì các lý do khác, ví dụ, khi được quản lý thủ công bởi người dùng hoặc thực hiện các hành động tự động trên máy chủ (kích hoạt lệnh chờ, Stop Loss
, Take Profit
, Stop Out
, chuyển vị thế sang ngày mới, nạp hoặc rút tiền từ tài khoản, và nhiều hơn nữa).
Bất kể ai là người khởi tạo hành động, chúng dẫn đến việc thực hiện các giao dịch thương mại trên tài khoản. Các giao dịch thương mại là các bước không thể chia nhỏ bao gồm:
- Xử lý một yêu cầu giao dịch
- Thay đổi danh sách các lệnh đang hoạt động (bao gồm thêm lệnh mới, thực hiện và xóa lệnh đã được kích hoạt)
- Thay đổi lịch sử lệnh
- Thay đổi lịch sử giao dịch
- Thay đổi vị thế
Tùy thuộc vào bản chất của hoạt động, một số bước có thể là tùy chọn. Ví dụ, việc sửa đổi mức bảo vệ của một vị thế sẽ bỏ qua ba điểm giữa. Và khi một lệnh mua được gửi đi, thị trường sẽ trải qua một chu kỳ đầy đủ: yêu cầu được xử lý, một lệnh tương ứng được tạo cho tài khoản, lệnh được thực hiện, nó bị xóa khỏi danh sách đang hoạt động, được thêm vào lịch sử lệnh, sau đó giao dịch tương ứng được thêm vào lịch sử và một vị thế mới được tạo. Tất cả những hành động này đều là giao dịch thương mại.
Để nhận thông báo về các sự kiện như vậy, hàm xử lý đặc biệt OnTradeTransaction
nên được mô tả trong một Expert Advisor hoặc một chỉ báo. Chúng ta sẽ xem xét chi tiết trong phần tiếp theo. Thực tế là một trong các tham số của nó, tham số đầu tiên và quan trọng nhất, có kiểu của một cấu trúc được định nghĩa trước MqlTradeTransaction
. Vì vậy, trước tiên hãy nói về các giao dịch như vậy.
struct MqlTradeTransaction
{
ulong deal; // Vé giao dịch
ulong order; // Vé lệnh
string symbol; // Tên của công cụ giao dịch
ENUM_TRADE_TRANSACTION_TYPE type; // Loại giao dịch thương mại
ENUM_ORDER_TYPE order_type; // Loại lệnh
ENUM_ORDER_STATE order_state; // Trạng thái lệnh
ENUM_DEAL_TYPE deal_type; // Loại giao dịch
ENUM_ORDER_TYPE_TIME time_type; // Loại lệnh theo thời hạn
datetime time_expiration; // Ngày hết hạn của lệnh
double price; // Giá
double price_trigger; // Giá kích hoạt lệnh giới hạn dừng
double price_sl; // Mức Stop Loss
double price_tp; // Mức Take Profit
double volume; // Khối lượng tính bằng lô
ulong position; // Vé vị thế
ulong position_by; // Vé vị thế đối lập
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Bảng sau mô tả từng trường của cấu trúc.
Trường | Mô tả |
---|---|
deal | Vé giao dịch |
order | Vé lệnh |
symbol | Tên của công cụ giao dịch mà giao dịch được thực hiện |
type | Loại giao dịch thương mại ENUM_TRADE_TRANSACTION_TYPE (xem bên dưới) |
order_type | Loại lệnh ENUM_ORDER_TYPE |
order_state | Trạng thái lệnh ENUM_ORDER_STATE |
deal_type | Loại giao dịch ENUM_DEAL_TYPE |
time_type | Loại lệnh theo thời hạn hết hạn ENUM_ORDER_TYPE_TIME |
time_expiration | Ngày hết hạn của lệnh chờ |
price | Giá của lệnh, giao dịch hoặc vị thế, tùy thuộc vào giao dịch |
price_trigger | Giá dừng (giá kích hoạt) của lệnh giới hạn dừng |
price_sl | Giá Stop Loss ; có thể liên quan đến lệnh, giao dịch hoặc vị thế, tùy thuộc vào giao dịch |
price_tp | Giá Take Profit ; có thể liên quan đến lệnh, giao dịch hoặc vị thế, tùy thuộc vào giao dịch |
volume | Khối lượng tính bằng lô; có thể biểu thị khối lượng hiện tại của lệnh, giao dịch hoặc vị thế, tùy thuộc vào giao dịch |
position | Vé của vị thế bị ảnh hưởng bởi giao dịch |
position_by | Vé vị thế đối lập |
Một số trường chỉ có ý nghĩa trong các trường hợp nhất định. Đặc biệt, trường time_expiration
được điền cho các lệnh có time_type
bằng loại hết hạn ORDER_TIME_SPECIFIED
hoặc ORDER_TIME_SPECIFIED_DAY
. Trường price_trigger
chỉ dành riêng cho các lệnh dừng-giới hạn (ORDER_TYPE_BUY_STOP_LIMIT
và ORDER_TYPE_SELL_STOP_LIMIT
).
Cũng rõ ràng rằng các sửa đổi vị thế hoạt động trên vé vị thế (trường position
), nhưng không sử dụng vé lệnh hoặc vé giao dịch. Ngoài ra, trường position_by
được dành riêng cho việc đóng một vị thế đối lập, tức là vị thế được mở cho cùng công cụ nhưng theo hướng ngược lại.
Đặc điểm xác định để phân tích một giao dịch là loại của nó (trường type
). Để mô tả nó, API MQL5 giới thiệu một liệt kê đặc biệt ENUM_TRADE_TRANSACTION_TYPE
, chứa tất cả các loại giao dịch có thể.
Định danh | Mô tả |
---|---|
TRADE_TRANSACTION_ORDER_ADD | Thêm một lệnh mới |
TRADE_TRANSACTION_ORDER_UPDATE | Thay đổi một lệnh đang hoạt động |
TRADE_TRANSACTION_ORDER_DELETE | Xóa một lệnh đang hoạt động |
TRADE_TRANSACTION_DEAL_ADD | Thêm một giao dịch vào lịch sử |
TRADE_TRANSACTION_DEAL_UPDATE | Thay đổi một giao dịch trong lịch sử |
TRADE_TRANSACTION_DEAL_DELETE | Xóa một giao dịch khỏi lịch sử |
TRADE_TRANSACTION_HISTORY_ADD | Thêm một lệnh vào lịch sử do thực hiện hoặc hủy bỏ |
TRADE_TRANSACTION_HISTORY_UPDATE | Thay đổi một lệnh trong lịch sử |
TRADE_TRANSACTION_HISTORY_DELETE | Xóa một lệnh khỏi lịch sử |
TRADE_TRANSACTION_POSITION | Thay đổi một vị thế |
TRADE_TRANSACTION_REQUEST | Thông báo rằng một yêu cầu giao dịch đã được xử lý bởi máy chủ và kết quả xử lý đã được nhận |
Hãy cung cấp một số giải thích.
Trong giao dịch loại TRADE_TRANSACTION_ORDER_UPDATE
, các thay đổi của lệnh bao gồm không chỉ các thay đổi rõ ràng từ phía terminal khách hàng hoặc máy chủ giao dịch mà còn cả thay đổi trạng thái của nó (ví dụ, chuyển từ trạng thái ORDER_STATE_STARTED
sang ORDER_STATE_PLACED
hoặc từ ORDER_STATE_PLACED
sang ORDER_STATE_PARTIAL
, v.v.).
Trong giao dịch TRADE_TRANSACTION_ORDER_DELETE
, một lệnh có thể bị xóa do yêu cầu rõ ràng tương ứng hoặc thực hiện (điền) trên máy chủ. Trong cả hai trường hợp, nó sẽ được chuyển vào lịch sử và giao dịch TRADE_TRANSACTION_HISTORY_ADD
cũng phải xảy ra.
Giao dịch TRADE_TRANSACTION_DEAL_ADD
được thực hiện không chỉ do thực hiện lệnh mà còn do các giao dịch với số dư tài khoản.
Một số giao dịch, như TRADE_TRANSACTION_DEAL_UPDATE
, TRADE_TRANSACTION_DEAL_DELETE
, TRADE_TRANSACTION_HISTORY_DELETE
khá hiếm vì chúng mô tả các tình huống khi một giao dịch hoặc lệnh trong lịch sử được thay đổi hoặc xóa trên máy chủ một cách hồi tố. Điều này, theo quy tắc, là hậu quả của việc đồng bộ với một hệ thống giao dịch bên ngoài (sàn giao dịch).
Điều quan trọng cần lưu ý là việc thêm hoặc thanh lý một vị thế không kéo theo sự xuất hiện của giao dịch TRADE_TRANSACTION_POSITION
. Loại giao dịch này thông báo rằng vị thế đã được thay đổi ở phía máy chủ giao dịch, theo chương trình hoặc thủ công bởi người dùng. Đặc biệt, một vị thế có thể trải qua các thay đổi về khối lượng (đóng đối lập một phần, đảo ngược), giá mở, cũng như mức Stop Loss
và Take Profit
. Một số hành động, như nạp thêm, không kích hoạt sự kiện này.
Tất cả các yêu cầu giao dịch do chương trình MQL phát hành được phản ánh trong các giao dịch TRADE_TRANSACTION_REQUEST
, cho phép phân tích việc thực hiện của chúng theo cách trì hoãn. Điều này đặc biệt quan trọng khi sử dụng hàm OrderSendAsync
, hàm này ngay lập tức trả lại quyền điều khiển cho mã gọi, vì vậy kết quả không được biết. Đồng thời, các giao dịch được tạo ra theo cách tương tự khi sử dụng hàm đồng bộ OrderSend
.
Ngoài ra, sử dụng các giao dịch TRADE_TRANSACTION_REQUEST
, bạn có thể phân tích các hành động giao dịch của người dùng từ giao diện terminal.