Khối lượng giao dịch được phép
Trong các chương sau, khi chúng ta học cách lập trình Expert Advisors, chúng ta sẽ cần kiểm soát nhiều đặc tính của ký hiệu ảnh hưởng đến việc gửi lệnh giao dịch thành công. Đặc biệt, điều này áp dụng cho phần thông số kỹ thuật của ký hiệu quy định phạm vi hoạt động được phép. Các thuộc tính tương ứng cũng có sẵn trong MQL5. Tất cả đều thuộc kiểu double
và được truy vấn bởi hàm SymbolInfoDouble
.
Định danh | Mô tả |
---|---|
SYMBOL_VOLUME_MIN | Khối lượng giao dịch tối thiểu tính bằng lot |
SYMBOL_VOLUME_MAX | Khối lượng giao dịch tối đa tính bằng lot |
SYMBOL_VOLUME_STEP | Bước thay đổi tối thiểu cho khối lượng giao dịch tính bằng lot |
SYMBOL_VOLUME_LIMIT | Khối lượng tổng tối đa cho phép của vị thế mở và lệnh chờ theo một hướng (mua hoặc bán) |
SYMBOL_TRADE_CONTRACT_SIZE | Kích thước hợp đồng giao dịch = 1 lot |
Việc cố gắng mua hoặc bán một công cụ tài chính với khối lượng nhỏ hơn mức tối thiểu, lớn hơn mức tối đa, hoặc không phải bội số của bước sẽ dẫn đến lỗi. Trong chương liên quan đến API giao dịch, chúng ta sẽ triển khai mã để thống nhất các kiểm tra cần thiết và chuẩn hóa khối lượng trước khi gọi các hàm giao dịch API của MQL5.
Ngoài ra, chương trình MQL cũng nên kiểm tra SYMBOL_VOLUME_LIMIT
. Ví dụ, với giới hạn 5 lot, bạn có thể có một vị thế mua mở với khối lượng 5 lot và đặt một lệnh chờ Sell Limit
với khối lượng 5 lot. Tuy nhiên, bạn không thể đặt lệnh chờ Buy Limit
(vì tổng khối lượng theo một hướng sẽ vượt quá giới hạn) hoặc đặt Sell Limit
vượt quá 5 lot.
Như một ví dụ giới thiệu, hãy xem xét kịch bản SymbolFilterVolumes.mq5
, kịch bản này ghi lại giá trị của các thuộc tính trên cho các ký hiệu đã chọn. Hãy thêm biến MinimalContractSize
vào tham số đầu vào để có thể lọc các ký hiệu theo thuộc tính SYMBOL_TRADE_CONTRACT_SIZE
: chỉ hiển thị những ký hiệu có kích thước hợp đồng lớn hơn giá trị được chỉ định (mặc định là 0, tức là tất cả ký hiệu đều thỏa mãn điều kiện).
#include <MQL5Book/SymbolFilter.mqh>
input bool MarketWatchOnly = true;
input double MinimalContractSize = 0;
2
3
4
Tại đầu của OnStart
, hãy định nghĩa một đối tượng bộ lọc và các mảng đầu ra để lấy danh sách tên thuộc tính và giá trị dưới dạng vector double
cho bốn trường. Danh sách bốn thuộc tính cần thiết được chỉ định trong mảng volumeIds
.
void OnStart()
{
SymbolFilter f; // đối tượng bộ lọc
string symbols[]; // mảng nhận với tên
double volumeLimits[][4]; // mảng nhận với vector dữ liệu
// các thuộc tính ký hiệu được yêu cầu
ENUM_SYMBOL_INFO_DOUBLE volumeIds[] =
{
SYMBOL_VOLUME_MIN,
SYMBOL_VOLUME_STEP,
SYMBOL_VOLUME_MAX,
SYMBOL_VOLUME_LIMIT
};
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Tiếp theo, chúng ta áp dụng bộ lọc theo kích thước hợp đồng (phải lớn hơn giá trị được chỉ định) và lấy các trường thông số liên quan đến khối lượng cho các ký hiệu phù hợp.
f.let(SYMBOL_TRADE_CONTRACT_SIZE, MinimalContractSize, SymbolFilter::IS::GREATER)
.select(MarketWatchOnly, volumeIds, symbols, volumeLimits);
const int n = ArraySize(volumeLimits);
PrintFormat("===== Giới hạn khối lượng của các ký hiệu (%d) =====", n);
string title = "";
for(int i = 0; i < ArraySize(volumeIds); ++i)
{
title += "\t" + EnumToString(volumeIds[i]);
}
Print(title);
for(int i = 0; i < n; ++i)
{
Print(symbols[i]);
ArrayPrint(volumeLimits, 3, NULL, i, 1, 0);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Với cài đặt mặc định, kịch bản có thể hiển thị kết quả như sau (với các tên viết tắt).
===== Giới hạn khối lượng của các ký hiệu (13) =====
SYMBOL_VOLUME_MIN SYMBOL_VOLUME_STEP SYMBOL_VOLUME_MAX SYMBOL_VOLUME_LIMIT
EURUSD
0.010 0.010 500.000 0.000
GBPUSD
0.010 0.010 500.000 0.000
USDCHF
0.010 0.010 500.000 0.000
USDJPY
0.010 0.010 500.000 0.000
USDCNH
0.010 0.010 1000.000 0.000
USDRUB
0.010 0.010 1000.000 0.000
...
XAUUSD
0.010 0.010 100.000 0.000
BTCUSD
0.010 0.010 1000.000 0.000
SP500m
0.100 0.100 5.000 15.000
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Một số ký hiệu có thể không bị giới hạn bởi SYMBOL_VOLUME_LIMIT
(giá trị là 0). Bạn có thể so sánh kết quả với thông số kỹ thuật của ký hiệu: chúng phải khớp.