9.2.2.13 Закрытие ордеров
Ранее указывалось, что данный эксперт предназначен для работы только с одним
рыночным ордером, открытым по финансовому инструменту, в окне которого работает
эксперт. К моменту, когда управление в программе передаётся в блок закрытия ордеров,
точно известно, что в текущий момент по финансовому инструменту либо вообще нет
ордеров, либо имеется только один рыночный ордер. Поэтому в блоке закрытия ордеров
код составлен таким образом, чтобы можно было успешно закрыть только один ордер.
Блок закрытия построен на основе бесконечного цикла while, тело которого состоит из
двух аналогичных частей: первая часть предназначена для закрытия ордера Buy, а вторая -
для закрытия Sell. Цикл while используется здесь для того, чтобы в случае неудачного
завершения торговой операции её можно было повторить.
В заголовке первого оператора if вычисляется условие для закрытия ордера Buy
( закрытие рыночных ордеров Sell происходит по аналогичному алгоритму). Если тип
ранее открытого ордера соответствует типу Buy (см. Типы торговых операций) и признак
закрытия ордера Buy является значимым, то управление передаётся в тело оператора if,
где формируется торговый приказ на закрытие. В качестве цены закрытия ордера в
функции OrderClose() указывается значение двухсторонней котировки, соответствующее
типу ордера (см. Требования и ограничения торговых операций). Если торговая операция
выполнена успешно, то после сообщения о закрытии ордера текущая итерация цикла while
прерывается, и, таким образом, исполнение блока закрытия ордеров заканчивается. Если
же операция закрытия закончилась неудачей, то вызывается для исполнения
пользовательская функция обработки ошибок Fun_Error() (блок 10-11).
9.2.2.14 Обработка ошибок
В качестве передаваемого параметра в функции Fun_Error() используется код последней
ошибки, вычисленной с помощью GetLastError(). В зависимости от кода ошибки функция
Fun_Error() возвращает 1 в случае, если ошибка преодолимая и торговую операцию можно
повторить, и 0, если возникла критическая ошибка. Критические ошибки в свою очередь
тоже делятся на два вида - те, после которых ещё можно продолжать исполнение
программы (например, общая ошибка) и те, при появлении которых необходимо
прекратить исполнение любых торговых операций (например, счёт заблокирован).
365