что такое тикет ордера

OrderGetTicket

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

ulong OrderGetTicket (
int index // номер в списке ордеров
);

[in] Номер ордера в списке текущих ордеров.

Значение типа ulong. В случае неудачного выполнения возвращает 0.

Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке «Торговля» в панели «Инструменты». Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.

При «неттинговом» учете позиций (ACCOUNT_MARGIN_MODE_RETAIL_NETTING и ACCOUNT_MARGIN_MODE_EXCHANGE) по каждому символу в любой момент времени может быть открыта только одна позиция, которая является результатом одной или более сделок. Не следует путать между собой позиции и действующие отложенные ордера, которые также отображаются на вкладке «Торговля» в панели «Инструменты».

При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций.

Функция OrderGetTicket() копирует данные об ордере в программное окружение, и последующие вызовы OrderGetDouble(), OrderGetInteger(), OrderGetString() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderGetTicket() непосредственно перед обращением за ними.

Источник

Управление ордерами в MQL4: как модифицировать ордера?

Мы будем использовать функцию OrderSelect(), а также операторы цикла, чтобы выполнить перебор ордеров и получить информацию о конкретном ордере. Этот метод будет использоваться для закрытия нескольких ордеров, добавления трейлинг-стопов, подсчета количества открытых ордеров и многого другого.

Оператор for

Оператор for используется для циклического прохождения через блок кода заданное количество раз. Мы объявляем целочисленную переменную для использования в качестве счетчика и присваиваем ей начальное значение. Далее мы указываем условие, которое заставит цикл работать. Мы также указываем выражение, с помощью которого увеличивается значение счетчика.

Вот пример цикла for:

Первое выражение, int Counter = 1, инициализирует нашу переменную Counter значением 1. Второе выражение Counter Оператор while

Оператор while — это более простой метод цикла в MQL. Цикл for лучше всего подходит, если вы точно знаете, сколько раз вы планируете выполнить цикл. Если вы не уверены в количестве итераций, тогда цикл while будет для вас более подходящим.

Вот пример цикла while:

В этом примере используется логическая переменная Something. Если Something равно true, цикл будет выполнен. Конечно, если значение Something никогда не изменится, цикл будет выполняться бесконечно. Таким образом, необходимо, чтобы в какой-то момент цикла возникло условие изменить значение Something. Как только это условие выполнено, цикл прекращает свое выполнение.

Вы также можете увеличить переменную, как если бы вы использовали оператор for:

Цикл ордеров

Вот код, который мы будем использовать для перебора открытых ордеров:

Мы установим значение Counter равным 0 и будем повторять цикл до тех пор, пока значение Counter не станет меньше или равно значению OrdersTotal() минус один. Счетчик будет увеличиваться на 1 после каждой итерации цикла.

OrdersTotal() — это функция, которая возвращает количество открытых в данный момент ордеров. Почему мы вычитаем 1 из значения OrdersTotal()?

Пул ордеров содержит все ордера, которые в данный момент открыты в нашем терминале, включая ордера, размещенные вручную, а также ордера, размещенные экспертами. Порядковые индексы нумеруются начиная с нуля. Если открыт один ордер, его индекс равен 0. Когда открывается второй ордер, его индекс равен 1. Если третий ордер открыт, его индекс будет равен 2 и т. д.

OrdersTotal() вернет количество открытых ордеров. В приведенном выше примере у нас открыто три ордера. Но так как наш индекс ордера начинается с 0, мы хотим, чтобы наша переменная counter считала только до 2. Значение Counter должно соответствовать нашим номерам индекса ордера, поэтому мы должны вычесть 1 из OrdersTotal().

Когда ордер в пуле открытых ордеров закрыт, у всех новых ордеров в пуле индексы ордеров будут уменьшены. Например, если ордер с индексом 0 закрыт, то ордер с индексом 1 становится индексом 0, а индекс ордера 2 становится индексом 1. Это важно, когда мы закрываем ордера, и мы вскоре рассмотрим это более подробно.

Возвращаясь к нашему циклу ордера: оператор OrderSelect() использует нашу переменную Counter в качестве индекса позиции ордера. Параметр SELECT_BY_POS указывает, что мы выбираем заказ по его позиции в пуле заказов, а не по номеру тикета.

Для первой итерации этого цикла Counter будет равен 0, и мы выберем самый старый ордер из пула ордеров, используя OrderSelect(). Затем мы можем просмотреть информацию о заказе, используя такие функции, как OrderTicket() или OrderStopLoss(), а также изменить или закрыть ордер по мере необходимости.

Подсчет ордеров

