Điều kiện giao dịch ký hiệu và chế độ thực thi lệnh
Trong phần này, chúng ta sẽ đi sâu hơn vào các khía cạnh của tự động hóa giao dịch phụ thuộc vào cài đặt của các công cụ tài chính. Hiện tại, chúng ta chỉ nghiên cứu các thuộc tính, trong khi ứng dụng thực tế của chúng sẽ được trình bày trong các chương sau. Giả định rằng người đọc đã quen với các thuật ngữ cơ bản như lệnh thị trường và lệnh chờ, giao dịch và vị thế.
Khi gửi một yêu cầu giao dịch để thực thi, cần lưu ý rằng trong thị trường tài chính không có gì đảm bảo rằng tại một thời điểm cụ thể, toàn bộ khối lượng yêu cầu sẽ có sẵn cho công cụ tài chính này ở mức giá mong muốn. Do đó, giao dịch thời gian thực được điều chỉnh bởi các chế độ thực thi giá và khối lượng. Chế độ, hay nói cách khác là chính sách thực thi, xác định các quy tắc cho các trường hợp khi giá thay đổi hoặc khối lượng yêu cầu không thể được thực thi đầy đủ tại thời điểm hiện tại.
Trong API MQL5, các chế độ này có sẵn cho mỗi ký hiệu dưới dạng các thuộc tính sau, có thể được lấy qua hàm SymbolInfoInteger
.
Định danh | Mô tả |
---|---|
SYMBOL_TRADE_EXEMODE | Chế độ thực thi giao dịch liên quan đến giá |
SYMBOL_FILLING_MODE | Cờ của các chế độ điền lệnh được phép liên quan đến khối lượng (mặt nạ bit, xem thêm) |
Giá trị của thuộc tính SYMBOL_TRADE_EXEMODE
là một thành viên của liệt kê ENUM_SYMBOL_TRADE_EXECUTION
.
Định danh | Mô tả |
---|---|
SYMBOL_TRADE_EXECUTION_REQUEST | Giao dịch tại giá yêu cầu |
SYMBOL_TRADE_EXECUTION_INSTANT | Thực thi tức thì (giao dịch tại giá trực tuyến) |
SYMBOL_TRADE_EXECUTION_MARKET | Thực thi thị trường |
SYMBOL_TRADE_EXECUTION_EXCHANGE | Thực thi trên sàn giao dịch |
Tất cả hoặc hầu hết các chế độ này nên được người dùng terminal biết đến từ danh sách thả xuống Type
trong hộp thoại New order
(F9). Hãy ôn lại ngắn gọn ý nghĩa của chúng. Để biết thêm chi tiết, vui lòng tham khảo tài liệu terminal.
- Thực thi theo yêu cầu (
SYMBOL_TRADE_EXECUTION_REQUEST
) — thực thi lệnh thị trường tại giá đã nhận trước đó từ nhà môi giới. Trước khi gửi lệnh thị trường, nhà giao dịch yêu cầu giá hiện tại từ nhà môi giới. Việc thực thi tiếp theo của lệnh tại giá này có thể được xác nhận hoặc từ chối. - Thực thi tức thì (
SYMBOL_TRADE_EXECUTION_INSTANT
) — thực thi lệnh thị trường tại giá hiện tại. Khi gửi yêu cầu giao dịch để thực thi, terminal tự động chèn giá hiện tại vào lệnh. Nếu nhà môi giới chấp nhận giá, lệnh được thực thi. Nếu nhà môi giới không chấp nhận giá yêu cầu, nhà môi giới trả về các giá mà lệnh này có thể được thực thi, được gọi là requote. - Thực thi thị trường (
SYMBOL_TRADE_EXECUTION_MARKET
) — nhà môi giới chèn giá thực thi vào lệnh mà không cần xác nhận thêm từ nhà giao dịch. Gửi lệnh thị trường trong chế độ này ngụ ý sự đồng ý trước với giá mà nó sẽ được thực thi. - Thực thi trên sàn giao dịch (
SYMBOL_TRADE_EXECUTION_EXCHANGE
) — các hoạt động giao dịch được thực hiện tại giá của các ưu đãi thị trường hiện tại.
Đối với các bit trong SYMBOL_FILLING_MODE
có thể được kết hợp với toán tử logic OR (|
), sự hiện diện hoặc vắng mặt của chúng biểu thị các hành động sau.
Định danh | Giá trị | Chính sách điền |
---|---|---|
SYMBOL_FILLING_FOK | 1 | Fill Or Kill (FOK); lệnh phải được thực thi hoàn toàn theo khối lượng chỉ định hoặc bị hủy |
SYMBOL_FILLING_IOC | 2 | Immediate or Cancel (IOC); giao dịch khối lượng tối đa có sẵn trên thị trường trong giới hạn được chỉ định trong lệnh hoặc hủy |
(Thiếu định danh) | (bất kỳ, bao gồm 0) | Return; trong trường hợp thực thi một phần, lệnh thị trường hoặc lệnh giới hạn với khối lượng còn lại không bị hủy mà vẫn hợp lệ |
Khả năng sử dụng các chế độ FOK và IOC được xác định bởi máy chủ giao dịch.
Nếu chế độ SYMBOL_FILLING_FOK
được bật, khi gửi lệnh với hàm OrderSend
, chương trình MQL sẽ có thể sử dụng loại điền lệnh tương ứng trong cấu trúc MqlTradeRequest
: ORDER_FILLING_FOK
. Nếu đồng thời không có đủ khối lượng của công cụ tài chính trên thị trường, lệnh sẽ không được thực thi. Cần lưu ý rằng khối lượng yêu cầu có thể được tạo thành từ nhiều ưu đãi hiện có trên thị trường, dẫn đến nhiều giao dịch.
Nếu chế độ SYMBOL_FILLING_IOC
được bật, chương trình MQL sẽ có quyền truy cập vào phương thức điền lệnh ORDER_FILLING_IOC
cùng tên (nó cũng được chỉ định trong trường đặc biệt type_filling
trong cấu trúc MqlTradeRequest
trước khi gửi lệnh đến hàm OrderSend
). Khi sử dụng chế độ này, trong trường hợp không thể thực thi đầy đủ, lệnh sẽ được thực thi trên khối lượng có sẵn, và khối lượng còn lại của lệnh sẽ bị hủy.
Chính sách cuối cùng không có định danh là chế độ mặc định và luôn có sẵn bất kể các chế độ khác (đó là lý do nó khớp với số không hoặc bất kỳ giá trị nào khác). Nói cách khác, ngay cả khi chúng ta nhận được giá trị 1 (SYMBOL_FILLING_FOK
), 2 (SYMBOL_FILLING_IOC
), hoặc 3 (SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC
) cho thuộc tính SYMBOL_FILLING_MODE
, chế độ return sẽ được ngụ ý. Để sử dụng chính sách này, khi lập lệnh (điền vào cấu trúc MqlTradeRequest
), chúng ta nên chỉ định loại điền ORDER_FILLING_RETURN
.
Trong tất cả các chế độ
SYMBOL_TRADE_EXEMODE
, có một đặc thù liên quan đến thực thi thị trường (SYMBOL_TRADE_EXECUTION_MARKET
): Lệnh return luôn bị cấm trong chế độ thực thi thị trường.
Vì ORDER_FILLING_FOK
tương ứng với hằng số 0, việc không chỉ định rõ loại điền trong yêu cầu giao dịch sẽ ngụ ý chế độ này.
Chúng ta sẽ xem xét tất cả các sắc thái này trong thực tế khi phát triển Expert Advisors, nhưng hiện tại, hãy kiểm tra việc đọc các thuộc tính trong một kịch bản đơn giản SymbolFilterExecMode.mq5
.
#include <MQL5Book/SymbolFilter.mqh>
void OnStart()
{
SymbolFilter f; // đối tượng bộ lọc
string symbols[]; // mảng tên ký hiệu
long permissions[][2]; // mảng với vector giá trị thuộc tính
// thuộc tính cần đọc
ENUM_SYMBOL_INFO_INTEGER modes[] =
{
SYMBOL_TRADE_EXEMODE,
SYMBOL_FILLING_MODE
};
// áp dụng bộ lọc - điền mảng
f.select(true, modes, symbols, permissions);
const int n = ArraySize(symbols);
PrintFormat("===== Chế độ thực thi và điền giao dịch cho các ký hiệu (%d) =====", n);
for(int i = 0; i < n; ++i)
{
Print(symbols[i] + ":");
for(int j = 0; j < ArraySize(modes); ++j)
{
// xuất thuộc tính dưới dạng mô tả và số
PrintFormat(" %s (%d)",
SymbolMonitor::stringify(permissions[i][j], modes[j]),
permissions[i][j]);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Dưới đây là một đoạn nhật ký với kết quả của kịch bản. Hầu hết các ký hiệu ở đây có chế độ thực thi tức thì tại giá (SYMBOL_TRADE_EXECUTION_INSTANT
) ngoại trừ ký hiệu cuối cùng SP500m
(SYMBOL_TRADE_EXECUTION_MARKET
). Ở đây chúng ta có thể thấy nhiều chế độ điền khối lượng khác nhau, cả SYMBOL_FILLING_FOK
, SYMBOL_FILLING_IOC
riêng lẻ và sự kết hợp của chúng. Chỉ có BTCUSD
được chỉ định SYMBOL_FILLING_RETURN
, tức là nhận được giá trị 0 (không có bit FOK và IOC).
===== Chế độ thực thi và điền giao dịch cho các ký hiệu (13) =====
EURUSD:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[ _SYMBOL_FILLING_FOK ] (1)
GBPUSD:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[ _SYMBOL_FILLING_FOK ] (1)
...
USDCNH:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[ _SYMBOL_FILLING_FOK _SYMBOL_FILLING_IOC ] (3)
USDRUB:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[ _SYMBOL_FILLING_IOC ] (2)
AUDUSD:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[ _SYMBOL_FILLING_FOK ] (1)
NZDUSD:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[ _SYMBOL_FILLING_FOK _SYMBOL_FILLING_IOC ] (3)
...
XAUUSD:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[ _SYMBOL_FILLING_FOK _SYMBOL_FILLING_IOC ] (3)
BTCUSD:
SYMBOL_TRADE_EXECUTION_INSTANT (1)
[(_SYMBOL_FILLING_RETURN)] (0)
SP500m:
SYMBOL_TRADE_EXECUTION_MARKET (2)
[ _SYMBOL_FILLING_FOK ] (1)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Nhớ rằng các dấu gạch dưới trong định danh chế độ điền xuất hiện do chúng ta đã phải định nghĩa liệt kê SYMBOL_FILLING
(SymbolMonitor.mqh
) của riêng mình với các phần tử có giá trị hằng số. Điều này được thực hiện vì MQL5 không có liệt kê tích hợp sẵn như vậy, nhưng đồng thời, chúng ta không thể đặt tên cho các phần tử của liệt kê của mình trùng với các hằng số tích hợp vì điều này sẽ gây xung đột tên.