Chênh lệch giá và khoảng cách lệnh từ giá hiện tại
Đối với nhiều chiến lược giao dịch, đặc biệt là những chiến lược dựa trên giao dịch ngắn hạn, thông tin về chênh lệch giá và khoảng cách từ giá hiện tại, cho phép cài đặt hoặc sửa đổi lệnh, rất quan trọng. Tất cả các thuộc tính này là một phần của liệt kê ENUM_SYMBOL_INFO_INTEGER
và có sẵn thông qua hàm SymbolInfoInteger
(SymbolInfoInteger).
Định danh | Mô tả |
---|---|
SYMBOL_SPREAD | Kích thước chênh lệch giá (tính bằng điểm) |
SYMBOL_SPREAD_FLOAT | Dấu hiệu boolean của chênh lệch giá biến động |
SYMBOL_TRADE_STOPS_LEVEL | Khoảng cách tối thiểu được phép từ giá hiện tại (tính bằng điểm) để đặt Stop Loss , Take Profit và các lệnh chờ |
SYMBOL_TRADE_FREEZE_LEVEL | Khoảng cách từ giá hiện tại (tính bằng điểm) để đóng băng lệnh và vị thế |
Trong bảng trên, giá hiện tại đề cập đến giá Ask
hoặc Bid
, tùy thuộc vào bản chất của hoạt động đang được thực hiện.
Các mức bảo vệ Stop Loss
và Take Profit
chỉ ra rằng một vị thế nên được đóng. Điều này được thực hiện bằng một hoạt động ngược lại với việc mở vị thế. Do đó, đối với các lệnh mua được mở ở giá Ask
, các mức bảo vệ chỉ ra Bid
, và đối với các lệnh bán được mở ở Bid
, các mức bảo vệ chỉ ra Ask
. Khi đặt lệnh chờ, loại giá mở được chọn theo cách tiêu chuẩn: các lệnh mua (Buy Stop
, Buy Limit
, Buy Stop Limit
) dựa trên Ask
và các lệnh bán (Sell Stop
, Sell Limit
, Sell Stop Limit
) dựa trên Bid
. Xét đến các loại giá này trong bối cảnh các hoạt động giao dịch đã đề cập, khoảng cách tính bằng điểm được tính toán cho các thuộc tính SYMBOL_TRADE_STOPS_LEVEL
và SYMBOL_TRADE_FREEZE_LEVEL
.
Thuộc tính SYMBOL_TRADE_STOPS_LEVEL
, nếu khác không, sẽ vô hiệu hóa việc sửa đổi các mức Stop Loss
và Take Profit
cho một vị thế đang mở nếu mức mới sẽ gần giá hiện tại hơn khoảng cách được chỉ định. Tương tự, không thể di chuyển giá mở của một lệnh chờ gần hơn SYMBOL_TRADE_STOPS_LEVEL
điểm từ giá hiện tại.
Thuộc tính SYMBOL_TRADE_FREEZE_LEVEL
, nếu khác không, sẽ hạn chế bất kỳ hoạt động giao dịch nào cho một lệnh chờ hoặc một vị thế đang mở trong khoảng cách được chỉ định từ giá hiện tại. Đối với một lệnh chờ, việc đóng băng xảy ra khi giá mở được chỉ định nằm ở khoảng cách nhỏ hơn SYMBOL_TRADE_FREEZE_LEVEL
điểm từ giá hiện tại (một lần nữa, loại giá hiện tại là Ask
hoặc Bid
, tùy thuộc vào việc mua hay bán). Đối với một vị thế, việc đóng băng xảy ra đối với các mức Stop Loss
và Take Profit
nằm gần giá hiện tại, và do đó việc đo lường cho chúng được thực hiện cho các loại giá "ngược lại".
Nếu thuộc tính SYMBOL_SPREAD_FLOAT
là true
, thuộc tính SYMBOL_SPREAD
không phải là một phần của thông số ký hiệu mà chứa chênh lệch giá thực tế, thay đổi động với mỗi lần gọi theo điều kiện thị trường. Nó cũng có thể được tìm thấy dưới dạng sự chênh lệch giữa giá Ask
và Bid
trong cấu trúc MqlTick
bằng cách gọi SymbolInfoTick
(SymbolInfoTick).
Kịch bản SymbolFilterSpread.mq5
sẽ cho phép bạn phân tích các thuộc tính đã chỉ định. Nó định nghĩa một liệt kê tùy chỉnh ENUM_SYMBOL_INFO_INTEGER_PART
, bao gồm chỉ các thuộc tính mà chúng ta quan tâm trong bối cảnh này từ ENUM_SYMBOL_INFO_INTEGER
.
enum ENUM_SYMBOL_INFO_INTEGER_PART
{
SPREAD_FIXED = SYMBOL_SPREAD,
SPREAD_FLOAT = SYMBOL_SPREAD_FLOAT,
STOPS_LEVEL = SYMBOL_TRADE_STOPS_LEVEL,
FREEZE_LEVEL = SYMBOL_TRADE_FREEZE_LEVEL
};
2
3
4
5
6
7
Liệt kê mới định nghĩa tham số đầu vào Property
, chỉ định thuộc tính nào trong bốn thuộc tính sẽ được phân tích. Các tham số UseMarketWatch
và ShowPerSymbolDetails
kiểm soát quá trình theo cách đã biết, như trong các kịch bản thử nghiệm trước đó.
input bool UseMarketWatch = true;
input ENUM_SYMBOL_INFO_INTEGER_PART Property = SPREAD_FIXED;
input bool ShowPerSymbolDetails = true;
2
3
Để hiển thị thông tin thuận tiện cho mỗi ký hiệu (tên thuộc tính và giá trị trong mỗi dòng) bằng hàm ArrayPrint
, một cấu trúc phụ trợ SymbolDistance
được định nghĩa (chỉ được sử dụng khi ShowPerSymbolDetails
bằng true
).
struct SymbolDistance
{
string name;
int value;
};
2
3
4
5
Trong trình xử lý OnStart
, chúng ta mô tả các đối tượng và mảng cần thiết.
void OnStart()
{
SymbolFilter f; // đối tượng bộ lọc
string symbols[]; // mảng nhận cho tên
long values[]; // mảng nhận cho giá trị
SymbolDistance distances[]; // mảng để in
MapArray<long,int> stats; // bộ đếm các giá trị cụ thể của thuộc tính được chọn
...
2
3
4
5
6
7
8
Sau đó, chúng ta áp dụng bộ lọc và điền các mảng nhận với các giá trị của Property
được chỉ định đồng thời áp dụng sắp xếp.
f.select(UseMarketWatch, (ENUM_SYMBOL_INFO_INTEGER)Property, symbols, values, true);
const int n = ArraySize(symbols);
if(ShowPerSymbolDetails) ArrayResize(distances, n);
...
2
3
4
Trong một vòng lặp, chúng ta đếm thống kê và điền vào các cấu trúc SymbolDistance
, nếu cần.
for(int i = 0; i < n; ++i)
{
stats.inc(values[i]);
if(ShowPerSymbolDetails)
{
distances[i].name = symbols[i];
distances[i].value = (int)values[i];
}
}
...
2
3
4
5
6
7
8
9
10
Cuối cùng, chúng ta xuất kết quả vào nhật ký.
PrintFormat("===== Khoảng cách cho các ký hiệu %s =====",
(UseMarketWatch ? "Market Watch" : "tất cả có sẵn"));
PrintFormat("Tổng số ký hiệu: %d", n);
PrintFormat("Thống kê theo %s:", EnumToString((ENUM_SYMBOL_INFO_INTEGER)Property));
stats.print();
if(ShowPerSymbolDetails)
{
Print("Chi tiết theo ký hiệu:");
ArrayPrint(distances);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
Đây là kết quả khi bạn chạy kịch bản với cài đặt mặc định, phù hợp với phân tích chênh lệch giá.
===== Khoảng cách cho các ký hiệu Market Watch =====
Tổng số ký hiệu: 13
Thống kê theo SYMBOL_SPREAD:
[key] [value]
[0] 0 2
[1] 2 3
[2] 3 1
[3] 6 1
[4] 7 1
[5] 9 1
[6] 151 1
[7] 319 1
[8] 3356 1
[9] 3400 1
Chi tiết theo ký hiệu:
[name] [value]
[ 0] "USDJPY" 0
[ 1] "EURUSD" 0
[ 2] "USDCHF" 2
[ 3] "USDCAD" 2
[ 4] "GBPUSD" 2
[ 5] "AUDUSD" 3
[ 6] "XAUUSD" 6
[ 7] "SP500m" 7
[ 8] "NZDUSD" 9
[ 9] "USDCNH" 151
[10] "USDSEK" 319
[11] "BTCUSD" 3356
[12] "USDRUB" 3400
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
Để hiểu liệu chênh lệch giá là biến động (thay đổi động) hay cố định, hãy chạy kịch bản với cài đặt khác: Property = SPREAD_FLOAT
, ShowPerSymbolDetails = false
.
===== Khoảng cách cho các ký hiệu Market Watch =====
Tổng số ký hiệu: 13
Thống kê theo SYMBOL_SPREAD_FLOAT:
[key] [value]
[0] 1 13
2
3
4
5
Theo dữ liệu này, tất cả các ký hiệu trong tổng quan thị trường có chênh lệch giá biến động (giá trị 1 trong khóa key
là true
trong SYMBOL_SPREAD_FLOAT
). Do đó, nếu chúng ta chạy lại kịch bản nhiều lần với cài đặt mặc định, chúng ta sẽ nhận được các giá trị mới (với thị trường đang mở).