684
превышает некоторую заданную величину (в нашем случае 10 пунктов). Для длительного
использования гораздо удобнее использовать эксперт, который запускается на исполнение
на каждом тике, а прекращает работу только в результате прямого указания пользователя.
Алгоритм представленного эксперта modifystoploss.mq4 очень прост. Основные
вычисления выполняются в цикле перебора ордеров (блок 2-9). Выбор ордера ведётся
среди рыночных и отложенных ордеров (параметр pool в вызове функции OrderSelect() не
указан явно). В блоке 2-3 отсортировываются отложенные ордера, а также ордера,
открытые по другому финансовому инструменту; для ордеров, прошедших отбор,
определяется значение StopLoss.
Блок 3-9 представляет цикл модификации выбранного ордера. В блоке 3-4 определяется
новое текущее значение ограничивающей дистанции (брокер может изменить это
значение в любой момент). В блоке 4-5 вычисляется необходимость модификации
отобранного ордера (текущего обрабатываемого в цикле for), а также новое значение
StopLoss. Если текущий ордер не требует модификации, то в конце блока 4-5
осуществляется выход из цикла while, и модификация этого ордера (в блоке 5-6) не
осуществляется. Если же ордер требует модификации, то управление передаётся в блок 5-
6, в котором вычисляются необходимые параметры и выполняется обращение к функции
OrderModify(), которая и формирует торговый приказ.
Если торговая операция завершилась успешно, то оператор break в блоке 6-7 заканчивает
исполнение цикла while, что приводит к окончанию текущей итерации цикла перебора
ордеров for (и на следующей итерации начинается обработка очередного ордера). Если же
торговая операция закончилась неудачей, то производится обработка ошибок. В случае,
когда ошибка оказывается не критической, попытка повторить торговую операцию
повторяется. Если же ошибка оценивается как критическая, то управление передаётся за
пределы цикла модификации для обработки следующего ордера (в цикле for).
Здесь необходимо обратить внимание на небольшую особенность, касающуюся
модификации рыночных ордеров. Функция OrderModify() устанавливает новые значения
цен одновременно для обоих стоп-приказов. При этом требование соблюдения
минимальной дистанции касается только того стоп-приказа, новое значение которого
отличается от текущего. Если же новое значение остаётся таким же, как текущее, то такой
стоп-приказ может находиться на любом расстоянии от рыночной цены, а
соответствующий торговый приказ является корректным.