Cấu trúc Yêu cầu Giao dịch (MqlTradeRequest)
Tương tác giữa terminal của khách hàng và máy chủ giao dịch để thực hiện thao tác đặt lệnh được thực hiện bằng cách sử dụng các yêu cầu giao dịch. Yêu cầu giao dịch được biểu diễn bởi cấu trúc đặc biệt được định nghĩa trước kiểu MqlTradeRequest
, chứa tất cả các trường cần thiết để thực hiện các giao dịch. Kết quả xử lý yêu cầu được biểu diễn bởi cấu trúc kiểu MqlTradeResult.
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Kiểu thao tác giao dịch
ulong magic; // ID của Expert Advisor (số ma thuật)
ulong order; // Vé lệnh
string symbol; // Ký hiệu giao dịch
double volume; // Khối lượng yêu cầu cho giao dịch tính bằng lot
double price; // Giá
double stoplimit; // Mức StopLimit của lệnh
double sl; // Mức Stop Loss của lệnh
double tp; // Mức Take Profit của lệnh
ulong deviation; // Độ lệch tối đa có thể từ giá yêu cầu
ENUM_ORDER_TYPE type; // Kiểu lệnh
ENUM_ORDER_TYPE_FILLING type_filling; // Kiểu thực hiện lệnh
ENUM_ORDER_TYPE_TIME type_time; // Kiểu hết hạn của lệnh
datetime expiration; // Thời gian hết hạn của lệnh (dành cho lệnh kiểu ORDER_TIME_SPECIFIED)
string comment; // Ghi chú của lệnh
ulong position; // Vé vị thế
ulong position_by; // Vé của vị thế đối lập
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Mô tả các trường
Trường | Mô tả |
---|---|
action | Kiểu thao tác giao dịch. Có thể là một trong các giá trị của liệt kê ENUM_TRADE_REQUEST_ACTIONS. |
magic | ID của Expert Advisor. Nó cho phép tổ chức xử lý phân tích các lệnh giao dịch. Mỗi Expert Advisor có thể đặt ID duy nhất của riêng mình khi gửi yêu cầu giao dịch. |
order | Vé lệnh. Được sử dụng để sửa đổi các lệnh chờ. |
symbol | Ký hiệu của lệnh. Không cần thiết cho việc sửa đổi lệnh hoặc đóng vị thế. |
volume | Khối lượng yêu cầu của lệnh tính bằng lot. Lưu ý rằng khối lượng thực tế của giao dịch sẽ phụ thuộc vào kiểu thực hiện lệnh. |
price | Giá mà lệnh phải được thực hiện khi đạt tới. Các lệnh thị trường của các ký hiệu có kiểu thực hiện là "Thực hiện Thị trường" (SYMBOL_TRADE_EXECUTION_MARKET), thuộc kiểu TRADE_ACTION_DEAL, không yêu cầu chỉ định giá. |
stoplimit | Giá trị mà tại đó lệnh chờ Limit sẽ được đặt khi giá đạt tới giá trị price (điều kiện này là bắt buộc). Trước đó, lệnh chờ chưa được đặt. |
sl | Giá Stop Loss trong trường hợp giá di chuyển bất lợi. |
tp | Giá Take Profit trong trường hợp giá di chuyển thuận lợi. |
deviation | Độ lệch giá tối đa, được chỉ định bằng điểm. |
type | Kiểu lệnh. Có thể là một trong các giá trị của liệt kê ENUM_ORDER_TYPE. |
type_filling | Kiểu thực hiện lệnh. Có thể là một trong các giá trị của liệt kê ENUM_ORDER_TYPE_FILLING. |
type_time | Kiểu hết hạn của lệnh. Có thể là một trong các giá trị của liệt kê ENUM_ORDER_TYPE_TIME. |
expiration | Thời gian hết hạn của lệnh (dành cho lệnh kiểu ORDER_TIME_SPECIFIED). |
comment | Ghi chú của lệnh. |
position | Vé của vị thế. Nên được điền khi sửa đổi hoặc đóng vị thế để xác định vị thế. Thông thường, nó bằng với vé của lệnh mà vị thế được mở dựa trên đó. |
position_by | Vé của vị thế đối lập. Được sử dụng khi một vị thế được đóng bằng một vị thế đối lập mở cho cùng ký hiệu theo hướng ngược lại. |
Khi sửa đổi hoặc đóng một vị thế trong hệ thống hedging, hãy đảm bảo chỉ định vé của nó (MqlTradeRequest::position ). Vé cũng có thể được chỉ định trong hệ thống netting, mặc dù vị thế được xác định bằng tên ký hiệu. |
---|
Để gửi lệnh nhằm thực hiện thao tác giao dịch, cần sử dụng hàm OrderSend(). Đối với mỗi thao tác giao dịch, cần chỉ định các trường bắt buộc; các trường tùy chọn cũng có thể được điền. Có bảy trường hợp có thể để gửi lệnh giao dịch:
Thực hiện Yêu cầu
Đây là lệnh giao dịch để mở một vị thế trong chế độ Thực hiện Yêu cầu (giao dịch theo giá yêu cầu). Nó yêu cầu chỉ định 9 trường sau:
action
symbol
volume
price
sl
tp
deviation
type
type_filling
Ngoài ra, có thể chỉ định giá trị của các trường magic
và comment
.
Thực hiện Tức thì
Đây là lệnh giao dịch để mở một vị thế trong chế độ Thực hiện Tức thì (giao dịch theo giá hiện tại). Nó yêu cầu chỉ định 9 trường sau:
action
symbol
volume
price
sl
tp
deviation
type
type_filling
Ngoài ra, có thể chỉ định giá trị của các trường magic
và comment
.
Thực hiện Thị trường
Đây là lệnh giao dịch để mở một vị thế trong chế độ Thực hiện Thị trường. Nó yêu cầu chỉ định 5 trường sau:
action
symbol
volume
type
type_filling
Ngoài ra, có thể chỉ định giá trị của các trường magic
và comment
.
Thực hiện Sàn giao dịch
Đây là lệnh giao dịch để mở một vị thế trong chế độ Thực hiện Sàn giao dịch. Nó yêu cầu chỉ định 5 trường sau:
action
symbol
volume
type
type_filling
Ngoài ra, có thể chỉ định giá trị của các trường magic
và comment
.
Ví dụ về thao tác giao dịch TRADE_ACTION_DEAL
để mở một 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; // kiểu thao tác giao dịch
request.symbol = Symbol(); // ký hiệu
request.volume = 0.1; // khối lượng 0.1 lot
request.type = ORDER_TYPE_BUY; // kiểu 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ề thao tác
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ề thao tác giao dịch TRADE_ACTION_DEAL
để mở một 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; // kiểu thao tác giao dịch
request.symbol = Symbol(); // ký hiệu
request.volume = 0.2; // khối lượng 0.2 lot
request.type = ORDER_TYPE_SELL; // kiểu 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ề thao tác
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ề thao tác 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); // ký hiệu
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); // kiểu 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)
{
//--- đặt lại giá trị yêu cầu và kết quả về 0
ZeroMemory(request);
ZeroMemory(result);
//--- thiết lập các tham số thao tác
request.action = TRADE_ACTION_DEAL; // kiểu thao tác giao dịch
request.position = position_ticket; // vé của vị thế
request.symbol = position_symbol; // ký hiệu
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à kiểu lệnh tùy thuộc vào kiểu 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ề thao tác
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
Sửa đổi SL & TP
Lệnh giao dịch để sửa đổi mức giá Stop Loss và/hoặc Take Profit. Nó yêu cầu chỉ định 4 trường sau:
action
symbol
sl
tp
position
Ví dụ về thao tác 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); // ký hiệu
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); // kiểu 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 định nghĩa
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 lệch 150 điểm từ giá đóng hiện tại
else
stop_level+=50; // thiết lập khoảng cách lệch thành (SYMBOL_TRADE_STOPS_LEVEL + 50) điểm để đảm bảo an toàn
//--- 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(bid+price_level,digits);
}
else
{
sl=NormalizeDouble(ask+price_level,digits);
tp=NormalizeDouble(ask-price_level,digits);
}
//--- đặt lại giá trị yêu cầu và kết quả về 0
ZeroMemory(request);
ZeroMemory(result);
//--- thiết lập các tham số thao tác
request.action = TRADE_ACTION_SLTP; // kiểu thao tác giao dịch
request.position= position_ticket; // vé của vị thế
request.symbol= position_symbol; // ký hiệu
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ề thao tác
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
Lệnh Chờ
Lệnh giao dịch để đặt một lệnh chờ. Nó yêu cầu chỉ định 11 trường sau:
action
symbol
volume
price
stoplimit
sl
tp
type
type_filling
type_time
expiration
Ngoài ra, có thể chỉ định giá trị của các trường magic
và comment
.
Ví dụ về thao tác giao dịch TRADE_ACTION_PENDING
để đặt mộ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; // kiểu 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; // kiểu thao tác giao dịch
request.symbol = Symbol(); // ký hiệu
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 kiểu thao tác
if(orderType==ORDER_TYPE_BUY_LIMIT)
{
request.type = ORDER_TYPE_BUY_LIMIT; // kiểu lệnh
price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; // giá để mở
request.price = NormalizeDouble(price,digits); // giá mở được chuẩn hóa
}
else if(orderType==ORDER_TYPE_SELL_LIMIT)
{
request.type = ORDER_TYPE_SELL_LIMIT; // kiểu lệnh
price=SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point; // giá để mở
request.price = NormalizeDouble(price,digits); // giá mở được chuẩn hóa
}
else if(orderType==ORDER_TYPE_BUY_STOP)
{
request.type = ORDER_TYPE_BUY_STOP; // kiểu lệnh
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; // giá để mở
request.price= NormalizeDouble(price,digits); // giá mở được chuẩn hóa
}
else if(orderType==ORDER_TYPE_SELL_STOP)
{
request.type = ORDER_TYPE_SELL_STOP; // kiểu lệnh
price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point; // giá để mở
request.price = NormalizeDouble(price,digits); // giá mở được 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ề thao tác
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
Sửa đổi Lệnh Chờ
Lệnh giao dịch để sửa đổi giá của một lệnh chờ. Nó yêu cầu chỉ định 7 trường sau:
action
order
price
sl
tp
type_time
expiration
Ví dụ về thao tác 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 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é lệnh
string order_symbol=Symbol(); // ký hiệu
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); // kiểu 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 định nghĩa
if(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action= TRADE_ACTION_MODIFY; // kiểu thao tác giao dịch
request.order = OrderGetTicket(i); // vé lệnh
request.symbol = Symbol(); // ký hiệu
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 kiểu 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ở được 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ở được chuẩn hóa
}
else if(type==ORDER_TYPE_BUY_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ở được chuẩn hóa
}
else if(type==ORDER_TYPE_SELL_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ở được 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ề thao tác
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- đặt lại giá trị yêu cầu và kết quả về 0
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
Xóa Lệnh Chờ
Lệnh giao dịch để xóa một lệnh chờ. Nó yêu cầu chỉ định 2 trường sau:
action
order
Ví dụ về thao tác giao dịch TRADE_ACTION_REMOVE
để xóa các lệnh chờ:
#define EXPERT_MAGIC 123456 // MagicNumber của expert
//+------------------------------------------------------------------+
//| Xóa 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é lệnh
ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber của lệnh
//--- nếu MagicNumber khớp
if(magic==EXPERT_MAGIC)
{
//--- đặt lại giá trị yêu cầu và kết quả về 0
ZeroMemory(request);
ZeroMemory(result);
//--- thiết lập các tham số thao tác
request.action= TRADE_ACTION_REMOVE; // kiểu thao tác giao dịch
request.order = order_ticket; // vé 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ề thao tác
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