Торговые функции
Все торговые функции можно разделить на две группы - функции, формирующие торговые
приказы, и функции, возвращающие некоторое значение, характеризующее ордер. В 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();
double Profit= OrderProfit();
double Lots = OrderLots();
}
}
Легко заметить, что каждая из рассматриваемых функций (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.