Рассматриваемый здесь код эксперта ориентирован на реализацию одной конкретной
стратегии. Обратите внимание, некоторые программные строки содержат переменные и
вычисления, которые при изменении стратегии пришлось бы переписывать.
Например, в соответствии с принятой стратегией, эксперт ориентирован на работу только
с одним ордером. Это позволило использовать переменную Ticket как для идентификации
номера закрываемого ордера (в блоке закрытия 6-7), так и для идентификации успешности
исполнения торговой операции при открытии ордера (в блоке открытия 8-9). В данном
случае такое решение вполне приемлемо. Вместе с тем, если рассматриваемый код взять
за основу для реализации другой стратегии (например, позволять встречные ордера), то
придётся дополнительно ввести ещё одну или несколько переменных, чтобы иметь
возможность различать номера открытых ордеров и идентифицировать успешность
торговых операций.
При последующем совершенствовании или изменении стратегии придётся изменить и
некоторые программные строки, содержащие часть логики, заложенной в исходную
стратегию. В частности, в блоке учёта ордеров не нужно будет прерывать исполнение
программы в случаях, если по финансовому инструменту открыто несколько ордеров.
Кроме того, изменятся и условия, при которых необходимо открывать и закрывать ордера,
что неизбежно повлечёт за собой необходимость переписывания кода в блоках открытия и
закрытия.
На основании этих рассуждений нетрудно прийти к выводу, что представленный простой
эксперт не является совершенным. В общем случае для реализации учёта ордеров
необходимо использовать универсальную функцию, основанную на использовании
массивов данных, которая не несёт логики никакой конкретной стратегии. То же можно
сказать и о блоках открытия и закрытия ордеров. Более совершенная программа должна
содержать главную - аналитическую функцию, а все другие пользовательские функции
должны быть ей подчинены. В этой аналитической функции необходимо собрать
программный код, в котором анализируются все условия для реализации любой стратегии,
а всем подчинённым функциям передать лишь очень ограниченный круг обязанностей.
Функция учёта ордеров должна только учитывать ордера, функции открытия и закрытия
ордеров должны только открывать и закрывать ордера, а аналитическая функция должна
"думать" и всеми остальными управлять, т.е. при необходимости вызывать их для
исполнения
709