Выборка ордеров и сделок из истории

MetaTrader 5 позволяет создать для эксперта или скрипта слепок истории за конкретный период времени. Слепок представляет собой списки ордеров и сделок для дальнейшего обращения к ним посредством соответствующих функций. Кроме того история может запрашиваться в привязке к конкретным ордерам, сделкам или позициями.

Выделение нужного периода в явном виде (по датам) выполняет функция HistorySelect. После этого размер списка сделок можно узнать с помощью функции HistoryDealsTotal, а размер списка ордеров — с помощью HistoryOrdersTotal. Перебор элементов списка ордеров можно проводить функцией HistoryOrderGetTicket, для элементов списка сделок подходит функция HistoryDealGetTicket.

Следует различать активные (действующие) ордера и ордера в истории — исполненные, отмененные или получившие отказ (rejected). Для анализа действующих ордеров используйте функции, рассмотренные в разделах о получении списка действующих ордеров и чтении их свойств.

bool HistorySelect(datetime from, datetime to)

Функция запрашивает историю сделок и ордеров за указанный период серверного времени (from и to — включительно, to >= from) и возвращает true в случае успеха.

Даже если в запрошенном периоде нет ордеров и сделок, функция вернет true в отсутствие ошибок. Ошибкой может быть, например, недостаток памяти для построения списка ордеров или сделок.

Обратите внимание, что у ордеров есть два времени: установки (ORDER_TIME_SETUP) и исполнения (ORDER_TIME_DONE). Функция HistorySelect отбирает ордера по времени исполнения.

Для выделения всей истории счета можно использовать синтаксис HistorySelect(0, LONG_MAX).

Другой способ выделения части истории — по идентификатору позиции.

bool HistorySelectByPosition(ulong positionID)

Функция запрашивает историю сделок и ордеров с указанным идентификатором позиции в свойствах ORDER_POSITION_ID, DEAL_POSITION_ID.

Внимание! Функция не выбирает ордера по идентификатору встречной позиции, если использовалось встречное закрытие. Иными словами, свойство ORDER_POSITION_BY_ID игнорируется, несмотря на то, что данные ордера участвовали в формировании позиции.
 
Например, эксперт мог совершить покупку (ордер #1) и продажу (ордер #2) на счету с поддержкой хеджирования. Тогда это приведет к образованию позиций #1 и #2. Для встречного закрытия позиций потребуется ордер ORDER_TYPE_CLOSE_BY (#3). В результате, вызов HistorySelectByPosition(#1) выделит ордера #1 и #3, что ожидаемо. Однако вызов HistorySelectByPosition(#2), выделит только ордер #2 (несмотря на то, что в ордере #3 в свойстве ORDER_POSITION_BY_ID значится #2, и строго говоря, ордер #3 участвовал в закрытии позиции #2).

При успешном выполнении любой из двух функций HistorySelect или HistorySelectByPosition терминал формирует для MQL-программы некий внутренний список ордеров и сделок. Также изменить исторический контекст позволяют функции HistoryOrderSelect и HistoryDealSelect, для вызова которых необходимо заранее знать тикет соответствующего объекта (например, сохранить из результата запроса).

Важно отметить, что HistoryOrderSelect влияет только на список ордеров, а HistoryDealSelect — только на список сделок.

Все функции выделения контекста возвращают значение bool, которое обозначает успех (true) или ошибку (false). Код ошибки можно прочитать во встроенной переменной _LastError.

bool HistoryOrderSelect(ulong ticket)

Функция HistoryOrderSelect выбирает в истории ордер по его тикету для дальнейшей работы с ним (чтения свойств).

В ходе применения функции HistoryOrderSelect, если поиск ордера по тикету завершился успешно, новый список ордеров, выбранных в истории, будет состоять из единственного только что найденного ордера. Иными словами, прежний список выбранных ордеров (если он был) сбрасывается. Однако функция не сбрасывает выбранную до того историю сделок, то есть не выбирает сделку (сделки), связанную с ордером.

bool HistoryDealSelect(ulong ticket)

Функция HistoryDealSelect выбирает в истории сделку для дальнейших обращений к ней через соответствующие функции. Функция не сбрасывает историю ордеров, то есть не выбирает ордер, связанный с выбранной сделкой.

После того как в истории выбран некий контекст за счет вызова одной из вышеприведенных функций, MQL-программа может обращаться к функциям для перебора ордеров и сделок, попавших в этот контекст, и чтения их свойств.

int HistoryOrdersTotal()

Функция HistoryOrdersTotal возвращает количество ордеров в истории (в выборке).

ulong HistoryOrderGetTicket(int index)

Фукнция HistoryOrderGetTicket позволяет получить тикет ордера по его порядковому номеру в выбранном контексте истории. Индекс должен лежать в пределах от 0 до N-1, где N получено из функции HistoryOrdersTotal.

Имея "на руках" тикет ордера, далее легко получить все необходимые его свойства с помощью HistoryOrderGet-функций. Свойства исторических ордеров — точно такие же, как и у действующих.

Для работы со сделками существует аналогичная пара функций.

int HistoryDealsTotal()

Функция HistoryDealsTotal возвращает количество сделок в истории (в выборке).

ulong HistoryDealGetTicket(int index)

Функция HistoryDealGetTicket позволяет получить тикет сделки по её порядковому номеру в выбранном контексте истории. Это нужно для дальнейшей обработки сделки HistoryDealGet-функциями. Перечень доступных через них свойств сделок был описан в предыдущем разделе.

Пример применения функций мы рассмотрим после изучения HistoryOrderGet- и HistoryDealGet-функций.