324
размере 0.8 лотов останется ордер Buy объемом 0.2 лота. Поэтому после каждого
успешного закрытия необходимо снова обратиться к (теперь уже обновлённому) набору
ордеров, с тем, чтобы в этом наборе ордеров выявить два встречных ордера
максимального объема.
Указанные вычисления реализованы в (условно) бесконечном цикле while в блоках 2-10. В
начале этого цикла на каждой итерации делается предположение, что ордеров какого-либо
типа уже не осталось. Для этого переменным Hedg_Buy и Hedg_Sell присваивается
значение -1. Алгоритм блока обработки ордеров в целом сохранён (см. код closeby.mq4). В
цикле перебора ордеров for, а именно в блоке 3-4, так же, как и в предыдущих
программах, производится отсев "не наших" ордеров, в данном случае - открытых по
другому финансовому инструменту, а также отложенных ордеров.
В блоке 4-5 для каждого из ордеров, прошедших проверку в блоке 3-4, вычисляется его
объем. Если в процессе вычислений оказывается, что текущий обрабатываемый ордер
имеет больший размер из всех обрабатываемых, то запоминается его тикет. Это значит,
что на данной стадии вычислений ордер с этим номером является претендентом на
участие в операции встречного закрытия. К моменту окончания последней итерации
цикла for известны номера ордеров с максимальным количеством лотов, открытых в
разных направлениях. Эти ордера и являются выбранными. Если же к этому моменту
ордеров какого-либо типа уже нет, то в блоке 5-6 осуществляется выход из программы.
Блок 6-10 представляет обработку ошибок, он полностью аналогичен рассмотренным
ранее (в этом и предыдущем параграфах). Формирование торгового приказа для
встречного закрытия ордеров осуществляется в блоке 7-8 с помощью функции
OrderCloseBy(). В случае неудачи, в зависимости от кода ошибки, управление передаётся
либо на повторение попытки исполнения торговой операции (для тех же тикетов) либо
оператору return, в результате чего скрипт заканчивает работу.
Если торговая операция прошла успешно, то выполняется выход из блока обработки
ошибок, и заканчивается текущая итерация самого внешнего цикла обработки while. На
очередной итерации этого цикла все вычисления повторяются: выполняется опрос
имеющихся ордеров, отбор рыночных ордеров, выбор по одному тикету для каждого из
типов ордеров, формирование торгового приказа на встречное закрытие и последующий
анализ ошибок. Указанный цикл выполняется до тех пор, пока в терминале не закончатся
ордера какого-либо типа (или - в частном случае - обоих типов). Это событие будет
вычислено в блоке 5-6, в результате чего программа закончит работу.