Lấy kích thước swap
Để triển khai các chiến lược trung hạn và dài hạn, kích thước swap trở nên quan trọng vì chúng có thể gây ảnh hưởng đáng kể, thường là tiêu cực, đến kết quả tài chính. Tuy nhiên, một số độc giả có thể là fan của chiến lược "Carry Trade", vốn ban đầu được xây dựng để kiếm lợi từ các swap dương. MQL5 có một số thuộc tính ký hiệu cung cấp quyền truy cập vào các chuỗi thông số liên quan đến swap.
Định danh | Mô tả |
---|---|
SYMBOL_SWAP_MODE | Mô hình tính toán swap ENUM_SYMBOL_SWAP_MODE |
SYMBOL_SWAP_ROLLOVER3DAYS | Ngày trong tuần để tính swap gấp ba lần ENUM_DAY_OF_WEEK |
SYMBOL_SWAP_LONG | Kích thước swap cho vị thế mua |
SYMBOL_SWAP_SHORT | Kích thước swap cho vị thế bán |
Liệt kê ENUM_SYMBOL_SWAP_MODE
chứa các phần tử chỉ định các tùy chọn cho đơn vị đo lường và nguyên tắc tính toán swap. Cũng như SYMBOL_SWAP_ROLLOVER3DAYS
, chúng đề cập đến các thuộc tính số nguyên của ENUM_SYMBOL_INFO_INTEGER
.
Kích thước swap được chỉ định trực tiếp trong các thuộc tính SYMBOL_SWAP_LONG
và SYMBOL_SWAP_SHORT
như một phần của ENUM_SYMBOL_INFO_DOUBLE
, tức là thuộc loại double
.
Dưới đây là các phần tử của ENUM_SYMBOL_SWAP_MODE
.
Định danh | Mô tả |
---|---|
SYMBOL_SWAP_MODE_DISABLED | Không có swap |
SYMBOL_SWAP_MODE_POINTS | Điểm |
SYMBOL_SWAP_MODE_CURRENCY_SYMBOL | Đồng tiền cơ bản của ký hiệu |
SYMBOL_SWAP_MODE_CURRENCY_MARGIN | Đồng tiền ký quỹ của ký hiệu |
SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT | Đồng tiền gửi |
SYMBOL_SWAP_MODE_INTEREST_CURRENT | Phần trăm hàng năm của giá công cụ tại thời điểm tính swap |
SYMBOL_SWAP_MODE_INTEREST_OPEN | Phần trăm hàng năm của giá mở vị thế ký hiệu |
SYMBOL_SWAP_MODE_REOPEN_CURRENT | Điểm (với việc mở lại vị thế tại giá đóng cửa) |
SYMBOL_SWAP_MODE_REOPEN_BID | Điểm (với việc mở lại vị thế tại giá Bid của ngày mới) (trong các tham số SYMBOL_SWAP_LONG và SYMBOL_SWAP_SHORT ) |
Đối với các tùy chọn SYMBOL_SWAP_MODE_INTEREST_CURRENT
và SYMBOL_SWAP_MODE_INTEREST_OPEN
, được giả định có 360 ngày ngân hàng trong một năm.
Đối với các tùy chọn SYMBOL_SWAP_MODE_REOPEN_CURRENT
và SYMBOL_SWAP_MODE_REOPEN_BID
, vị thế bị đóng buộc vào cuối ngày giao dịch, sau đó hành vi của chúng khác nhau.
Với SYMBOL_SWAP_MODE_REOPEN_CURRENT
, vị thế được mở lại vào ngày tiếp theo tại giá đóng cửa hôm qua +/- số điểm được chỉ định. Với SYMBOL_SWAP_MODE_REOPEN_BID
, vị thế được mở lại vào ngày tiếp theo tại giá Bid hiện tại +/- số điểm được chỉ định. Trong cả hai trường hợp, số điểm nằm trong các tham số SYMBOL_SWAP_LONG
và SYMBOL_SWAP_SHORT
.
Hãy kiểm tra hoạt động của các thuộc tính bằng kịch bản SymbolFilterSwap.mq5
. Trong các tham số đầu vào, chúng ta cung cấp lựa chọn bối cảnh phân tích: Market Watch
hoặc tất cả các ký hiệu tùy thuộc vào UseMarketWatch
. Khi tham số ShowPerSymbolDetails
là false
, chúng ta sẽ tính toán thống kê, bao nhiêu lần một chế độ nào đó từ ENUM_SYMBOL_SWAP_MODE
được sử dụng trong các ký hiệu. Khi tham số ShowPerSymbolDetails
là true
, chúng ta sẽ xuất một mảng của tất cả các ký hiệu với chế độ được chỉ định trong mode
, và sắp xếp mảng theo thứ tự giảm dần của các giá trị trong các trường SYMBOL_SWAP_LONG
và SYMBOL_SWAP_SHORT
.
input bool UseMarketWatch = true;
input bool ShowPerSymbolDetails = false;
input ENUM_SYMBOL_SWAP_MODE Mode = SYMBOL_SWAP_MODE_POINTS;
2
3
Đối với các phần tử của mảng kết hợp của swap, chúng ta mô tả cấu trúc SymbolSwap
với tên ký hiệu và giá trị swap. Hướng của swap sẽ được biểu thị bằng tiền tố trong trường tên: "+" cho swap của các vị thế mua, "-" cho swap của các vị thế bán.
struct SymbolSwap
{
string name;
double value;
};
2
3
4
5
Theo truyền thống, chúng ta mô tả đối tượng bộ lọc ở đầu OnStart
. Tuy nhiên, đoạn mã sau khác biệt đáng kể tùy thuộc vào giá trị của biến ShowPerSymbolDetails
.
void OnStart()
{
SymbolFilter f; // đối tượng bộ lọc
PrintFormat("===== Chế độ swap cho các ký hiệu %s =====",
(UseMarketWatch ? "Market Watch" : "tất cả có sẵn"));
if(ShowPerSymbolDetails)
{
// bảng tổng hợp của swap của Mode được chọn
...
}
else
{
// tính toán thống kê chế độ
...
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Hãy giới thiệu nhánh thứ hai trước. Ở đây chúng ta điền các mảng với tên ký hiệu bằng bộ lọc (symbols
) và các chế độ swap (values
) được lấy từ thuộc tính SYMBOL_SWAP_MODE
. Các giá trị kết quả được tích lũy trong một bản đồ mảng MapArray<ENUM_SYMBOL_SWAP_MODE,int> stats
.
// tính toán thống kê chế độ
string symbols[];
long values[];
MapArray<ENUM_SYMBOL_SWAP_MODE,int> stats; // bộ đếm cho mỗi chế độ
// áp dụng bộ lọc và thu thập giá trị chế độ
f.select(UseMarketWatch, SYMBOL_SWAP_MODE, symbols, values);
const int n = ArraySize(symbols);
for(int i = 0; i < n; ++i)
{
stats.inc((ENUM_SYMBOL_SWAP_MODE)values[i]);
}
...
2
3
4
5
6
7
8
9
10
11
12
Tiếp theo, chúng ta hiển thị thống kê đã thu thập.
PrintFormat("Tổng số ký hiệu: %d", n);
Print("Thống kê theo chế độ swap:");
stats.print();
Print("Chú thích: key=chế độ swap, value=số lượng");
for(int i = 0; i < stats.getSize(); ++i)
{
PrintFormat("%d -> %s", stats.getKey(i), EnumToString(stats.getKey(i)));
}
2
3
4
5
6
7
8
Đối với trường hợp xây dựng bảng với các giá trị swap, thuật toán như sau. Swap cho các vị thế mua và bán được yêu cầu riêng lẻ, vì vậy chúng ta định nghĩa các mảng cặp cho tên và giá trị. Chúng sẽ được kết hợp lại trong mảng cấu trúc swaps
.
// bảng tổng hợp của swap của Mode được chọn
string buyers[], sellers[]; // mảng cho tên
double longs[], shorts[]; // mảng cho giá trị swap
SymbolSwap swaps[]; // mảng tổng để in
2
3
4
Đặt điều kiện cho chế độ swap được chọn trong bộ lọc. Điều này cần thiết để có thể so sánh và sắp xếp các phần tử mảng.
f.let(SYMBOL_SWAP_MODE, Mode);
Sau đó, chúng ta áp dụng bộ lọc hai lần cho các thuộc tính khác nhau (SYMBOL_SWAP_LONG
, SYMBOL_SWAP_SHORT
) và điền các mảng khác nhau với giá trị của chúng (longs
, shorts
). Trong mỗi lần gọi, các mảng được sắp xếp theo thứ tự tăng dần.
f.select(UseMarketWatch, SYMBOL_SWAP_LONG, buyers, longs, true);
f.select(UseMarketWatch, SYMBOL_SWAP_SHORT, sellers, shorts, true);
2
Về lý thuyết, kích thước của các mảng nên giống nhau, vì điều kiện bộ lọc là như nhau, nhưng để rõ ràng, hãy phân bổ một biến cho mỗi kích thước. Vì mỗi ký hiệu sẽ xuất hiện trong bảng kết quả hai lần, cho phía mua và bán, chúng ta cung cấp kích thước gấp đôi cho mảng swaps
.
const int l = ArraySize(longs);
const int s = ArraySize(shorts);
const int n = ArrayResize(swaps, l + s); // nên là l == s
PrintFormat("Tổng số ký hiệu với %s: %d", EnumToString(Mode), l);
2
3
4
Tiếp theo, chúng ta ghép hai mảng longs
và shorts
, xử lý chúng theo thứ tự ngược lại, vì chúng ta cần sắp xếp từ giá trị dương đến âm.
if(n > 0)
{
int i = l - 1, j = s - 1, k = 0;
while(k < n)
{
const double swapLong = i >= 0 ? longs[i] : -DBL_MAX;
const double swapShort = j >= 0 ? shorts[j] : -DBL_MAX;
if(swapLong >= swapShort)
{
swaps[k].name = "+" + buyers[i];
swaps[k].value = longs[i];
--i;
++k;
}
else
{
swaps[k].name = "-" + sellers[j];
swaps[k].value = shorts[j];
--j;
++k;
}
}
Print("Swap theo ký hiệu (đã sắp xếp):");
ArrayPrint(swaps);
}
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
Thật thú vị khi chạy kịch bản nhiều lần với các cài đặt khác nhau. Ví dụ, với cài đặt mặc định, chúng ta có thể nhận được kết quả sau.
===== Chế độ swap cho các ký hiệu Market Watch =====
Tổng số ký hiệu: 13
Thống kê theo chế độ swap:
[key] [value]
[0] 1 10
[1] 0 2
[2] 2 1
Chú thích: key=chế độ swap, value=số lượng
1 -> SYMBOL_SWAP_MODE_POINTS
0 -> SYMBOL_SWAP_MODE_DISABLED
2 -> SYMBOL_SWAP_MODE_CURRENCY_SYMBOL
2
3
4
5
6
7
8
9
10
11
Thống kê này cho thấy 10 ký hiệu có chế độ swap SYMBOL_SWAP_MODE_POINTS
, hai ký hiệu có swap bị vô hiệu hóa, SYMBOL_SWAP_MODE_DISABLED
, và một ký hiệu ở đồng tiền cơ bản SYMBOL_SWAP_MODE_CURRENCY_SYMBOL
.
Hãy tìm hiểu xem các ký hiệu nào có SYMBOL_SWAP_MODE_POINTS
và tìm hiểu swap của chúng. Để làm điều này, chúng ta sẽ đặt ShowPerSymbolDetails
thành true
(tham số mode
đã được đặt thành SYMBOL_SWAP_MODE_POINTS
).
===== Chế độ swap cho các ký hiệu Market Watch =====
Tổng số ký hiệu với SYMBOL_SWAP_MODE_POINTS: 10
Swap theo ký hiệu (đã sắp xếp):
[name] [value]
[ 0] "+AUDUSD" 6.30000
[ 1] "+NZDUSD" 2.80000
[ 2] "+USDCHF" 0.10000
[ 3] "+USDRUB" 0.00000
[ 4] "-USDRUB" 0.00000
[ 5] "+USDJPY" -0.10000
[ 6] "+GBPUSD" -0.20000
[ 7] "-USDCAD" -0.40000
[ 8] "-USDJPY" -0.60000
[ 9] "+EURUSD" -0.70000
[10] "+USDCAD" -0.80000
[11] "-EURUSD" -1.00000
[12] "-USDCHF" -1.00000
[13] "-GBPUSD" -2.20000
[14] "+USDSEK" -4.50000
[15] "-XAUUSD" -4.60000
[16] "-USDSEK" -4.90000
[17] "-NZDUSD" -6.70000
[18] "+XAUUSD" -12.60000
[19] "-AUDUSD" -14.80000
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Bạn có thể so sánh các giá trị với thông số ký hiệu.
Cuối cùng, chúng ta thay đổi Mode
thành SYMBOL_SWAP_MODE_CURRENCY_SYMBOL
. Trong trường hợp của chúng ta, chúng ta nên nhận được một ký hiệu, nhưng được chia thành hai dòng: với dấu cộng và dấu trừ trong tên.
===== Chế độ swap cho các ký hiệu Market Watch =====
Tổng số ký hiệu với SYMBOL_SWAP_MODE_CURRENCY_SYMBOL: 1
Swap theo ký hiệu (đã sắp xếp):
[name] [value]
[0] "-SP500m" -35.00000
[1] "+SP500m" -41.41000
2
3
4
5
6
Từ bảng, cả hai swap đều âm.