Cấu trúc MqlTradeRequest
Các hàm giao dịch của API MQL5, đặc biệt là OrderCheck
và OrderSend
, hoạt động trên một số cấu trúc tích hợp sẵn. Do đó, chúng ta sẽ phải xem xét các cấu trúc này trước khi chuyển sang các hàm chính.
Hãy bắt đầu với cấu trúc MqlTradeRequest
, chứa tất cả các trường cần thiết để thực hiện giao dịch.
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Loại hành động cần thực hiện
ulong magic; // Số định danh duy nhất của Expert Advisor
ulong order; // Vé lệnh
string symbol; // Tên của công cụ giao dịch
double volume; // Khối lượng giao dịch yêu cầu tính bằng lô
double price; // Giá
double stoplimit; // Mức lệnh StopLimit
double sl; // Mức lệnh Stop Loss
double tp; // Mức lệnh Take Profit
ulong deviation; // Độ lệch tối đa từ giá đã cho
ENUM_ORDER_TYPE type; // Loại lệnh
ENUM_ORDER_TYPE_FILLING type_filling; // Loại lệnh theo thực thi
ENUM_ORDER_TYPE_TIME type_time; // Loại lệnh theo thời hạn
datetime expiration; // Ngày hết hạn của lệnh
string comment; // Ghi chú cho lệnh
ulong position; // Vé vị thế
ulong position_by; // Vé vị thế đối lập
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Bạn không nên lo sợ về số lượng lớn các trường: cấu trúc được thiết kế để phục vụ tất cả các loại yêu cầu giao dịch có thể có, tuy nhiên, trong mỗi trường hợp cụ thể, thường chỉ một vài trường được sử dụng.
Trước khi điền vào các trường, nên đặt lại cấu trúc về giá trị 0 bằng cách khởi tạo rõ ràng trong định nghĩa của nó hoặc bằng cách gọi hàm ZeroMemory
.
MqlTradeRequest request = {};
...
ZeroMemory(request);
2
3
Cách này sẽ tránh được các lỗi tiềm ẩn và tác dụng phụ từ việc truyền các giá trị ngẫu nhiên vào các hàm API trong những trường không được gán rõ ràng.
Bảng sau cung cấp mô tả ngắn gọn về các trường. Chúng ta sẽ xem cách điền chúng khi mô tả các hoạt động giao dịch.
Trường | Mô tả |
---|---|
action | Loại hoạt động giao dịch từ ENUM_TRADE_REQUEST_ACTIONS |
magic | Định danh Expert (tùy chọn) |
order | Vé lệnh chờ xử lý mà yêu cầu sửa đổi |
symbol | Tên công cụ giao dịch |
volume | Khối lượng giao dịch yêu cầu tính bằng lô |
price | Giá mà lệnh phải được thực thi |
stoplimit | Giá mà lệnh giới hạn sẽ được đặt khi các lệnh ORDER_TYPE_BUY_STOP_LIMIT và ORDER_TYPE_SELL_STOP_LIMIT được kích hoạt |
sl | Giá mà lệnh Stop Loss sẽ được kích hoạt khi giá di chuyển theo hướng bất lợi |
tp | Giá mà lệnh Take Profit sẽ được kích hoạt khi giá di chuyển theo hướng thuận lợi |
deviation | Độ lệch tối đa chấp nhận được từ giá yêu cầu, tính bằng điểm |
type | Loại lệnh từ ENUM_ORDER_TYPE |
type_filling | Loại thực thi lệnh từ ENUM_ORDER_TYPE_FILLING |
type_time | Loại hết hạn lệnh chờ từ ENUM_ORDER_TYPE_TIME |
expiration | Ngày hết hạn của lệnh chờ |
comment | Ghi chú cho lệnh |
position | Vé vị thế |
position_by | Vé vị thế đối lập cho hoạt động TRADE_ACTION_CLOSE_BY |
Để gửi lệnh cho các hoạt động giao dịch, cần điền một tập hợp các trường khác nhau, tùy thuộc vào bản chất của hoạt động. Một số trường là bắt buộc, một số là tùy chọn (có thể bỏ qua khi điền). Tiếp theo, chúng ta sẽ xem xét kỹ hơn các yêu cầu trường trong bối cảnh các hành động cụ thể.
Chương trình có thể kiểm tra cấu trúc MqlTradeRequest
đã được tạo cho đúng bằng hàm OrderCheck
hoặc gửi nó đến máy chủ bằng hàm OrderSend
. Nếu thành công, hoạt động yêu cầu sẽ được thực hiện.
Trường action
là trường duy nhất bắt buộc cho tất cả các hoạt động giao dịch.
Một số duy nhất trong trường magic
thường chỉ được chỉ định cho các yêu cầu mua/bán thị trường hoặc khi tạo lệnh chờ mới. Điều này dẫn đến việc đánh dấu các giao dịch và vị thế đã hoàn thành với số này, cho phép tổ chức xử lý phân tích các hành động giao dịch. Khi sửa đổi mức giá của vị thế hoặc lệnh chờ, cũng như xóa chúng, trường này không có hiệu lực.
Khi thực hiện các hoạt động giao dịch thủ công từ giao diện MetaTrader 5, định danh magic
không thể được đặt, và do đó nó bằng 0. Điều này cung cấp một cách phổ biến nhưng không hoàn toàn đáng tin cậy để phân biệt giữa giao dịch thủ công và tự động khi phân tích lịch sử. Trên thực tế, Expert Advisors cũng có thể sử dụng định danh 0. Do đó, để tìm hiểu ai và cách thức thực hiện các hành động giao dịch cụ thể, hãy sử dụng các thuộc tính tương ứng của lệnh (ORDER_REASON), giao dịch (DEAL_REASON), và vị thế (POSITION_REASON).
Mỗi Expert Advisor có thể đặt ID duy nhất của riêng mình hoặc thậm chí sử dụng nhiều ID cho các mục đích khác nhau (phân loại theo chiến lược giao dịch, tín hiệu, v.v.). Số magic
của vị thế tương ứng với số magic
của giao dịch cuối cùng tham gia vào việc hình thành vị thế.
Tên ký hiệu trong trường symbol
chỉ quan trọng khi mở hoặc tăng vị thế, cũng như khi đặt lệnh chờ. Trong trường hợp sửa đổi và đóng lệnh và vị thế, nó sẽ bị bỏ qua, nhưng có một ngoại lệ nhỏ ở đây. Vì chỉ một vị thế có thể tồn tại trên tài khoản netting cho mỗi ký hiệu, trường symbol
có thể được sử dụng để xác định một vị thế trong yêu cầu thay đổi mức giá bảo vệ của nó (Stop Loss
và Take Profit
).
Trường volume
được sử dụng tương tự: nó cần thiết trong các lệnh mua/bán tức thì hoặc khi tạo lệnh chờ. Cần lưu ý rằng khối lượng thực tế trong hoạt động sẽ phụ thuộc vào chế độ thực thi và có thể khác với yêu cầu.
Trường price
cũng có một số hạn chế: khi gửi lệnh thị trường (TRADE_ACTION_DEAL
trong action
) cho các công cụ với chế độ thực thi SYMBOL_TRADE_EXECUTION_MARKET
hoặc SYMBOL_TRADE_EXECUTION_EXCHANGE
, trường này bị bỏ qua.
Trường stoplimit
chỉ có ý nghĩa khi đặt lệnh stop-limit, tức là khi trường type
chứa ORDER_TYPE_BUY_STOP_LIMIT
hoặc ORDER_TYPE_SELL_STOP_LIMIT
. Nó chỉ định giá mà lệnh giới hạn chờ sẽ được đặt khi giá đạt giá trị price
(sự kiện này được theo dõi bởi máy chủ MetaTrader 5, và cho đến thời điểm đó, lệnh chờ không được hiển thị trong hệ thống giao dịch).
Khi đặt lệnh chờ, quy tắc hết hạn của chúng được thiết lập trong cặp trường: type_time
và expiration
. Trường sau chứa giá trị kiểu datetime
, chỉ được tính đến nếu type_time
bằng ORDER_TIME_SPECIFIED
hoặc ORDER_TIME_SPECIFIED_DAY
.
Cuối cùng, cặp trường cuối cùng liên quan đến việc xác định vị thế trong các truy vấn. Mỗi vị thế mới được tạo dựa trên lệnh (thủ công hoặc lập trình) sẽ được hệ thống gán một vé, một số duy nhất. Thông thường, nó tương ứng với vé của lệnh dẫn đến việc mở vị thế, nhưng có thể thay đổi tùy thuộc vào các hoạt động dịch vụ trên máy chủ, ví dụ, tích lũy swap bằng cách mở lại vị thế.
Chúng ta sẽ nói về việc lấy các thuộc tính của vị thế, giao dịch và lệnh trong các phần riêng biệt. Hiện tại, điều quan trọng với chúng ta là trường position
nên được điền khi thay đổi và đóng vị thế để xác định nó một cách rõ ràng. Về lý thuyết, trên tài khoản netting, chỉ cần chỉ định ký hiệu vị thế trong trường symbol
, nhưng để thống nhất các thuật toán, tốt hơn nên giữ trường position
hoạt động.
Trường position_by
được sử dụng để đóng các vị thế đối lập (TRADE_ACTION_CLOSE_BY
). Nó nên chỉ định một vị thế được mở cho cùng ký hiệu nhưng theo hướng ngược lại so với position
(điều này chỉ có thể trên tài khoản hedging).
Trường deviation
ảnh hưởng đến việc thực hiện lệnh thị trường chỉ trong các chế độ Instant Execution và Request Execution.
Ví dụ về cách điền cấu trúc cho các hoạt động giao dịch của từng loại sẽ được đưa ra trong các phần liên quan.