Các loại hoạt động giao dịch
Việc giao dịch được thực hiện bằng cách gửi lệnh để mở vị thế bằng hàm OrderSend()
, cũng như để đặt, sửa đổi hoặc xóa các lệnh chờ. Mỗi lệnh giao dịch đề cập đến loại hoạt động được yêu cầu. Các hoạt động giao dịch được mô tả trong bảng liệt kê ENUM_TRADE_REQUEST_ACTIONS
.
ENUM_TRADE_REQUEST_ACTIONS
Định danh | Mô tả |
---|---|
TRADE_ACTION_DEAL | Đặt lệnh giao dịch để thực hiện ngay lập tức với các tham số được chỉ định (lệnh thị trường) |
TRADE_ACTION_PENDING | Đặt lệnh giao dịch để thực hiện dưới các điều kiện được chỉ định (lệnh chờ) |
TRADE_ACTION_SLTP | Sửa đổi giá trị Stop Loss và Take Profit của một vị thế đã mở |
TRADE_ACTION_MODIFY | Sửa đổi các tham số của lệnh đã đặt trước đó |
TRADE_ACTION_REMOVE | Xóa lệnh chờ đã đặt trước đó |
TRADE_ACTION_CLOSE_BY | Đóng một vị thế bằng một vị thế ngược lại |
Ví dụ về hoạt động giao dịch TRADE_ACTION_DEAL
để mở vị thế Mua:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Mở vị thế Mua |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request={};
MqlTradeResult result={};
//--- các tham số của yêu cầu
request.action =`TRADE_ACTION_DEAL`; // loại hoạt động giao dịch
request.symbol =`Symbol`(); // biểu tượng
request.volume =0.1; // khối lượng 0.1 lot
request.type =`ORDER_TYPE_BUY`; // loại lệnh
request.price =`SymbolInfoDouble`(`Symbol`(),`SYMBOL_ASK`); // giá để mở
request.deviation=5; // độ lệch cho phép từ giá
request.magic =EXPERT_MAGIC; // MagicNumber của lệnh
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("`OrderSend` error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Ví dụ về hoạt động giao dịch TRADE_ACTION_DEAL
để mở vị thế Bán:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Mở vị thế Bán |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request={};
MqlTradeResult result={};
//--- các tham số của yêu cầu
request.action =`TRADE_ACTION_DEAL`; // loại hoạt động giao dịch
request.symbol =`Symbol`(); // biểu tượng
request.volume =0.2; // khối lượng 0.2 lot
request.type =`ORDER_TYPE_SELL`; // loại lệnh
request.price =`SymbolInfoDouble`(`Symbol`(),`SYMBOL_BID`); // giá để mở
request.deviation=5; // độ lệch cho phép từ giá
request.magic =EXPERT_MAGIC; // MagicNumber của lệnh
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("OrderSend error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Ví dụ về hoạt động giao dịch TRADE_ACTION_DEAL
để đóng các vị thế:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Đóng tất cả các vị thế |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request;
MqlTradeResult result;
int total=`PositionsTotal`(); // số lượng vị thế đang mở
//--- lặp qua tất cả các vị thế đang mở
for(int i=total-1; i>=0; i--)
{
//--- các tham số của lệnh
ulong position_ticket=`PositionGetTicket`(i); // vé của vị thế
string position_symbol=`PositionGetString`(`POSITION_SYMBOL`); // biểu tượng
int digits=(int)`SymbolInfoInteger`(position_symbol,`SYMBOL_DIGITS`); // số chữ số thập phân
ulong magic=`PositionGetInteger`(`POSITION_MAGIC`); // MagicNumber của vị thế
double volume=`PositionGetDouble`(`POSITION_VOLUME`); // khối lượng của vị thế
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)`PositionGetInteger`(`POSITION_TYPE`); // loại của vị thế
//--- xuất thông tin về vị thế
`PrintFormat`("#%I64u %s %s %.2f %s [%I64d]",
position_ticket,
position_symbol,
`EnumToString`(type),
volume,
`DoubleToString`(`PositionGetDouble`(`POSITION_PRICE_OPEN`),digits),
magic);
//--- nếu MagicNumber khớp
if(magic==EXPERT_MAGIC)
{
//--- xóa các giá trị yêu cầu và kết quả
`ZeroMemory`(request);
`ZeroMemory`(result);
//--- thiết lập các tham số hoạt động
request.action =`TRADE_ACTION_DEAL`; // loại hoạt động giao dịch
request.position =position_ticket; // vé của vị thế
request.symbol =position_symbol; // biểu tượng
request.volume =volume; // khối lượng của vị thế
request.deviation=5; // độ lệch cho phép từ giá
request.magic =EXPERT_MAGIC; // MagicNumber của vị thế
//--- thiết lập giá và loại lệnh tùy thuộc vào loại vị thế
if(type==`POSITION_TYPE_BUY`)
{
request.price=`SymbolInfoDouble`(position_symbol,`SYMBOL_BID`);
request.type =`ORDER_TYPE_SELL`;
}
else
{
request.price=`SymbolInfoDouble`(position_symbol,`SYMBOL_ASK`);
request.type =`ORDER_TYPE_BUY`;
}
//--- xuất thông tin về việc đóng
`PrintFormat`("Close #%I64d %s %s",position_ticket,position_symbol,`EnumToString`(type));
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("OrderSend error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//---
}
}
}
//+------------------------------------------------------------------+
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Ví dụ về hoạt động giao dịch TRADE_ACTION_PENDING
để đặt lệnh chờ:
#property description "Ví dụ về việc đặt lệnh chờ"
#property script_show_inputs
#define EXPERT_MAGIC 123456 // MagicNumber của expert
input ENUM_ORDER_TYPE orderType=`ORDER_TYPE_BUY_LIMIT`; // loại lệnh
//+------------------------------------------------------------------+
//| Đặt lệnh chờ |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request={};
MqlTradeResult result={};
//--- các tham số để đặt lệnh chờ
request.action =`TRADE_ACTION_PENDING`; // loại hoạt động giao dịch
request.symbol =`Symbol`(); // biểu tượng
request.volume =0.1; // khối lượng 0.1 lot
request.deviation=2; // độ lệch cho phép từ giá
request.magic =EXPERT_MAGIC; // MagicNumber của lệnh
int offset = 50; // khoảng cách từ giá hiện tại để đặt lệnh, tính bằng điểm
double price; // giá kích hoạt lệnh
double point=`SymbolInfoDouble`(_Symbol,`SYMBOL_POINT`); // giá trị của điểm
int digits=`SymbolInfoInteger`(_Symbol,`SYMBOL_DIGITS`); // số chữ số thập phân (độ chính xác)
//--- kiểm tra loại hoạt động
if(`orderType`==`ORDER_TYPE_BUY_LIMIT`)
{
request.type =`ORDER_TYPE_BUY_LIMIT`; // loại lệnh
price=`SymbolInfoDouble`(`Symbol`(),`SYMBOL_ASK`)-offset*point; // giá để mở
request.price =`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
else if(`orderType`==`ORDER_TYPE_SELL_LIMIT`)
{
request.type =`ORDER_TYPE_SELL_LIMIT`; // loại lệnh
price=`SymbolInfoDouble`(`Symbol`(),`SYMBOL_ASK`)+offset*point; // giá để mở
request.price =`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
else if(`orderType`==`ORDER_TYPE_BUY_STOP`)
{
request.type =`ORDER_TYPE_BUY_STOP`; // loại lệnh
price =`SymbolInfoDouble`(`Symbol`(),`SYMBOL_ASK`)+offset*point; // giá để mở
request.price=`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
else if(`orderType`==`ORDER_TYPE_SELL_STOP`)
{
request.type =`ORDER_TYPE_SELL_STOP`; // loại lệnh
price=`SymbolInfoDouble`(`Symbol`(),`SYMBOL_ASK`)-offset*point; // giá để mở
request.price =`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
else `Alert`("Ví dụ này chỉ dành cho việc đặt lệnh chờ"); // nếu không chọn lệnh chờ
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("OrderSend error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
//+------------------------------------------------------------------+
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Ví dụ về hoạt động giao dịch TRADE_ACTION_SLTP
để sửa đổi giá trị Stop Loss và Take Profit của một vị thế đang mở:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Sửa đổi Stop Loss và Take Profit của vị thế |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request;
MqlTradeResult result;
int total=`PositionsTotal`(); // số lượng vị thế đang mở
//--- lặp qua tất cả các vị thế đang mở
for(int i=0; i<total; i++)
{
//--- các tham số của lệnh
ulong position_ticket=`PositionGetTicket`(i); // vé của vị thế
string position_symbol=`PositionGetString`(`POSITION_SYMBOL`); // biểu tượng
int digits=(int)`SymbolInfoInteger`(position_symbol,`SYMBOL_DIGITS`); // số chữ số thập phân
ulong magic=`PositionGetInteger`(`POSITION_MAGIC`); // MagicNumber của vị thế
double volume=`PositionGetDouble`(`POSITION_VOLUME`); // khối lượng của vị thế
double sl=`PositionGetDouble`(`POSITION_SL`); // Stop Loss của vị thế
double tp=`PositionGetDouble`(`POSITION_TP`); // Take Profit của vị thế
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)`PositionGetInteger`(`POSITION_TYPE`); // loại của vị thế
//--- xuất thông tin về vị thế
`PrintFormat`("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
position_ticket,
position_symbol,
`EnumToString`(type),
volume,
`DoubleToString`(`PositionGetDouble`(`POSITION_PRICE_OPEN`),digits),
`DoubleToString`(sl,digits),
`DoubleToString`(tp,digits),
magic);
//--- nếu MagicNumber khớp, Stop Loss và Take Profit chưa được xác định
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
//--- tính toán các mức giá hiện tại
double price=`PositionGetDouble`(`POSITION_PRICE_OPEN`);
double bid=`SymbolInfoDouble`(position_symbol,`SYMBOL_BID`);
double ask=`SymbolInfoDouble`(position_symbol,`SYMBOL_ASK`);
int stop_level=(int)`SymbolInfoInteger`(position_symbol,`SYMBOL_TRADE_STOPS_LEVEL`);
double price_level;
//--- nếu khoảng cách tối thiểu cho phép tính bằng điểm từ giá đóng hiện tại không được thiết lập
if(stop_level<=0)
stop_level=150; // thiết lập khoảng cách 150 điểm từ giá đóng hiện tại
else
stop_level+=50; // thiết lập khoảng cách thành (`SYMBOL_TRADE_STOPS_LEVEL` + 50) điểm để đảm bảo
//--- tính toán và làm tròn giá trị Stop Loss và Take Profit
price_level=stop_level*`SymbolInfoDouble`(position_symbol,`SYMBOL_POINT`);
if(type==`POSITION_TYPE_BUY`)
{
sl=`NormalizeDouble`(bid-price_level,digits);
tp=`NormalizeDouble`(ask+price_level,digits);
}
else
{
sl=`NormalizeDouble`(ask+price_level,digits);
tp=`NormalizeDouble`(bid-price_level,digits);
}
//--- xóa các giá trị yêu cầu và kết quả
`ZeroMemory`(request);
`ZeroMemory`(result);
//--- thiết lập các tham số hoạt động
request.action =`TRADE_ACTION_SLTP`; // loại hoạt động giao dịch
request.position=position_ticket; // vé của vị thế
request.symbol=position_symbol; // biểu tượng
request.sl =sl; // Stop Loss của vị thế
request.tp =tp; // Take Profit của vị thế
request.magic=EXPERT_MAGIC; // MagicNumber của vị thế
//--- xuất thông tin về việc sửa đổi
`PrintFormat`("Modify #%I64d %s %s",position_ticket,position_symbol,`EnumToString`(type));
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("OrderSend error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
//+------------------------------------------------------------------+
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Ví dụ về hoạt động giao dịch TRADE_ACTION_MODIFY
để sửa đổi mức giá của các lệnh chờ:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Sửa đổi các lệnh chờ |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request={};
MqlTradeResult result={};
int total=`OrdersTotal`(); // tổng số lệnh chờ đã đặt
//--- lặp qua tất cả các lệnh chờ đã đặt
for(int i=0; i<total; i++)
{
//--- các tham số của lệnh
ulong order_ticket=`OrderGetTicket`(i); // vé của lệnh
string order_symbol=`Symbol`(); // biểu tượng
int digits=(int)`SymbolInfoInteger`(order_symbol,`SYMBOL_DIGITS`); // số chữ số thập phân
ulong magic=`OrderGetInteger`(`ORDER_MAGIC`); // MagicNumber của lệnh
double volume=`OrderGetDouble`(`ORDER_VOLUME_CURRENT`); // khối lượng hiện tại của lệnh
double sl=`OrderGetDouble`(`ORDER_SL`); // Stop Loss hiện tại của lệnh
double tp=`OrderGetDouble`(`ORDER_TP`); // Take Profit hiện tại của lệnh
ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)`OrderGetInteger`(`ORDER_TYPE`); // loại của lệnh
int offset = 50; // khoảng cách từ giá hiện tại để đặt lệnh, tính bằng điểm
double price; // giá kích hoạt lệnh
double point=`SymbolInfoDouble`(order_symbol,`SYMBOL_POINT`); // giá trị của điểm
//--- xuất thông tin về lệnh
`PrintFormat`("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
`EnumToString`(type),
volume,
`DoubleToString`(`PositionGetDouble`(`POSITION_PRICE_OPEN`),digits),
`DoubleToString`(sl,digits),
`DoubleToString`(tp,digits),
magic);
//--- nếu MagicNumber khớp, Stop Loss và Take Profit chưa được xác định
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=`TRADE_ACTION_MODIFY`; // loại hoạt động giao dịch
request.order = `OrderGetTicket`(i); // vé của lệnh
request.symbol =`Symbol`(); // biểu tượng
request.deviation=5; // độ lệch cho phép từ giá
//--- thiết lập mức giá, Take Profit và Stop Loss của lệnh tùy thuộc vào loại của nó
if(type==`ORDER_TYPE_BUY_LIMIT`)
{
price = `SymbolInfoDouble`(`Symbol`(),`SYMBOL_ASK`)-offset*point;
request.tp = `NormalizeDouble`(price+offset*point,digits);
request.sl = `NormalizeDouble`(price-offset*point,digits);
request.price =`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
else if(type==`ORDER_TYPE_SELL_LIMIT`)
{
price = `SymbolInfoDouble`(`Symbol`(),`SYMBOL_BID`)+offset*point;
request.tp = `NormalizeDouble`(price-offset*point,digits);
request.sl = `NormalizeDouble`(price+offset*point,digits);
request.price =`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
else if(type==`ORDER_TYPE_BUY_STOP`)
{
price = `SymbolInfoDouble`(`Symbol`(),`SYMBOL_BID`)+offset*point;
request.tp = `NormalizeDouble`(price+offset*point,digits);
request.sl = `NormalizeDouble`(price-offset*point,digits);
request.price =`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
else if(type==`ORDER_TYPE_SELL_STOP`)
{
price = `SymbolInfoDouble`(`Symbol`(),`SYMBOL_ASK`)-offset*point;
request.tp = `NormalizeDouble`(price-offset*point,digits);
request.sl = `NormalizeDouble`(price+offset*point,digits);
request.price =`NormalizeDouble`(price,digits); // giá mở chuẩn hóa
}
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("OrderSend error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- xóa các giá trị yêu cầu và kết quả
`ZeroMemory`(request);
`ZeroMemory`(result);
}
}
}
//+------------------------------------------------------------------+
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Ví dụ về hoạt động giao dịch TRADE_ACTION_REMOVE
để xóa các lệnh chờ:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Xóa các lệnh chờ |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request={};
MqlTradeResult result={};
int total=`OrdersTotal`(); // tổng số lệnh chờ đã đặt
//--- lặp qua tất cả các lệnh chờ đã đặt
for(int i=total-1; i>=0; i--)
{
ulong order_ticket=`OrderGetTicket`(i); // vé của lệnh
ulong magic=`OrderGetInteger`(`ORDER_MAGIC`); // MagicNumber của lệnh
//--- nếu MagicNumber khớp
if(magic==EXPERT_MAGIC)
{
//--- xóa các giá trị yêu cầu và kết quả
`ZeroMemory`(request);
`ZeroMemory`(result);
//--- thiết lập các tham số hoạt động
request.action=`TRADE_ACTION_REMOVE`; // loại hoạt động giao dịch
request.order = order_ticket; // vé của lệnh
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("OrderSend error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
//+------------------------------------------------------------------+
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
32
33
Ví dụ về hoạt động giao dịch TRADE_ACTION_CLOSE_BY
để đóng các vị thế bằng các vị thế ngược lại:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Đóng tất cả các vị thế bằng các vị thế ngược lại |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo và khởi tạo yêu cầu giao dịch và kết quả của yêu cầu giao dịch
MqlTradeRequest request;
MqlTradeResult result;
int total=`PositionsTotal`(); // số lượng vị thế đang mở
//--- lặp qua tất cả các vị thế đang mở
for(int i=total-1; i>=0; i--)
{
//--- các tham số của lệnh
ulong position_ticket=`PositionGetTicket`(i); // vé của vị thế
string position_symbol=`PositionGetString`(`POSITION_SYMBOL`); // biểu tượng
int digits=(int)`SymbolInfoInteger`(position_symbol,`SYMBOL_DIGITS`); // vé của vị thế
ulong magic=`PositionGetInteger`(`POSITION_MAGIC`); // MagicNumber của vị thế
double volume=`PositionGetDouble`(`POSITION_VOLUME`); // khối lượng của vị thế
double sl=`PositionGetDouble`(`POSITION_SL`); // Stop Loss của vị thế
double tp=`PositionGetDouble`(`POSITION_TP`); // Take Profit của vị thế
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)`PositionGetInteger`(`POSITION_TYPE`); // loại của vị thế
//--- xuất thông tin về vị thế
`PrintFormat`("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
position_ticket,
position_symbol,
`EnumToString`(type),
volume,
`DoubleToString`(`PositionGetDouble`(`POSITION_PRICE_OPEN`),digits),
`DoubleToString`(sl,digits),
`DoubleToString`(tp,digits),
magic);
//--- nếu MagicNumber khớp
if(magic==EXPERT_MAGIC)
{
for(int j=0; j<i; j++)
{
string symbol=`PositionGetSymbol`(j); // biểu tượng của vị thế ngược lại
//--- nếu biểu tượng của vị thế ngược và vị thế ban đầu khớp
if(symbol==position_symbol && `PositionGetInteger`(`POSITION_MAGIC`)==EXPERT_MAGIC)
{
//--- thiết lập loại của vị thế ngược lại
ENUM_POSITION_TYPE type_by=(ENUM_POSITION_TYPE)`PositionGetInteger`(`POSITION_TYPE`);
//--- thoát ra, nếu loại của vị thế ban đầu và vị thế ngược lại khớp
if(type==type_by)
continue;
//--- xóa các giá trị yêu cầu và kết quả
`ZeroMemory`(request);
`ZeroMemory`(result);
//--- thiết lập các tham số hoạt động
request.action=`TRADE_ACTION_CLOSE_BY`; // loại hoạt động giao dịch
request.position=position_ticket; // vé của vị thế
request.position_by=`PositionGetInteger`(`POSITION_TICKET`); // vé của vị thế ngược lại
//request.symbol =position_symbol;
request.magic=EXPERT_MAGIC; // MagicNumber của vị thế
//--- xuất thông tin về việc đóng bằng vị thế ngược lại
`PrintFormat`("Close #%I64d %s %s by #%I64d",position_ticket,position_symbol,`EnumToString`(type),request.position_by);
//--- gửi yêu cầu
if(!`OrderSend`(request,result))
`PrintFormat`("OrderSend error %d",`GetLastError`()); // nếu không thể gửi yêu cầu, xuất mã lỗi
//--- thông tin về hoạt động
`PrintFormat`("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
}
}
}
}
}
//+------------------------------------------------------------------+
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69