Открытие позиций Управление торговыми позициями Торговля
Для установки отложенных ордеров используются функция OrderSend(),а для удаления – OrderDelete(). Открытие рыночного ордера предполагает покупку или продажу активов по финансовомуинструменту по рыночным ценам, сложившимся на текущий момент (см. Требования и ограничения торговых операций). Блок 3-9 представляет цикл модификации выбранного ордера.
- Однако за то время,пока исполняется торговый приказ на закрытие одного из ордеров, цена может измениться.Поэтому, закрыть следует тот ордер, который при неблагоприятном развитии событийпринесёт больше вреда.
- В блоке5-6 будет обнаружено, что заданное значение меньше допустимого, и установлено такоезначение цены стоп-приказа, которое не противоречит ограничению.
- Уровень остановки выражается как целое число, и его нужно будет преобразовать в дробное значение с помощью Point.
- Сервер получил торговый приказ, произвёл его проверку, не обнаружил некорректныхпараметров и принял решение исполнить торговый приказ.
- OrderSelect – функция выбирает ордер для дальнейшей работы с ним.
Ошибка 130. Неправильные стопы
В предыдущих статьях мы узнали, как открывать ордера, закрывать ордера и перебирать существующие ордера. Минимальный стоп-лосс в пунктах для рыночного ордера будет включать текущий спред, поэтому минимальный стоп-лосс будет больше минимального тейк-профита. Например, если уровень стопа составляет 3 пункта, спред составляет 2 пункта, а цена открытия ордера составляет 1,4500, стоп-лосс для ордера на покупку на рынке должен быть ниже 1,4495. Соответственно, не существует и программно реализуемого способа, с помощьюкоторого можно было бы это выполнить. Единственное, что можно сделать с рыночнымордером, – это закрыть его. Рыночный ордер может быть закрыт в результате исполненияторгового приказа, сформированного трейдером или программой, или в результате достижениярыночной ценой заявленной цены одного из стоп-приказов ордера.
Цикл ордеров
Указанная ограниченность диктуется прежде всего количеством используемых управляющихсредств. В данной программе такое средство всего одно – место прикрепления скриптав окно финансового инструмента. Используя этот параметр, пользователь может по своему выбору назначитьк модификации любой из ордеров. Для более эффективнойработы пользователю необходимы дополнительные средства, чтобы иметь возможностьвоздействовать на другие параметры ордеров. Торговые приказы для модификации рыночных и отложенных ордеров формируются с помощьюфункции OrderModify(). Затем мы извлекаем стоп-лосс текущего выбранного ордера и округляем его с помощью NormalizeDouble().
Как изменять открытые и отложенные ордера в MQL4?
Для открытых позиций это – текущая нереализованная прибыль. Ордер должен быть предварительно выбран с помощьюфункции OrderSelect(). Функция возвращает общее количество открытых и отложенных ордеров.
Функция OrderProfit()
Очень важно использовать правильную цену при открытии или закрытии ордеров.Цена Bid — это то, что вы видите на графиках MetaTrader. Цена Ask, как правило, всего на несколько пунктов выше цены Bid. Разница между Bid и Ask заключается в спреде, который представляет собой комиссию брокера за размещение ордера. Немаловажное значение имеет правильная оценка программистом той или иной характеристикиордера. Например, при решении задачи о порядке закрытия ордеров, необходимо задатьсякакими-то критериями, чтобы вычислить, какой из ордеров необходимо закрыть раньше,а какой после.
С другой стороны, как уверяют некоторые брокеры, лимитные отложки не скользят. Это значит, что торгуя отложенными Limit ордерами вы минимизируете риск проскальзывания в отличие от рыночных ордеров, где при сильной волатильности оно может составить десятки пунктов. Как и для рыночного ордера тут используется торговая функция OrderSend. Рассмотрим небольшое отличие в ее заполнение для нашего случая.
Мы также проверяем, чтобы стоп-лосс еще не был установлен по цене безубытка. Если OrderOpenPrice () не равен OrderStopLoss(), то мы можем продолжить. Если текущая прибыль в пунктах PipsProfit больше или равна нашей минимальной прибыли MinProfit, и все остальные условия выполняются, стоп будет изменен. Мы используем MQL-функцию NormalizeDouble() для округления переменной MaxStopLoss до правильного числа цифр после десятичной точки. Цены в MetaTrader могут быть указаны до восьми знаков после запятой. Используя NormalizeDouble(), мы округляем это до 4 или 5 цифр (2-3 цифры для пар JPY).
Есть и другие способы определения стоп-лосса и тейк-профита. Например, недавний максимум или минимум, или значение индикатора можно использовать для определения стоп-лосса. Отныне мы будем использовать UsePoint и UseSlippage для ссылки на эти значения. Код выше предполагает, что ваш советник выставляет ордера только на один торговый инструмент. Давайте создадим функцию для определения размера проскальзывания. Как упоминалось ранее, для брокера с пятизначными котировками параметр проскальзывания для функции OrderSend() необходимо увеличить в 10 раз, чтобы получить правильное значение.
Следующий код рассчитывает максимально допустимую цену для тейк-профита на продажу, стоп-лосс на покупку, стоп-ордер на продажу или лимитного ордера на продажу. Обратите внимание, что мы просто используем Bid вместо Ask и вычитаем вместо добавления. Следующий код рассчитывает минимально допустимую цену для тейк-профита на покупку, стоп-лосс на продажу, стоп-ордер на покупку или лимитный ордер на продажу.
Далее мы указываем условие, которое заставит цикл работать. Мы также указываем выражение, с помощью которого увеличивается значение счетчика. Отдельно нужно заметить, что в данном примере намеренно не рассматриваются все безисключения ошибки.
Новые параметры ордера вычисляются только в том случае, если текущая цена Priceнаходится дальше от текущей рыночной цены Bid, чем на желаемую дистанцию TS. Еслиэто так, то управление передаётся в тело оператора if, где вычисляется новая цена открытия ордера New_Price. Новые значения StopLoss и TakeProfit вычисляются толькодля ненулевых значений. При этом дистанции между заявленной ценой ордера и каждойценой стоп-приказа сохраняется неизменной.
Торговая функция OrderClose() возвращает true при успешном исполнении торговойоперации и false при неудачном. Если торговый приказ успешно исполнен на сервере,то переменной Ans (ответ) будет присвоено значение true. Далее управление в исполняемой программе будет передано оператору цикла while (блок6-10). В блоке 6-7 выполняется проверка наличия найденных рыночных ордеров. Еслив блоке 2-4 не было обнаружено ни одного рыночного ордера (а это в общем случаевполне возможно), то значение флага Real_Order остаётся равным -1, что означаетотсутствие рыночных ордеров. Если при проверке в блоке 6-7 выявлено отсутствиерыночных ордеров, то выполнение цикла while прерывается и программа заканчиваетработу.
Ордера будут закрыты, когда ордер будет открыт в обратном направлении, либо по стоп-лоссу или тейк-профиту. Мы будем использовать глобальные переменные BuyTicket и SellTicket для хранения последнего ордера. При открытии нового ордера тикет последнего заказа очищается. Это предотвращает открытие нескольких последовательных ордеров. Переменная CloseTicket — это номер ордера, который мы хотим закрыть. Функция OrderSelect() выбирает ордер и позволяет нам получить о нем информацию.
Для этого в программе необходимо проанализировать характеристикикаждого из ордеров, а именно, – тип ордера, количество лотов, положение стоп-приказови т.д. Рассмотрим некоторые функции, позволяющие получить информацию об ордере. Блок 6-10 представляет обработку ошибок, он полностью аналогичен рассмотренным ранее(в этом и предыдущем параграфах). Формирование торгового приказа для встречногозакрытия ордеров осуществляется в блоке 7-8 с помощью функции OrderCloseBy(). Вслучае неудачи, в зависимости от кода ошибки, управление передаётся либо на повторениепопытки исполнения торговой операции (для тех же тикетов) либо оператору return,в результате чего скрипт заканчивает работу.
Поэтому мы рассчитаем стоп-лосс и тейк-профит перед размещением ордера с помощью OrderSend(). Если мы модифицируем рыночный ордер, мы можем передать любое значение параметра Price, поскольку вы не можете изменить цену рыночного ордера. В результате рассматриваемых событий рыночный ордер Buy был открыт по цене на 25пунктов хуже в сравнении с ценой отложенного ордера BuyStop. Аналогичная ситуация(недополучение прибыли по ордеру) может сложиться и для ордера SellStop в случае,если цена скачкообразно понижается. Если же в разрыв цен попадает отложенный ордерBuyLimit или SellLimit, то соответствующий рыночный может быть открыт по цене лучшей,чем цена, заявленная в отложенном ордере.
Перед началом любых торговых операций мы должны проверить, используется ли поток исполнения сделки в настоящее время. Модифицированный ордер BuyLimit (изменена заявленная цена и TakeProfit). Отложенный ордер BuyLimit со стоп-приказами, максимально приближеннымик ордеру. Для модификации любых типов ордеров, в том числе отложенных, используется функция OrderModify(). Модифицированный ордер, стоп-приказы которого установлены за пределамиминимальной дистанции. Отложенный ордер со стоп-приказами, максимально приближенными к ордеру.
Как всегда, мы получаем информацию о заказе, используя функцию OrderSelect(). Таким образом, мы можем передать стоп-лосс и зафиксировать цену. Перед изменением ордера мы проверяем, что наша новая цена отложенного ордера не совпадает с текущей ценой. Функция OrderModify() также можно использовать для изменения цены отложенного ордера. Если цена отложенного ордера уже была достигнута и ордер был исполнен, он больше не является отложенным ордером и его цена открытия не может быть изменена. Вот пример, где мы проверяем стоп-лосс и тейк-профит для ордера на покупку, чтобы убедиться, что цены действительны.
Исполнение оператора return приводит к выходу из функции start() и, как следствие,к окончанию исполнения программы (напомним, что скрипты после исполнения заканчиваютработу) – управление возвращается клиентскому терминалу. Мы прикрепили скрипт в окно финансового инструмента Eur/Usd. В этом случае стандартнаяфункция Symbol() вернёт строковое значение EURUSD. После отсылки приказа в окне будет показан результат его исполнения — успешное совершение торговой операции или отказ с описанием причины, почему она не была исполнена.
Мы делим EquityPercent на 100, чтобы получить дробное значение (0,02). Затем мы умножаем его на AccountEquity(), чтобы вычислить сумму используемого капитала. 2% от долларов — это 200 долларов, и они будут храниться в переменной RiskAmount. Модифицированный ордер BuyLimit максимально приближен загадки с подвохом на логику с ответами к рыночной цене. Для модификации любых типов ордеров, в том числе рыночных, используется функция OrderModify(). Двухсторонняя котировка – связанная пара рыночных цен, предлагаемых брокером для осуществления покупки и продажиактивов по финансовому инструменту в текущий момент.
Cвободные средства – эта та сумма денежных средств, которая остаётся свободнойдля совершения торговых операций. Сервер исполнил торговый приказ, произведя транзакцию в своей базе данных,и отправил сведения об исполненном приказе торговому терминалу. Сервер получил торговый приказ, произвёл его проверку, не обнаружил некорректныхпараметров и принял решение исполнить торговый приказ.
Для того, чтобы мы вообще смогли рассматривать возможность открытия ордера, нам нужно знать, что значение Зиг Зига для обоих переменных больше нуля, а также функция OrderExist() вернет результат false. Функция закрывает один рыночный ордер другим рыночным ордером, открытым по томуже финансовому инструменту, но в противоположном направлении. https://forexww.org/ Функция возвращаетTRUE при успешном завершении функции и FALSE при неудачном завершении функции. В данном случае нас интересуют толькорыночные ордера, поэтому будем искать их, используя в функции OrderSelect() параметрMODE_TRADES. Для параметра pool в заголовке функции указано умолчательное значениеMODE_TRADES, поэтому его можно опустить.