Часто очень полезно узнать, сколько ордеров открыл наш советник и какого они типа. Мы создадим несколько функций для подсчета текущего количества открытых ордеров в зависимости от типа ордера. Следующая функция подсчитает общее количество открытых ордеров:

Мы назвали нашу функцию подсчета ордеров TotalOrderCount(). Она вернет целочисленное значение, указывающее, сколько ордеров было открыто в данный момент на указанном символе графика, совпадающем с магическим числом, которое мы передали в качестве аргумента функции.

Начнем с объявления переменной OrderCount. Поскольку мы не указали начальное значение, OrderCount будет инициализирован как 0.

Поскольку пул ордеров содержит все открытые ордера, в том числе размещенные другими советниками, нам необходимо определить, какие ордера были выставлены нашим советником. Сначала мы проверяем OrderSymbol() выбранного порядка и проверяем, соответствует ли он аргументу argSymbol. Мы проверяем магический номер на ордер.

Если OrderMagicNumber() совпадает с аргументом argMagicNumber, мы можем быть достаточно уверены, что этот ордер был размещен этим советником. При запуске нескольких советников на одном инструменте убедитесь, что вы используете уникальный магический номер в каждом советнике.

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

Вот пример того, как мы будем использовать это в коде:

Если этот советник открыл ордера, и значение CloseOrders равно true, тогда будет запущен код внутри фигурных скобок, который закроет все открытые ордера.

Давайте изменим нашу процедуру подсчета ордеров, чтобы она учитывала только рыночные ордера на покупку:

Код идентичен предыдущему, за исключением того, что мы добавили функцию OrderType() для проверки типа ордера. OP_BUY — это константа, которая указывает на рыночный ордер на покупку. Для подсчета других типов ордеров просто замените OP_BUY соответствующей константой типа ордера.

Закрытие нескольких ордеров

Чаще всего нам нужно закрыть несколько ордеров одного типа. Мы объединим наш цикл ордеров с нашими процедурами закрытия ордеров, чтобы закрыть несколько ордеров одновременно. Эта функция закроет все ордера на покупку, выставленные нашим советником:

Обратите внимание, что мы используем void в качестве типа данных функции.

Мы пройдемся по пулу ордеров и проверим каждый ордер, чтобы увидеть, нужно ли нам его закрыть. Если текущий ордер является рыночным ордером на покупку, как указано OP_BUY, и если он соответствует символу нашего графика и аргументам магического числа, мы приступим к закрытию ордера.

Мы вызываем функцию OrderTicket(), чтобы получить номер тикета для текущего ордера. Отсюда наш код идентичен коду закрытия рынка покупки в предыдущих главах. Обратите внимание на самое последнее утверждение: Counter—. Если ордер был закрыт должным образом, переменная Counter будет уменьшена на единицу.

Ранее мы объясняли, что при закрытии ордера у всех ордеров за ним их индексы уменьшаются на единицу. Если мы не уменьшаем переменную counter после закрытия ордера, последующие ордера будут пропущены.

Существует веская причина, по которой мы перебираем ордера от самых старых до самых новых: правила NFA, вступившие в силу летом 2009 года для американских брокеров, требуют, чтобы несколько ордеров, размещенных на одном и том же символе валюты, были закрыты в том порядке, в котором они были размещены. Это называется правилом FIFO (первым пришел, первым вышел). Циклические ордера от старых к новым гарантируют, что мы соблюдаем правило FIFO при закрытии ордеров.

Чтобы закрыть рыночные ордера на продажу с использованием вышеуказанного кода, просто измените тип ордера на OP_SELL, а ClosePrice — на цену Ask.

Давайте рассмотрим код для закрытия нескольких отложенных ордеров. Этот пример закроет все стоп-ордера. Разница между этим кодом и кодом для закрытия рыночных ордеров на покупку выше заключается в том, что мы указываем OP_BUYSTOP в качестве нашего типа ордера и используем OrderDelete() для закрытия ордеров.

Источник

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

Группа функций, предназначенных для управления торговой деятельностью.

Торговые функции OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete() и OrderModify() не могут быть вызваны из пользовательских индикаторов.

Торговые функции могут использоваться в экспертах и скриптах. Торговые функции могут быть вызваны только в том случае, если в свойствах соответствующего эксперта или скрипта включена галочка «Разрешить советнику торговать».

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

OrderClose

bool OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE)

Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

ticket — Уникальный порядковый номер ордера.
lots — Количество лотов для закрытия.
price — Цена закрытия.
slippage — Значение максимального проскальзывания в пунктах.
Color — Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.

Пример:

OrderCloseBy

bool OrderCloseBy(int ticket, int opposite, color Color=CLR_NONE)

Закрытие одной открытой позиции другой позицией, открытой по тому же самому инструменту, но в противоположном направлении. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

