Если уровень стопа составляет 3 пункта, как показано выше, то дробное значение будет 0,0003. Но в периоды быстрого движения цены действительные цены стоп-лосса могут быть признаны недействительными за счет расширения спредов. Разные брокеры имеют разные уровни стопов, поэтому стоп-лосс, действительный для одного брокера, может быть слишком близким для другого. Некоторые торговые системы устанавливают цены стопов и отложенных ордеров на основании значений индикатора, максимумов или минимумов цены или другого метода расчета, когда минимальное расстояние не может быть гарантировано. Измененная цена ордера также не должна быть слишком близкой к текущей цене Bid или Ask.
Функция OrderSend()
Если вы пишете торговых роботов, обратите внимание на новую функцию OrderSendAsync, предназначенную для проведения асинхронных торговых операций. Эта функция выполняется менее чем за 1 миллисекунду (не ждёт ответа торгового сервера на отправленный запрос) https://fxglossary.org/ и тут же возвращает управление. Низкие сетевые издержки, высокая скорость обновления стакана и асинхронная отсылка приказов в десятки раз ускоряют торговые операции. Для интрадей систем скорость торговых операций может являться ключевым фактором.
Функция WindowPriceOnDropped()
В этом случае на текущей итерации цикла for этот ордерзапоминается как первый претендент на закрытие. Например, функция OrderOpenPrice() возвращает значениецены открытия ордера (или заявленной цены для отложенных ордеров), функция OrderLots()возвращает количество лотов, функция OrderType() возвращает тип ордера и т.д. Всефункции, возвращающие значение какой-либо характеристики ордера, при исполненииобращаются к тому ордеру, который был выбран с помощью функции OrderSelect().
Требования и ограничения при проведении торговых операций
Отложенные ордера устанавливаются ниже или выше текущей цены. Рыночный ордер Sell со стоп-приказами, максимально приближенными к рыночной цене. Скрипт closeby.mq4 удобно использовать при ручной торговле, особенно в случаях, когда в окне финансовогоинструмента имеется множество разнонаправленных рыночных ордеров. Легко заметить, что каждая из рассматриваемых функций (OrderTakeProfit (), OrderProfit()и OrderLots() не имеет настраиваемых параметров, т.е. Не предусматривает указание,например, номера ордера, чтобы возвращаемое функцией значение соответствовало характеристикеконкретного ордера.
Это означает, что размер вашего лота не должен быть слишком большим или слишком маленьким, и его не следует указывать в микролотах (0,01), если ваш брокер их не поддерживает. Вам также следует нормализовать размер вашего лота до соответствующего десятичного знака. Помимо выбора подходящего уровня стоп-лосса и тейк-профита, использование подходящего размера лота является одним из лучших инструментов управления рисками. Задать размер лота можно так же просто, как объявить внешнюю переменную или использовать фиксированный размера лота для каждого ордера. Мы рассмотрим более сложный метод, который вычисляет размер лота на основе максимальной суммы, которую вы готовы потерять за сделку.
Прежде всего, необходимо указать на принцип, используемый брокерскими компаниямидля формирования цен по финансовым инструментам. Этот принцип состоит в том, чтодля проведения торговых операций брокер предлагает трейдеру двухстороннюю котировку. Как мы говорили выше, отложенные ордера по нашей стратегии необходимо удалять, чтобы подчищать за собой в конце каждой недели.
Мы будем использовать внешнюю переменную EquityPercent, чтобы установить процент использования капитала. Мы предполагаем, что используется стоп-лосс в 50 пипсов. Если рассчитанный стоп-лосс выше уровня стопа и, следовательно, находится слишком близок к цене, функция Alert() отобразит всплывающее сообщение для пользователя.
При наступлении этого срока отложенный ордербудет автоматически закрыт на торговом сервере. На некоторых торговых серверахможет быть установлен запрет на применение срока истечения отложенных ордеров.В этом случае при попытке задать ненулевое значение параметра торговый приказ будетотклонён. В результате рассматриваемых событий рыночный ордер Buy был открыт по цене на 25пунктов хуже в сравнении с ценой отложенного ордера BuyStop. Аналогичная ситуация(недополучение прибыли по ордеру) может сложиться и для ордера SellStop в случае,если цена скачкообразно понижается. Если же в разрыв цен попадает отложенный ордерBuyLimit или SellLimit, то соответствующий рыночный может быть открыт по цене лучшей,чем цена, заявленная в отложенном ордере.
Сначала мы проверяем, являются ли внешние переменные StopLoss и TakeProfit больше нуля. Некоторые ошибки могут возникать по причинам, обусловленным сервером. Например,в условиях быстро изменяющихся цен брокер может увеличить минимальную дистанцию,ограничивающую положение отложенных ордеров и стоп-приказов. В дальнейшем, приспокойном рынке, брокер может снова уменьшить эту дистанцию. Таким образом, значениянекоторых параметров могут быть изменены в любой момент. Получить информацию о том, хватает ли текущих средств для открытия ордера можнорасчётным путём.
- В данном случае нас интересуют толькорыночные ордера, поэтому будем искать их, используя в функции OrderSelect() параметрMODE_TRADES.
- Торговый терминал получил информацию о том, что последний торговый приказ исполнен,отразил это событие в окне терминала и в окне финансового инструмента и вернулуправление программе.
- Блок 4-5 предназначен для того, чтобы из всех (ранее прошедших проверку) рыночныхордеров выбрать один, а именно тот, который находится ближе всего к ранее определённойцене (значению переменной Win_Price).
- Здесь оно указанотолько для того, чтобы при опробовании скрипта на демо-счёте было легче сориентироваться- когда программа закончила работу, а когда возникла пауза, связанная с задержкамив сети или на сервере.
- На мини-счете рассчитанный размер лота составит 4 лота.
Рассмотрим и некоторые другие наиболее распространённые ошибки. Для этого вернёмсяк идее открытия ордера с помощью скрипта в том окне, в которое присоединён скрипт. Для правильного формирования торговых приказов в прикладных программах (экспертах и скриптах) необходимо принимать во вниманиеимеющиеся требования и ограничения. 68 показано окно финансового инструмента, в котором можно наблюдать графикизменения цены Bid и двухстороннюю котировку – линию текущей цены Bid (чёрного цвета,1.3005) и линию текущей цены Ask (красного цвета, 1.3007). Легко увидеть, что вданном случае брокер предлагает спред, равный 2 пунктам.
В последующих событиях с помощью представленного скрипта были закрыты и два другихрыночных ордера. Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. После того как указаны все необходимые данные, необходимо нажать на кнопку “Sell” или “Buy”. При этом брокеру отсылается ордер на открытие короткой или длинной позиции соответственно. Затем в появившемся окне необходимо задать новые значения ордеров Стоп Лосс или Тейк Профит и нажать кнопку “Изменить”. При размещении, изменении или закрытии ордеров могут возникать ошибки из-за неверных торговых параметров, реквотов или проблем с сервером.
При этом во вкладке “Терминал — Торговля” появится строка состояния открытой позиции, а на графике (если включена опция “Показывать торговые уровни”) появятся уровни цены открытия и Стоп Лосс и Тейк Профит. Если произошла ошибка, возвращаемое значение будет ложным. События, произошедшие при исполнении скрипта closeby.mq4. Сообщения, полученные при исполнении скрипта closeby.mq4. Результат встречного закрытия ордеров с помощью функции OrderCloseBy(). Результат отдельного закрытия ордеров с помощью функции OrderClose().
Выставлении нового отложенного ордера, или открытии рыночной позиции? Есть ли уже к этому времени открытые рыночные позиции, и нужно удалить отложки при открытии новой позиции? Нет вообще позиций, но есть отложки, и при срабатывании любой из отложек, нужно удалить все остальные? Изменение текущей позиции заключается в установке новых уровней прикрепленных ордеров Стоп Лосс или Тейк Профит. Вы можете создать аналогичные процедуры обработки ошибок и для других функций, особенно для функций OrderModify() и OrderClose(). Вы также можете создавать более сложные процедуры обработки ошибок, которые предоставляют настраиваемые сообщения об ошибках на основе кода ошибки, или выполнять другие действия.
Открытие рыночного ордера предполагает покупку или продажу активов по финансовомуинструменту по рыночным ценам, сложившимся на текущий момент (см. Требования и ограничения торговых операций). Если бы заранее было точно известно, что в течение периода закрытия ордеров ценане изменится, то порядок закрытия ордеров не имел бы значения. Однако за то время,пока исполняется торговый приказ на закрытие одного из ордеров, цена может измениться.Поэтому, закрыть следует тот ордер, который при неблагоприятном развитии событийпринесёт больше вреда. При изменении цены на 1 пункт прибыль по первому ордерууменьшится на $5, а по второму – на $10. Очевидно, что вреда будет больше от второгоордера, т.е. Таким образом, в вопросе о порядке закрытияордеров определяющее значение имеет количество лотов.
Мы добавим модификацию ордера, проверку уровня стопа, проверку контекста сделки, обновление предопределенной переменной и размер лота. Наконец, мы распечатаем соответствующую информацию о цене в журнале с помощью функции Print(). Наряду с текущими ценами Bid и Ask мы будем включать параметры торговли, такие как размер лота и цена ордера. Если наша цена Ask составляет 1,4650, а StopLevel равен 0,0003 пункта, как рассчитано выше, минимальная цена уровня стопа будет 1,4653.
В соответствии с первым вариантом необходимый фрагмент программного кода (в которомвыполняется анализ ордеров) прописывается непосредственно в том месте программы,где нужно выяснить текущий набор ордеров и их характеристики. Такое решение техническиосуществимо, но оказывается неэффективным, когда необходимо внести изменения валгоритм. В этом случае программист вынужден анализировать все места программы,где анализируется состояние ордеров, и вносить изменения в каждом месте. Второй,более эффективный вариант решения, заключается в том, чтобы один раз создать универсальнуюфункцию учёта ордеров и использовать её всякий раз, когда требуется обновить информациюо текущем состоянии ордеров. Такое решение, с одной стороны, позволяет значительносократить код программы, а с другой стороны, предоставляет программисту возможностьиспользовать готовую функцию при составлении других программ.
Но для тестера стратегий с одним ордером в рынке сойдёт и Ваш вариант. Opposite – Уникальный порядковый номер противоположного ордера. Ticket – Уникальный порядковый номер закрываемого ордера. Отражение в окне Терминала нескольких ордеров, открытых по разным финансовыминструментам. Index – позиция ордера или номер ордера в зависимости от второго параметра.
Каждый элементмассива со вторым индексом, равным 1, содержит значение курса открытия ордера,с индексом 2 – значение StopLoss ордера, 3 – TakeProfit ордера и т.д. Элемент массива с индексом [0][0] имеет значение, равное общему количествуордеров, содержащихся в массиве. Все элементы массива с первым или вторым индексом,равным 0, не используются (кроме элемента с индексом [0][0]).
Например, используя функцию WindowPriceOnDropped()можно получить значение прикрепления скрипта по оси ординат. Аналогичное изменение кода следует выполнить в блоке 5-6 и для другого стоп-приказа. Для тех валютных инструментов, у которых в знаменателе указан USD, стоимость 1 лотаравна текущей цене соответствующей двухсторонней котировки, умноженной на 1000,стоимость 1 пункта равна $10. Код ошибки, полученный при исполнении скрипта confined.mq4 в окне Eur/Usd. Функция возвращает код последней ошибки, после чего значение специальной переменнойlast_error, в которой хранится код последней ошибки, обнуляется. Может использоваться как определяемый пользователемидентификатор ордера.
Модифицированный ордер со стоп-приказами, максимально приближенными крыночной цене. Если же разрыв цен происходит в пределах одного бара, то такой разрыввизуально определить нельзя (рис. 75б). А) разрыв цен произошёл между барами б) разрыв цен произошёл при формировании бараРис. Преобразование отложенного ордера в рыночный при разрыве цен.
2% от долларов — это 200 долларов, и они будут храниться в переменной RiskAmount. Если изменение ордера выполнено успешно, OrderModify() вернет значение true. В результате вычислений в теле оператора if () переменная Dist_SL может получитьновое значение. Предположим, что обычно минимальная дистанция составляет 5 пунктов.Предположим, что при первом исполнении (на быстром рынке) это значение установленона сервере равным 20 пунктов. При составлении программ очень важно также учитывать принцип формирования свободныхсредств.
В некоторых случаях это – единственная информация, по которойможно судить о принадлежности ордера к той или иной открывшей его программе. Параметрустанавливается пользователем, может совпадать или не совпадать со значением этогоже параметра других ордеров. Двухсторонняя плюсы заработка на форекс котировка – связанная пара рыночных цен, предлагаемых брокером для осуществления покупки и продажиактивов по финансовому инструменту в текущий момент. Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Но когда вы учитываете задержки ответа торгового сервера и тот факт, что цены могут меняться очень быстро, важно, чтобы вы всегда использовали самые актуальные цены. Функция IsTradeContextBusy() вернет true, если поток исполнения сделки занят. Мы будем вызывать эту функцию непосредственно перед вызовом любых торговых функций, включая OrderSend(), OrderClose(), OrderDelete() или OrderModify(). Давайте сначала проверим минимальный и максимальный размер лота. Функция MarketInfo(), использующая параметры MODE_MINLOT и MODE_MAXLOT, будет использоваться для сравнения размера текущего лота с минимальным и максимальным размером лота. Если размер лота недействителен, он будет автоматически изменен до минимального или максимального.
Небольшая разница состоитлишь в том, что для удаления отложенного ордера не требуется цена закрытия, поэтомув следующей программе отсутствует блок, в котором обновляются рыночные цены. Если код ошибки не обрабатывается в первом операторе switch, то эта ошибка считаетсянепреодолимой. В этом случае управление передаётся второму оператору switch, смыслисполнения которого сводится к информированию пользователя о возникновении тойили иной критической ошибки. В дальнейшем исполняется оператор break, прерывающийисполнение цикла while. Выход из цикла while по любой причине приводит к передачеуправления в блок 9-10, в котором выдаётся сообщение о завершении работы программы.Оператор return прекращает исполнение специальной функции start() и программа завершаетработу.
Немаловажное значение имеет правильная оценка программистом той или иной характеристикиордера. Например, при решении задачи о порядке закрытия ордеров, необходимо задатьсякакими-то критериями, чтобы вычислить, какой из ордеров необходимо закрыть раньше,а какой после. Открытие позиции или вход в рынок — это первичная покупка или продажа определенного объема торгуемого финансового инструмента. Открытие позиции происходит как при исполнении рыночного ордера, так и при автоматическом исполнении отложенного ордера. Второй индекс массива (столбцы) соответствует характеристикам ордеров.
Для открытия рыночных ордеров используются функции OrderSend( ), а для закрытия- функция OrderClose( ). Возможно выставитьотложенный ордер, многократно превышающий по стоимости имеющиеся на счёте средства.Такой ордер может находиться в торговле неопределённо долгое время. В момент, когдарыночная цена достигнет уровня заявленной в отложенном что такое депозит ордере цены открытия, насервере будет произведена проверка. Если в этот момент средств на счёте достаточнодля открытия, то ордер будет преобразован в рыночный (открыт), если же нет – тоон будет удалён. Slippage – максимально допустимое отклонение заявленной цены открытия ордера от рыночнойцены для рыночных ордеров (пунктов).
Оператор возврата выходит из текущей функции и гарантирует, что ордер не будет размещен. Следующий код рассчитывает максимально допустимую цену для тейк-профита на продажу, стоп-лосс на покупку, стоп-ордер на продажу или лимитного ордера на продажу. Обратите внимание, что мы просто используем Bid вместо Ask и вычитаем вместо добавления.
В случае ошибочных, а также ненормализованных стопов генерируется ошибка 130 (ERR_INVALID_STOPS). Во втором случае GetLastError() может возвращать ошибку 130, так как уровень MODE_STOPLEVEL фактически является “плавающим”. Для проведения торговых операций в языке MQL5 представлены функции по работе с ордерами, сделками и позициями. Кнопка “Установить ордер” отправляет ордер на исполнение, которое происходит в два этапа. После выдачи ордера брокерская компания производит его установку. При этом во вкладке “Терминал — Торговля” появится строка с номером и состоянием отложенного ордера.
Для открытых позиций это – текущая нереализованная прибыль. Ордер должен быть предварительно выбран с помощьюфункции OrderSelect(). Массивы Mas_Ord_New и Mas_Ord_Old подобны и имеют одинаковую размерность; разницамежду ними заключается лишь в том, что первый из них отражает текущее состояниеордеров, а второй – предшествующее. Рассмотрим детально, какие значения содержатсяв элементах этих массивов. Идея заключается в том, что у меня по времени создается отложенный ордер и если он через, например, 4 часа так и не вошел в рынок, то его следует удалить, но если вошел, ничего не делать и ждать чем это закончится -TP или SL.
Блок 6-10 представляет обработку ошибок, он полностью аналогичен рассмотренным ранее(в этом и предыдущем параграфах). Формирование торгового приказа для встречногозакрытия ордеров осуществляется в блоке 7-8 с помощью функции OrderCloseBy(). Вслучае неудачи, в зависимости от кода ошибки, управление передаётся либо на повторениепопытки исполнения торговой операции (для тех же тикетов) либо оператору return,в результате чего скрипт заканчивает работу.