940
Для соблюдения указанного порядка закрытия ордеров в блоке 3-4 используется цикл for,
в котором среди всех ордеров заданного типа выбирается один ордер, имеющий
наибольшее количество лотов. Поиск этого ордера выполняется на основе анализа
значений элементов глобального массива Mas_Ord_New, содержащего информацию обо
всех ордерах, присутствующих в торговле. После того как номер этого ордера определён,
в зависимости от типа ордера вычисляется заявленная цена закрытия, равная
соответствующему значению последней известной двухсторонней котировки. Если тип
закрываемых ордеров Buy, то следует заявлять цену закрытия в соответствии со
значением Bid, а если Sell, - то Ask.
Непосредственно перед формированием торгового приказа выводится информация о
попытке закрыть ордер, для этого используется вызов функции Inform(). Торговый приказ
на закрытие ордера формируется в строке:
bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрыть ордер !:)
В качестве параметров используются вычисленные значения: Ticket - номер ордера, Lot -
количество лотов, Price_Cls - заявленная цена закрытия, 2 - проскальзывание.
В блоке 4-5 выполняется анализ результатов выполнения торговой операции. Если
функция OrderClose() вернула значение true, то это означает, что торговая операция
успешно завершена, т.е. ордер закрыт. В этом случае управление передаётся в блок 5-6,
где обновляется информация об ордерах, имеющихся на текущий момент. После
исполнения функций Terminal() и Events() текущая итерация цикла while заканчивается (за
время, пока исполняется функция, в том числе, выполняются торговые операции,
количество ордеров может измениться, поэтому исполнение функции учёта ордеров на
каждой итерации цикла while обязательно). В случае если в торговле ещё присутствуют
ордера заданного типа, то на следующей итерации цикла while они будут закрыты, при
этом для определения параметров очередного закрываемого ордера используются новые
значения элементов массивов Mas_Ord_New и Mas_Tip, полученные при исполнении
функции Terminal().
Если в результате исполнения торгового приказа функция OrderClose() вернула значение
false, то это значит, что ордер не закрыт. Чтобы выяснить причину неудачи выполняется
анализ последней ошибки, возникшей при попытке осуществления торговой операции.
Для этого вызывается функция Errors() (см. раздел Функция обработки ошибок). Если при
исполнении этой функции обнаруживается, что ошибка является непреодолимой
(например, торговля запрещена), то функция Close_All() заканчивает работу и возвращает