Lấy danh sách các lệnh đang hoạt động
Các chương trình Expert Advisor thường cần liệt kê các lệnh đang hoạt động hiện có và phân tích các thuộc tính của chúng. Cụ thể, trong phần về sửa đổi lệnh chờ, trong ví dụ PendingOrderModify.mq5
, chúng ta đã tạo một hàm đặc biệt GetMyOrder
để tìm các lệnh thuộc về Expert Advisor nhằm sửa đổi lệnh này. Ở đó, việc phân tích được thực hiện dựa trên tên ký hiệu và ID của Expert Advisor (Magic
). Về lý thuyết, cách tiếp cận tương tự cũng nên được áp dụng trong ví dụ về xóa một lệnh chờ PendingOrderDelete.mq5
từ phần trước.
Trong trường hợp sau, để đơn giản, chúng ta đã tạo một lệnh và lưu vé của nó trong một biến toàn cục. Nhưng điều này không thể thực hiện trong trường hợp chung vì Expert Advisor và toàn bộ terminal có thể bị dừng hoặc khởi động lại bất cứ lúc nào. Do đó, Expert Advisor phải chứa một thuật toán để khôi phục trạng thái nội bộ, bao gồm việc phân tích toàn bộ môi trường giao dịch, cùng với các lệnh, giao dịch, vị thế, số dư tài khoản, v.v.
Trong phần này, chúng ta sẽ nghiên cứu các hàm MQL5 để lấy danh sách các lệnh đang hoạt động và chọn bất kỳ lệnh nào trong môi trường giao dịch, điều này cho phép đọc tất cả các thuộc tính của nó.
int OrdersTotal()
Hàm OrdersTotal
trả về số lượng các lệnh đang hoạt động hiện tại. Chúng bao gồm các lệnh chờ, cũng như các lệnh thị trường chưa được thực thi. Thông thường, một lệnh thị trường được thực thi nhanh chóng, và do đó hiếm khi có thể bắt gặp nó trong giai đoạn hoạt động, nhưng nếu thị trường không có đủ thanh khoản, điều này có thể xảy ra. Ngay khi lệnh được thực thi (một giao dịch được kết thúc), nó sẽ được chuyển từ danh mục các lệnh đang hoạt động sang lịch sử. Chúng ta sẽ nói về việc làm việc với lịch sử lệnh trong một phần riêng biệt.
Lưu ý rằng chỉ có các lệnh mới có thể ở trạng thái đang hoạt động và lịch sử. Điều này khác biệt đáng kể so với các giao dịch luôn được tạo trong lịch sử và các vị thế chỉ tồn tại trực tuyến. Để khôi phục lịch sử của các vị thế, bạn nên phân tích lịch sử các giao dịch.
ulong OrderGetTicket(uint index)
Hàm OrderGetTicket
trả về vé của lệnh theo số thứ tự của nó trong danh sách các lệnh trong môi trường giao dịch của terminal. Tham số index
phải nằm trong khoảng từ 0 đến giá trị OrdersTotal()-1
bao gồm cả hai đầu. Cách thức tổ chức các lệnh không được quy định.
Hàm OrderGetTicket
chọn một lệnh, tức là sao chép dữ liệu về nó vào một bộ nhớ đệm nội bộ để chương trình MQL có thể đọc tất cả các thuộc tính của nó bằng các lời gọi tiếp theo của hàm OrderGetDouble
, OrderGetInteger
, hoặc OrderGetString
, mà chúng ta sẽ thảo luận trong một phần riêng biệt.
Sự tồn tại của bộ nhớ đệm này cho thấy dữ liệu nhận được từ nó có thể trở nên lỗi thời: lệnh có thể không còn tồn tại hoặc đã được sửa đổi (ví dụ, nó có thể có trạng thái khác, giá mở, mức Stop Loss
hoặc Take Profit
và thời gian hết hạn). Do đó, để đảm bảo nhận được dữ liệu liên quan về lệnh, nên gọi hàm OrderGetTicket
ngay trước khi yêu cầu dữ liệu. Dưới đây là cách thực hiện điều này trong ví dụ của PendingOrderModify.mq5
.
ulong GetMyOrder(const string name, const ulong magic)
{
for(int i = 0; i < OrdersTotal(); ++i)
{
ulong t = OrderGetTicket(i);
if(OrderGetInteger(ORDER_MAGIC) == magic
&& OrderGetString(ORDER_SYMBOL) == name)
{
return t;
}
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
Mỗi chương trình MQL duy trì bộ nhớ đệm riêng của nó (bối cảnh môi trường giao dịch), bao gồm lệnh đã chọn. Trong các phần tiếp theo, chúng ta sẽ tìm hiểu rằng ngoài các lệnh, một chương trình MQL có thể chọn các vị thế và các đoạn lịch sử với các giao dịch và lệnh vào bối cảnh hoạt động.
Hàm OrderSelect
thực hiện việc chọn một lệnh tương tự với việc sao chép dữ liệu của nó vào bộ nhớ đệm nội bộ.
bool OrderSelect(ulong ticket)
Hàm này kiểm tra sự tồn tại của một lệnh và chuẩn bị khả năng đọc tiếp các thuộc tính của nó. Trong trường hợp này, lệnh được chỉ định không phải bằng số thứ tự mà bằng vé, mà chương trình MQL phải nhận được trước đó bằng một cách nào đó, đặc biệt là kết quả của việc thực thi OrderSend/OrderSendAsync
.
Hàm trả về true
trong trường hợp thành công. Nếu nhận được false
, điều này thường có nghĩa là không có lệnh nào với vé được chỉ định. Lý do phổ biến nhất cho điều này là khi trạng thái lệnh đã thay đổi từ đang hoạt động sang lịch sử, ví dụ, do thực thi hoặc hủy bỏ (chúng ta sẽ tìm hiểu cách xác định trạng thái chính xác sau). Các lệnh có thể được chọn trong lịch sử bằng cách sử dụng các hàm liên quan.
Trước đây, chúng ta đã sử dụng hàm OrderSelect
trong cấu trúc MqlTradeResultSync
để theo dõi tạo và xóa các lệnh chờ.