Жизненный цикл сиБота
В этой статье и сопровождающем ее видео мы рассмотрим структуру кода и объясним логику событий и жизненного цикла сиБота cTrader.
Напоминаем, что вы можете получить доступ к своим сиБотам в приложении Algo в cTrader. Чтобы создать нового сиБота, просто нажмите кнопку Новый сиБот или выберите этот параметр в выпадающем меню, показанном ниже.

Интерпретируйте базовый шаблон
После создания нового сиБота вы должны увидеть следующую базовую структуру в окне редактора кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
Обратите внимание, что в базовом шаблоне отображаются только три события; эти события обрабатываются методами OnStart(), OnTick() и OnStop(). Мы добавим два дополнительных метода (OnBar() и OnException()) и объясним, как они работают, позже; сначала мы обсудим метод OnStart().
Используйте метод OnStart()
Метод OnStart() запускается при первом запуске сиБота. Он используется для инициализации любых переменных, которые вы планируете использовать в своем сиБоте, включая индикаторы, счетчики, обработчики событий или таймеры.
Примечание
Начальный шаблон кода уже включает оператор кода для вывода сообщения в лог при запуске сиБота. Как видите, наш сиБот имеет параметр Message, и метод OnStart() передает значение этого параметра методу Print().
Мы можем продемонстрировать, как работает метод OnStart(), просто запустив экземпляр сиБота в приложении Trade и открыв вкладку Лог, чтобы увидеть результат.

Мы также можем в любой момент остановить сиБота, изменить значение параметра Message на вкладке Параметры и перезапустить наш экземпляр. При запуске наше новое сообщение все равно будет выведено в лог.


Используйте метод OnTick()
Метод OnTick() запускается каждый раз, когда изменяется цена покупки или продажи инструмента. Внутри этого метода вы обычно можете запрограммировать условия входа и выхода из позиции, а также любые другие вспомогательные функции, которые вам нужно запускать при поступлении нового тика данных.
Мы добавим следующий код в метод OnTick(), чтобы он выводил сообщение в лог.
1 | |
Как видите ниже, наш сиБот теперь выводит цены покупки и продажи в лог при каждом изменении цены.

Используйте метод OnBar()
Метод OnBar() не включен в шаблон кода сиБота по умолчанию, поэтому мы добавим следующий фрагмент кода, чтобы добавить его.
1 2 3 4 | |
Метод OnBar() запускается всякий раз, когда на графике, к которому прикреплен сиБот, рисуется новый бар или свеча. Подобно методу OnTick(), вы можете использовать метод OnBar() для программирования условий входа и выхода из позиции, а также любой другой логики, которую необходимо выполнять при формировании каждого нового бара.
Как запускается метод OnBar()
Если у вас график H1, новый бар формируется каждый час, что означает, что метод OnBar() будет вызываться один раз в час. Если у вас график м1, тот же метод будет вызываться один раз в минуту.
Наш метод OnBar() будет выводить "OnBar" на каждом новом баре/свече. Чтобы продемонстрировать, как это работает, мы прикрепим нашего сиБота к графику м1 и посмотрим на лог.

Используйте метод OnStop()
Метод OnStop() вызывается, когда сиБот останавливается либо пользователем, либо через код. Когда это происходит, выполняется любой код внутри метода OnStop(). Это можно использовать для выполнения финальных операций, таких как закрытие позиций.
Мы добавим следующий код в наш метод OnStop() — как обычно, наш сиБот выведет значение параметра Message, когда будет остановлен.
1 | |
На скриншоте ниже мы запускаем и останавливаем экземпляр нашего сиБота, чтобы продемонстрировать, как это работает.

Используйте метод OnException()
Метод OnException() обеспечивает отказоустойчивость, перехватывая необработанные исключения и позволяя вам решить, как с ними справиться. Он не включен в стандартный шаблон кода, поэтому мы добавим его сами, используя следующий фрагмент.
1 2 3 4 | |
Чтобы вызвать метод OnException(), мы напишем код для перехвата исключения, которое возникает при попытке получить доступ к информации о сделке, которая больше не существует. Мы добавим приведенный ниже код в наш метод OnStart().
1 | |
Код, который мы написали в методе OnStart(), выполнит рыночный ордер со следующими настраиваемыми параметрами.
- Тип сделки будет ордером на покупку.
- Сделка будет выполнена для текущего инструмента графика, к которому прикреплен сиБот.
- Объем ордера составит 1 000 единиц.
- Уникальная метка, прикрепленная к ордеру, будет "my label".
Мы также добавим следующий код в метод OnTick().
1 2 3 | |
Код, который мы написали в методе OnTick(), найдет позицию, которая была открыта в методе OnStart(), используя имя метки "my label".
Если позиция с такой же меткой будет найдена, он выведет в лог ID позиции открытой сделки. Он также выведет другое сообщение под названием "Message below", когда будет выполнена следующая строка кода.
Когда наш сиБот запущен и вызывается метод OnTick(), и ордер найден, сиБот выведет ID ордера в лог, а после ID ордера выведет сообщение "Message below".

Как видите, никаких исключений не возникает, и наш сиБот выполняет свою работу идеально.
Теперь, однако, мы вручную закроем позицию, открытую сиБотом, и внесем небольшие изменения в код, чтобы гарантированно произошло исключение. В методе OnStart() мы изменим метку ордера на "cTrader". В методе OnTick() мы закомментируем условие, которое проверяет, существует ли позиция с меткой "my label".
Вот финальный код нашего сиБота — обратите внимание, что этот код всегда будет вызывать исключение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
Мы снова запустим сиБота и посмотрим, что произойдет.

Произошло следующее: новый рыночный ордер был создан при запуске сиБота. Метка, прикрепленная к этому ордеру, была "cTrader". В методе OnTick() код попытался получить позицию с меткой "my label", и поскольку мы закомментировали строку кода с условием. Затем он попытался вывести в лог ID позиции.
Это вызвало ошибку исключения, которая обычно остановила бы сиБота в предыдущих версиях cTrader, но с новым методом OnException() мы теперь можем перехватить это и обработать ошибку. СиБот продолжит работу, и мы можем записать ошибку в лог, чтобы ее можно было исправить.
Обзор
Жизненный цикл сиБота состоит из нескольких ключевых событий, которые вы можете обрабатывать с помощью методов OnStart(), OnTick(), OnStop(), OnBar() и OnException(). Настраивая реакцию вашего сиБота на основные события, вы можете гарантировать, что ваши алгоритмы будут вести себя именно так, как ожидается.