Độ sâu thị trường
Khi nói đến các công cụ giao dịch trên sàn, MetaTrader 5 cho phép bạn không chỉ lấy thông tin giá và khối lượng được đóng gói trong tick, mà còn cả Độ sâu thị trường (sổ lệnh, giá cấp II), tức là phân bố khối lượng trong các lệnh mua và bán đã đặt tại một vài mức giá gần nhất xung quanh giá hiện tại. Một trong những thuộc tính số nguyên của ký hiệu SYMBOL_TICKS_BOOKDEPTH
chứa số lượng mức tối đa được hiển thị trong Độ sâu thị trường. Số lượng này được phép cho mỗi bên, nghĩa là tổng kích thước của sổ lệnh có thể lớn gấp đôi (và điều này không tính đến các mức giá có khối lượng bằng 0 không được truyền tải).
Tùy thuộc vào tình hình thị trường, kích thước thực tế của sổ lệnh được truyền tải có thể nhỏ hơn so với giá trị được chỉ định trong thuộc tính này. Đối với các công cụ không giao dịch trên sàn, thuộc tính này thường bằng 0, mặc dù một số nhà môi giới có thể truyền tải sổ lệnh cho các ký hiệu Forex, chỉ giới hạn bởi các lệnh của khách hàng của họ.
Chính sổ lệnh và thông báo về cập nhật của nó phải được yêu cầu bởi chương trình MQL quan tâm thông qua một API đặc biệt, mà chúng ta sẽ thảo luận trong chương tiếp theo.
Cần lưu ý rằng do các đặc điểm kiến trúc của nền tảng, thuộc tính này không liên quan trực tiếp đến việc truyền tải sổ lệnh, tức là nó chỉ là một trường thông số được nhà môi giới điền vào. Nói cách khác, giá trị khác 0 của thuộc tính không có nghĩa là sổ lệnh sẽ chắc chắn đến được terminal trong một thị trường mở. Điều này phụ thuộc vào các cài đặt khác của máy chủ và liệu nó có kết nối hoạt động với nhà cung cấp dữ liệu hay không.
Hãy thử lấy thống kê về độ sâu thị trường cho tất cả hoặc các ký hiệu được chọn bằng kịch bản SymbolFilterBookDepth.mq5
.
input bool UseMarketWatch = false;
input int ShowSymbolsWithDepth = -1;
2
Tham số ShowSymbolsWithDepth
, mặc định bằng -1, hướng dẫn thu thập thống kê về các cài đặt Độ sâu thị trường khác nhau giữa tất cả các ký hiệu. Nếu bạn đặt tham số này thành một giá trị khác, chương trình sẽ cố gắng tìm tất cả các ký hiệu có độ sâu sổ lệnh được chỉ định.
void OnStart()
{
SymbolFilter f; // đối tượng bộ lọc
string symbols[]; // mảng cho tên ký hiệu
long depths[]; // mảng giá trị thuộc tính
MapArray<long,int> stats; // bộ đếm số lần xuất hiện của mỗi độ sâu
if(ShowSymbolsWithDepth > -1)
{
f.let(SYMBOL_TICKS_BOOKDEPTH, ShowSymbolsWithDepth);
}
// áp dụng bộ lọc và điền mảng
f.select(UseMarketWatch, SYMBOL_TICKS_BOOKDEPTH, symbols, depths, true);
const int n = ArraySize(symbols);
PrintFormat("===== Độ sâu sổ lệnh cho các ký hiệu %s %s=====",
(UseMarketWatch ? "Market Watch" : "tất cả có sẵn"),
(ShowSymbolsWithDepth > -1 ? "(lọc theo độ sâu=" + (string)ShowSymbolsWithDepth + ") " : ""));
PrintFormat("Tổng số ký hiệu: %d", n);
...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Nếu một độ sâu cụ thể được đưa ra, chúng ta chỉ cần xuất mảng các ký hiệu (tất cả đều thỏa mãn điều kiện bộ lọc) và thoát.
if(ShowSymbolsWithDepth > -1)
{
ArrayPrint(symbols);
return;
}
...
2
3
4
5
6
Ngược lại, chúng ta tính toán thống kê và hiển thị chúng.
for(int i = 0; i < n; ++i)
{
stats.inc(depths[i]);
}
Print("Thống kê theo độ sâu:");
stats.print();
Print("Chú thích: key=độ sâu, value=số lượng");
}
2
3
4
5
6
7
8
9
Với cài đặt mặc định, chúng ta có thể nhận được bức tranh sau.
===== Độ sâu sổ lệnh cho tất cả các ký hiệu có sẵn =====
Tổng số ký hiệu: 52357
Thống kê theo độ sâu:
[key] [value]
[0] 0 52244
[1] 5 3
[2] 10 67
[3] 16 5
[4] 20 13
[5] 32 25
Chú thích: key=độ sâu, value=số lượng
2
3
4
5
6
7
8
9
10
11
Nếu bạn đặt ShowSymbolsWithDepth
thành một trong những giá trị phát hiện được, ví dụ, 32, chúng ta nhận được danh sách các ký hiệu có độ sâu sổ lệnh này.
===== Độ sâu sổ lệnh cho tất cả các ký hiệu có sẵn (lọc theo độ sâu=32) =====
Tổng số ký hiệu: 25
[ 0] "USDCNH" "USDZAR" "USDHUF" "USDPLN" "EURHUF" "EURNOK" "EURPLN" "EURSEK" "EURZAR" "GBPNOK" "GBPPLN" "GBPSEK" "GBPZAR"
[13] "NZDCAD" "NZDCHF" "USDMXN" "EURMXN" "GBPMXN" "CADMXN" "CHFMXN" "MXNJPY" "NZDMXN" "USDCOP" "USDARS" "USDCLP"
2
3
4