ticket — Уникальный порядковый номер закрываемого ордера.
opposite — Уникальный порядковый номер противоположного ордера.
Color — Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.

Пример:

OrderClosePrice

double OrderClosePrice()

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

Пример:

OrderCloseTime

datetime OrderCloseTime()

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

Пример:

OrderComment

string OrderComment()

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

Пример:

OrderCommission

double OrderCommission()

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

Пример:

OrderDelete

bool OrderDelete(int ticket, color arrow_color=CLR_NONE)

Удаляет ранее установленный отложенный ордер. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Параметры:

ticket — Уникальный порядковый номер ордера.
arrow_color — Цвет стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображаются.

Пример:

OrderExpiration

datetime OrderExpiration()

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

Пример:

OrderLots

double OrderLots()

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

Пример:

OrderMagicNumber

int OrderMagicNumber()

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

Пример:

OrderModify

bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)

Изменяет параметры ранее открытых позиций или отложенных ордеров. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Замечания: цену открытия и время истечения можно изменять только у отложенных ордеров.
Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).
На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

Параметры:

ticket — Уникальный порядковый номер ордера.
price — Новая цена открытия отложенного ордера.
stoploss — Новое значение StopLoss.
takeprofit — Новое значение TakeProfit.
expiration — Время истечения отложенного ордера.
arrow_color — Цвет стрелок модификации StopLoss и/или TakeProfit на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелки на графике не отображаются.

Пример:

OrderOpenPrice

double OrderOpenPrice()

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

Пример:

OrderOpenTime

datetime OrderOpenTime()

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

Пример:

OrderPrint

void OrderPrint()

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

Пример:

OrderProfit

double OrderProfit()

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

Пример:

OrderSelect

bool OrderSelect(int index, int select, int pool=MODE_TRADES)

Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.

Параметры:

index — Позиция ордера или номер ордера в зависимости от второго параметра.
select — Флаг способа выбора. Mожет быть одним из следующих величин:
SELECT_BY_POS — в параметре index передается порядковый номер позиции в списке,
SELECT_BY_TICKET — в параметре index передается номер тикета.
pool — Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:
MODE_TRADES (по умолчанию) — ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY — ордер выбирается среди закрытых и удаленных ордеров.

Пример:

OrderSend

int OrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

Замечания: При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены Bid (для продажи) или Ask (для покупки). Если операция проводится по финансовому инструменту, отличному от текущего, то для получения последних котировок по этому инструменту необходимо воспользоваться функцией MarketInfo() с параметром MODE_BID или MODE_ASK. Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке либо запрашиваемая цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). Если же запрашиваемая цена устарела, но ещё присутствует в ценовом потоке, то позиция открывается по текущей цене и только в том случае, если текущая цена попадает в диапазон price+-slippage.

Цены StopLoss и TakeProfit не могут располагаться слишком близко к рынку. Минимальное расстояние стопов в пунктах можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае ошибочных, а также ненормализованных стопов генерируется ошибка 130 (ERR_INVALID_STOPS).

При установке отложенного ордера цена открытия не может быть слишком близкой к рынку. Минимальное расстояние отложенной цены от текущей рыночной цены в пунктах также можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS).

На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

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

Параметры:

symbol — Наименование финансового инструмента, с которым проводится торговая операция.
cmd — Торговая операция. Может быть любым из значений торговых операций.
volume — Количество лотов.
price — Цена открытия.
slippage — Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
stoploss — Цена закрытия позиции при достижении уровня убыточности (0 в случае отсутствия уровня убыточности).
takeprofit — Цена закрытия позиции при достижении уровня прибыльности (0 в случае отсутствия уровня прибыльности).
comment — Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером.
magic — Магическое число ордера. Может использоваться как определяемый пользователем идентификатор.
expiration — Срок истечения отложенного ордера.
arrow_color — Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.

Пример:

OrdersHistoryTotal

int OrdersHistoryTotal()

Возвращает количество закрытых позиций и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. Размер списка истории зависит от текущих настроек вкладки «История счета» терминала.

Пример:

OrderStopLoss

double OrderStopLoss()

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

Пример:

OrdersTotal

int OrdersTotal()

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

Пример:

OrderSwap

double OrderSwap()

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

Пример:

OrderSymbol

string OrderSymbol()

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

Пример:

OrderTakeProfit

double OrderTakeProfit()

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

Пример:

OrderTicket

int OrderTicket()

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

Пример:

OrderType

int OrderType()

Возвращает тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:

OP_BUY — позиция на покупку,
OP_SELL — позиция на продажу,
OP_BUYLIMIT — отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
OP_BUYSTOP — отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLLIMIT — отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLSTOP — отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *