Lựa chọn lệnh và giao dịch từ lịch sử
MetaTrader 5 cho phép bạn tạo một bản chụp lịch sử cho một khoảng thời gian cụ thể cho một Expert Advisor hoặc một script. Bản chụp này là một danh sách các lệnh và giao dịch có thể được truy cập thêm thông qua các hàm phù hợp. Ngoài ra, lịch sử cũng có thể được yêu cầu liên quan đến các lệnh, giao dịch hoặc vị thế cụ thể.
Việc lựa chọn khoảng thời gian cần thiết một cách rõ ràng (theo ngày) được thực hiện bởi hàm HistorySelect
. Sau đó, kích thước của danh sách giao dịch và danh sách lệnh có thể được tìm thấy bằng cách sử dụng các hàm HistoryDealsTotal
và HistoryOrdersTotal
, tương ứng. Các phần tử của danh sách lệnh có thể được kiểm tra bằng hàm HistoryOrderGetTicket
; đối với các phần tử của danh sách giao dịch, sử dụng HistoryDealGetTicket
.
Cần phân biệt giữa các lệnh đang hoạt động (đang thực thi) và các lệnh trong lịch sử, tức là những lệnh đã được thực hiện, bị hủy hoặc bị từ chối. Để phân tích các lệnh đang hoạt động, sử dụng các hàm được thảo luận trong các phần liên quan đến lấy danh sách các lệnh đang hoạt động và đọc thuộc tính của chúng.
bool HistorySelect(datetime from, datetime to)
Hàm này yêu cầu lịch sử của các giao dịch và lệnh cho khoảng thời gian được chỉ định của thời gian máy chủ (from
và to
bao gồm, to >= from
) và trả về true
trong trường hợp thành công.
Ngay cả khi không có lệnh và giao dịch nào trong khoảng thời gian được yêu cầu, hàm sẽ trả về true
nếu không có lỗi. Một lỗi có thể là, ví dụ, thiếu bộ nhớ để xây dựng danh sách lệnh hoặc giao dịch.
Lưu ý rằng các lệnh có hai thời điểm: thời gian đặt (
ORDER_TIME_SETUP
) và thời gian thực hiện (ORDER_TIME_DONE
). HàmHistorySelect
chọn các lệnh theo thời gian thực hiện.
Để trích xuất toàn bộ lịch sử tài khoản, bạn có thể sử dụng cú pháp HistorySelect(0, LONG_MAX)
.
Một cách khác để truy cập một phần của lịch sử là theo ID vị thế.
bool HistorySelectByPosition(ulong positionID)
Hàm này yêu cầu lịch sử của các giao dịch và lệnh với ID vị thế được chỉ định trong các thuộc tính ORDER_POSITION_ID
, DEAL_POSITION_ID
.
Chú ý! Hàm không chọn các lệnh theo ID của vị thế ngược lại cho các hoạt động Close By. Nói cách khác, thuộc tính
ORDER_POSITION_BY_ID
bị bỏ qua, mặc dù dữ liệu lệnh đã tham gia vào việc hình thành vị thế.Ví dụ, một Expert Advisor có thể hoàn thành một lệnh mua (#1) và bán (#2) trên tài khoản hỗ trợ hedging. Điều này sau đó sẽ dẫn đến việc hình thành các vị thế #1 và #2. Việc đóng vị thế ngược lại yêu cầu lệnh
ORDER_TYPE_CLOSE_BY
(#3). Kết quả là, cuộc gọiHistorySelectByPosition(#1)
sẽ chọn các lệnh #1 và #3, điều này là mong đợi. Tuy nhiên, cuộc gọiHistorySelectByPosition(#2)
sẽ chỉ chọn lệnh #2 (mặc dù lệnh #3 có #2 trong thuộc tínhORDER_POSITION_BY_ID
, và nghiêm túc mà nói, lệnh #3 đã tham gia vào việc đóng vị thế #2).
Khi một trong hai hàm HistorySelect
hoặc HistorySelectByPosition
được thực thi thành công, thiết bị đầu cuối tạo ra một danh sách nội bộ của các lệnh và giao dịch cho chương trình MQL. Bạn cũng có thể thay đổi ngữ cảnh lịch sử bằng các hàm HistoryOrderSelect
và HistoryDealSelect
, để làm điều này bạn cần biết trước vé của đối tượng tương ứng (ví dụ, lưu nó từ kết quả yêu cầu).
Điều quan trọng cần lưu ý là HistoryOrderSelect
chỉ ảnh hưởng đến danh sách lệnh, và HistoryDealSelect
chỉ được sử dụng cho danh sách giao dịch.
Tất cả các hàm lựa chọn ngữ cảnh trả về giá trị bool
cho thành công (true
) hoặc lỗi (false
). Mã lỗi có thể được đọc trong biến tích hợp _LastError
.
bool HistoryOrderSelect(ulong ticket)
Hàm HistoryOrderSelect
chọn một lệnh trong lịch sử theo vé của nó. Lệnh sau đó được sử dụng cho các hoạt động tiếp theo với giao dịch (đọc thuộc tính).
Trong quá trình áp dụng hàm HistoryOrderSelect
, nếu việc tìm kiếm lệnh theo vé thành công, danh sách mới của các lệnh được chọn trong lịch sử sẽ chỉ bao gồm lệnh vừa tìm thấy. Nói cách khác, danh sách các lệnh đã chọn trước đó (nếu có) sẽ bị đặt lại. Tuy nhiên, hàm không đặt lại lịch sử giao dịch đã chọn trước đó, tức là nó không chọn (các) giao dịch liên quan đến lệnh.
bool HistoryDealSelect(ulong ticket)
Hàm HistoryDealSelect
chọn một giao dịch trong lịch sử để truy cập thêm vào nó thông qua các hàm phù hợp. Hàm không đặt lại lịch sử lệnh, tức là nó không chọn lệnh liên quan đến giao dịch đã chọn.
Sau khi một ngữ cảnh nhất định được chọn trong lịch sử bằng cách gọi một trong các hàm trên, chương trình MQL có thể gọi các hàm để lặp qua các lệnh và giao dịch thuộc ngữ cảnh này và đọc thuộc tính của chúng.
int HistoryOrdersTotal()
Hàm HistoryOrdersTotal
trả về số lượng lệnh trong lịch sử (trong phần đã chọn).
ulong HistoryOrderGetTicket(int index)
Hàm HistoryOrderGetTicket
cho phép bạn lấy vé lệnh theo số thứ tự của nó trong ngữ cảnh lịch sử đã chọn. Chỉ số phải nằm trong khoảng từ 0 đến N-1, trong đó N được lấy từ hàm HistoryOrdersTotal
.
Khi biết vé lệnh, việc lấy tất cả các thuộc tính cần thiết của nó rất dễ dàng bằng cách sử dụng các hàm HistoryOrderGet. Các thuộc tính của lệnh lịch sử hoàn toàn giống với các thuộc tính của lệnh hiện tại.
Có một cặp hàm tương tự để làm việc với giao dịch.
int HistoryDealsTotal()
Hàm HistoryDealsTotal
trả về số lượng giao dịch trong lịch sử (trong phần đã chọn).
ulong HistoryDealGetTicket(int index)
Hàm HistoryDealGetTicket
cho phép bạn lấy vé giao dịch theo số thứ tự của nó trong ngữ cảnh lịch sử đã chọn. Điều này cần thiết để xử lý tiếp giao dịch bằng các hàm HistoryDealGet. Danh sách thuộc tính giao dịch có thể truy cập thông qua các hàm này đã được mô tả trong phần trước.
Chúng ta sẽ xem xét một ví dụ về việc sử dụng các hàm sau khi nghiên cứu các hàm HistoryOrderGet
và HistoryDealGet
.