Cấu trúc Kết quả Yêu cầu Giao dịch (MqlTradeResult)
Kết quả của một yêu cầu giao dịch, máy chủ giao dịch trả về dữ liệu về kết quả xử lý yêu cầu giao dịch dưới dạng một cấu trúc đặc biệt được định nghĩa trước kiểu MqlTradeResult
.
struct MqlTradeResult
{
uint retcode; // Mã trả về của thao tác
ulong deal; // Vé giao dịch, nếu giao dịch được thực hiện
ulong order; // Vé lệnh, nếu lệnh được đặt
double volume; // Khối lượng giao dịch, được xác nhận bởi nhà môi giới
double price; // Giá giao dịch, được xác nhận bởi nhà môi giới
double bid; // Giá Bid hiện tại
double ask; // Giá Ask hiện tại
string comment; // Bình luận của nhà môi giới về thao tác (mặc định được điền bằng mô tả mã trả về của máy chủ giao dịch)
uint request_id; // ID yêu cầu được đặt bởi terminal khi gửi đi
int retcode_external; // Mã trả về của hệ thống giao dịch bên ngoài
};
2
3
4
5
6
7
8
9
10
11
12
13
Mô tả các trường
Trường | Mô tả |
---|---|
retcode | Mã trả về của máy chủ giao dịch |
deal | Vé giao dịch, nếu một giao dịch đã được thực hiện. Có sẵn cho thao tác giao dịch kiểu TRADE_ACTION_DEAL |
order | Vé lệnh, nếu một lệnh đã được đặt. Có sẵn cho thao tác giao dịch kiểu TRADE_ACTION_PENDING |
volume | Khối lượng giao dịch, được xác nhận bởi nhà môi giới. Phụ thuộc vào kiểu thực hiện lệnh |
price | Giá giao dịch, được xác nhận bởi nhà môi giới. Phụ thuộc vào trường deviation của yêu cầu giao dịch và/hoặc thao tác giao dịch |
bid | Giá Bid hiện tại trên thị trường (giá báo lại) |
ask | Giá Ask hiện tại trên thị trường (giá báo lại) |
comment | Bình luận của nhà môi giới về thao tác (mặc định được điền bằng mô tả mã trả về của máy chủ giao dịch) |
request_id | ID yêu cầu được đặt bởi terminal khi gửi đến máy chủ giao dịch |
retcode_external | Mã lỗi được trả về bởi hệ thống giao dịch bên ngoài. Việc sử dụng và loại lỗi này phụ thuộc vào nhà môi giới và hệ thống giao dịch bên ngoài mà các thao tác giao dịch được gửi đến |
Kết quả thao tác giao dịch được trả về một biến kiểu MqlTradeResult
, được truyền làm tham số thứ hai cho OrderSend() để thực hiện thao tác giao dịch.
Terminal ghi lại ID của yêu cầu trong trường request_id
khi gửi nó đến máy chủ giao dịch bằng các hàm OrdersSend() và OrderSendAsync(). Terminal nhận các thông báo về các giao dịch đã thực hiện từ máy chủ giao dịch và gửi chúng để xử lý bởi hàm OnTradeTransaction(), chứa các thành phần sau làm tham số:
- Mô tả giao dịch trong cấu trúc MqlTradeTransaction;
- Mô tả yêu cầu giao dịch được gửi từ hàm
OrderSend()
hoặcOrdersSendAsync()
. ID yêu cầu được terminal gửi đến máy chủ giao dịch, trong khi chính yêu cầu vàrequest_id
của nó được lưu trong bộ nhớ terminal; - Kết quả thực hiện yêu cầu giao dịch dưới dạng cấu trúc
MqlTradeResult
với trườngrequest_id
chứa ID của yêu cầu này.
Hàm OnTradeTransaction()
nhận ba tham số đầu vào nhưng hai tham số cuối chỉ nên được phân tích đối với các giao dịch có kiểu TRADE_TRANSACTION_REQUEST. Trong các trường hợp khác, dữ liệu về yêu cầu giao dịch và kết quả thực hiện của nó không được điền. Ví dụ về phân tích tham số có thể được tìm thấy tại Cấu trúc Yêu cầu Giao dịch.
Việc thiết lập request_id
bởi terminal cho yêu cầu giao dịch khi gửi đến máy chủ chủ yếu được giới thiệu để làm việc với hàm bất đồng bộ OrderSendAsync()
. Định danh này cho phép liên kết hành động đã thực hiện (gọi hàm OrderSend
hoặc OrderSendAsync
) với kết quả của hành động này được gửi đến OnTradeTransaction().
Ví dụ:
//+------------------------------------------------------------------+
//| Gửi yêu cầu giao dịch với xử lý kết quả |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request, MqlTradeResult result)
{
//--- đặt lại mã lỗi cuối cùng về 0
ResetLastError();
//--- gửi yêu cầu
bool success = OrderSend(request, result);
//--- nếu kết quả thất bại - cố gắng tìm hiểu lý do
if(!success)
{
int answer = result.retcode;
Print("TradeLog: Yêu cầu giao dịch thất bại. Lỗi = ", GetLastError());
switch(answer)
{
//--- báo giá lại
case 10004:
{
Print("TRADE_RETCODE_REQUOTE");
Print("request.price = ", request.price, " result.ask = ",
result.ask, " result.bid = ", result.bid);
break;
}
//--- lệnh không được máy chủ chấp nhận
case 10006:
{
Print("TRADE_RETCODE_REJECT");
Print("request.price = ", request.price, " result.ask = ",
result.ask, " result.bid = ", result.bid);
break;
}
//--- giá không hợp lệ
case 10015:
{
Print("TRADE_RETCODE_INVALID_PRICE");
Print("request.price = ", request.price, " result.ask = ",
result.ask, " result.bid = ", result.bid);
break;
}
//--- SL và/hoặc TP không hợp lệ
case 10016:
{
Print("TRADE_RETCODE_INVALID_STOPS");
Print("request.sl = ", request.sl, " request.tp = ", request.tp);
Print("result.ask = ", result.ask, " result.bid = ", result.bid);
break;
}
//--- khối lượng không hợp lệ
case 10014:
{
Print("TRADE_RETCODE_INVALID_VOLUME");
Print("request.volume = ", request.volume, " result.volume = ",
result.volume);
break;
}
//--- không đủ tiền cho thao tác giao dịch
case 10019:
{
Print("TRADE_RETCODE_NO_MONEY");
Print("request.volume = ", request.volume, " result.volume = ",
result.volume, " result.comment = ", result.comment);
break;
}
//--- lý do khác, xuất mã phản hồi của máy chủ
default:
{
Print("Other answer = ", answer);
}
}
//--- thông báo về kết quả không thành công của yêu cầu giao dịch bằng cách trả về false
return(false);
}
//--- OrderSend() trả về true - lặp lại câu trả lời
return(true);
}
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