Русский

Учебник по MQL4  Стандартные функции  Торговые функции

Торговые функции


Все торговые функции можно разделить на две группы - функции, формирующие торговые приказы, и функции, возвращающие некоторое значение, характеризующее ордер. В MQL4 имеются всего пять функций, которые формируют и отправляют на сервер торговые приказы:

  • OrderSend() - открытие рыночного ордера и установка отложенного ордера;
  • OrderClose() - закрытие рыночного ордера;
  • OrderCloseBy() - встречное закрытие двух разнонаправленных рыночных ордеров;
  • OrderDelete() - удаление отложенного ордера;
  • OrderModify() - модификация ордеров всех видов.

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

Функция OrderTotal()

int OrdersTotal()

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

Функция OrderTakeProfit()

double OrderTakeProfit()

Функция возвращает значение заявленной цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера. Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Функция OrderProfit()

double OrderProfit()

Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это - текущая нереализованная прибыль. Для закрытых ордеров - зафиксированная прибыль. Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Функция OrderLots()

double OrderLots()

Возвращает количество лотов для выбранного ордера. Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Ниже представлен фрагмент программы, в котором вычисляются заявленная цена закрытия TakeProfit, прибыль по ордеру и количество лотов:

for (int i=0; i<OrdersTotal(); i++)         // По всем ордерам
{
if((OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующ.
{
double ТР = OrderTakeProfit(); // TakeProfit ордера
double Profit= OrderProfit(); // Прибыль по ордеру
double Lots = OrderLots(); // Количество лотов
//......Использование значений ТР и Profit в программе.....
}
}
// Конец тела цикла

Легко заметить, что каждая из рассматриваемых функций (OrderTakeProfit (), OrderProfit() и OrderLots() не имеет настраиваемых параметров, т.е. не предусматривает указание, например, номера ордера, чтобы возвращаемое функцией значение соответствовало характеристике конкретного ордера.

Чтобы вычислить искомые характеристики какого-то одного ордера (в данном случае - заявленную цену одного из стоп-приказов, прибыль по ордеру и количество лотов), сначала необходимо выделить этот ордер, сообщив таким способом программе, для какого именно из ордеров будут производиться вычисления. Для этого перед вычислениями характеристик ордера, нужно исполнить функцию OrderSelect() (см. Закрытие и удаление ордеров). Торговые функции, исполненные после этого, будут возвращать значения, соответствующие характеристикам выбранного ордера.

Немаловажное значение имеет правильная оценка программистом той или иной характеристики ордера. Например, при решении задачи о порядке закрытия ордеров, необходимо задаться какими-то критериями, чтобы вычислить, какой из ордеров необходимо закрыть раньше, а какой после. Рассмотрим небольшую задачу.


Задача 40. В торговле имеются два ордера Buy, открытых по одному финансовому инструменту. Первый ордер открыт по цене 1.2000, на 0.5 лота, второй ордер открыт по цене 1. 3000 на 1 лот. Текущая цена 1.3008. Сработал торговый критерий закрытия ордеров типа Buy. Требуется принять правильное решение, а именно, решить какой из ордеров нужно закрыть первым, а какой - вторым.

Очевидно, что прибыль по первому ордеру составляет 108 пунктов, а по второму 8. Несмотря на то, что первый ордер открыт на меньшее количество лотов, прибыль у него больше, чем у второго, а именно, у первого $540, а у второго $80. На первый взгляд может показаться, что сначала нужно закрыть первый ордер, т.к. у него больше прибыли. Однако это решение является ошибочным. Для принятия правильного решения необходимо рассмотреть возможный сценарий развития событий.

Если бы заранее было точно известно, что в течение периода закрытия ордеров цена не изменится, то порядок закрытия ордеров не имел бы значения. Однако за то время, пока исполняется торговый приказ на закрытие одного из ордеров, цена может измениться. Поэтому, закрыть следует тот ордер, который при неблагоприятном развитии событий принесёт больше вреда. При изменении цены на 1 пункт прибыль по первому ордеру уменьшится на $5, а по второму - на $10. Очевидно, что вреда будет больше от второго ордера, т.е. его и следует закрыть первым. Таким образом, в вопросе о порядке закрытия ордеров определяющее значение имеет количество лотов. Благоприятное развитие событий в данном случае рассматривать нельзя, т.к. торговля в правильно составленной программе ведётся в соответствии с торговыми критериями, и в данном случае сработал критерий закрытия ордеров типа Buy.

Если необходимо сделать выбор между двумя ордерами, открытыми на одинаковое количество лотов, то следует принять во внимание другие характеристики ордеров. Например, можно учитывать дистанцию между текущей ценой и заявленным значением StopLoss каждого из ордеров. При этом необходимо проанализировать, какой из ордеров принесёт больше вреда при сильном движении цены. Ответ также очевиден - больше вреда будет от того ордера (из двух ордеров, открытых на одинаковое количество лотов), StopLoss которого находится дальше от текущей цены.

Подобным образом можно проанализировать важность и всех других характеристик ордера и составить приоритетный список критериев, которые должны приниматься во внимание при решении задачи закрытия ордеров. Нетрудно также определить и критерии, которые не должны рассматриваться. Таким критерием является, например, цена открытия ордера (и зависимая от неё прибыль по ордеру). Количество денежных средств, имеющихся у трейдера на текущий момент, отражается в клиентском терминале в графе Средства. При этом не важно, каким образом было получено это значение - то ли в результате убытка по одному или нескольким рыночным ордерам, то ли в результате прибыли.

Все необходимые характеристики ордера можно получить, исполнив соответствующие торговые функции:

Торговые функции


Функция Краткое описание
Ошибки исполнения Любая торговая операция (функции OrderSend, OrderClose, OrderCloseBy, OrderDelete или OrderModify) по ряду причин может завершиться неудачей и вернуть либо отрицательный номер тикета, либо FALSE. Причину неудачи можно выяснить, вызвав функцию GetLastError. Каждая ошибка должна быть обработана по-своему. Ниже в таблице приведены общие рекомендации.
OrderClose Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderCloseBy Закрытие одной открытой позиции другой позицией, открытой по тому же самому инструменту, но в противоположном направлении. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderClosePrice Возвращает цену закрытия выбранного ордера.
OrderCloseTime Возвращает время закрытия для выбранного ордера.
OrderComment Возвращает комментарий для выбранного ордера.
OrderCommission Возвращает значение рассчитанной комиссии для выбранного ордера.
OrderDelete Удаляет ранее установленный отложенный ордер. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderExpiration Возвращает дату истечения для выбранного отложенного ордера.
OrderLots Возвращает количество лотов для выбранного ордера.
OrderMagicNumber Возвращает идентификационное ("магическое") число для выбранного ордера.
OrderModify Изменяет параметры ранее открытых позиций или отложенных ордеров. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderOpenPrice Возвращает цену открытия для выбранного ордера.
OrderOpenTime Возвращает время открытия выбранного ордера.
OrderPrint Выводит данные ордера в журнал.
OrderProfit Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это - текущая нереализованная прибыль. Для закрытых ордеров - зафиксированная прибыль.
OrderSelect Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции.
OrderSend Основная функция, используемая для открытия позиции или установки отложенного ордера. Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи.
OrdersHistoryTotal Возвращает количество закрытых позиций и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале.
OrderStopLoss Возвращает значение цены закрытия позиции при достижении уровня убыточности (stop loss) для текущего выбранного ордера.
OrdersTotal Возвращает общее количество открытых и отложенных ордеров.
OrderSwap Возвращает значение свопа для текущего выбранного ордера.
OrderSymbol Возвращает наименование финансового инструмента для текущего выбранного ордера.
OrderTakeProfit Возвращает значение цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера.
OrderTicket Возвращает номер тикета для текущего выбранного ордера.
OrderType Возвращает тип операции текущего выбранного ордера.

Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Ltd. или к разделу "Справка" в редакторе MetaEditor.