Использование BotTabScreener в коде робота.

Использование BotTabScreener в коде робота.

Рассмотрим на примере, как можно использовать BotTabScreener для создания робота. В этой статье напишем свой скринер по мотивам робота, торгующего пробой ценового канала.

Для начала давайте составим не большое техническое задание. 

Итак, нам нужен индикатор ценового канала. Таковой уже имеется в программе – PriceChannel. При пересечении ценой верхней границы открывается длинная позиция. Выход осуществляется по обратному сигналу, то есть при пересечении ценой нижней границы канала. С шортами дела обстоят немного иначе. Входить будем по пробитию нижней границы, а вот выходить по трейлинг стопу. Все входы и выходы совершаться будут при помощи условных заявок. 

Для начала нам понадобится ряд параметров:

  1. Режим работы бота, On/Off, включен или выключен соответственно.
  2. Параметр для настройки длины верхней границы канала в индикаторе.
  3. Параметр для настройки длины нижней границы канала в индикаторе.
  4. Размер трейлинг стопа для коротких позиций.
  5. Объем для позиций.
  6. Проскальзывание для условных заявок в процентах от цены активации.

Чтобы не раздувать конструктор, инициализацию параметров предлагаю вынести в отдельный метод CreateParameters:

Рассмотрим конструктор класса:

  1. Создаем параметры.
  2. Создаем вкладку типа Screener и сохраняем ссылку в переменную.
  3. Подписываемся на событие добавления простой вкладки.
  4. Подписываемся на событие завершения очередной свечи.
  5. Подписываемся на событие успешного открытия позиции.
  6. Создаем список параметров для индикатора.
  7. Создаем индикатор для скринера.
  8. Подписываемся на событие изменения параметров стратегии.

Рассмотрим обработчик события добавления простой вкладки ScreenerNewTabCreateEvent.

В данном методе мы можем получить доступ к простой вкладке сразу после ее добавления в скринер. Это может быть полезно, например, для подписки на события, которые не доступны в скринере. В нашем случае мы обращаемся к свойству Connector и задаем обработчик для события SecuritySubscribeEvent, которое будет вызвано, когда завершится процесс подписки по инструменту.

Прежде чем перейти к обзору основной торговой логики, рассмотрим вспомогательные методы.

Метод CalcPriceSlippageUp принимает цену активации условной заявки, рассчитывает и возвращает цену ордера на покупку с учетом проскальзывания.

Метод CalcPriceSlippageDown принимает цену активации условной заявки, рассчитывает и возвращает цену ордера на продажу с учетом проскальзывания.

Метод CalcStopForShort принимает текущую цену, рассчитывает и возвращает цену активации стоп-лосс заявки для короткой позиции.

Далее разберем обработчик события завершения свечи. Метод ScreenerTabCandleFinishedEvent является основным местом выполнения торговой логики, принимает список свечей и простую вкладку, в которой произошло событие.

  1. Если робот выключен, выходим из метода.
  2. Проверяем, имеется ли достаточное количество свечей для формирования индикатора.
  3. Получаем доступ к индикатору. Мы знаем, что он у нас один, поэтому будет находиться по нулевому индексу.
  4. Если в обрабатываемой вкладке нет открытых позиций и нет условных заявок, выполняется логика открытия позиций, находящаяся в методе EnterLogic.
  5. Если же имеются открытые позиции, выполняется логика закрытия позиций в методе ExitLogic.

В методе EnterLogic создаются условные заявки на покупку и продажу по границам индикатора, пока выполняются описанные выше условия. Эти заявки живут на протяжении одной свечи, так как используются соответствующие перегрузки торговых методов BuyAtStop и SellAtStop.

  1. Цена активации условной заявки на покупку, которая соответствует верхней границе канала.
  2. Цена для ордера с учетом проскальзывания, который будет отправлен на биржу после пересечения ценой верхней линии индикатора.
  3. Даем вкладке команду на создание условной заявки на покупку.
  4. Цена активации условной заявки на продажу, которая соответствует нижней границе канала.
  5. Цена для ордера с учетом проскальзывания, который будет отправлен на биржу после пересечения ценой нижней линии индикатора.
  6. Даем вкладке команду на создание условной заявки на продажу.

После того, как будет исполнена одна из условных заявок, вторая отменится вкладкой, и будет вызвано событие PositionOpeningSuccesEvent. В методе обработчике ScreenerPositionOpeningSuccesEvent мы определяем, какая позиция была открыта. Если покупка, устанавливается обычный стоп по цене нижней границы индикатора. Если шорт, устанавливается трейлинг-стоп.


Далее, в обработчике события завершения свечи будет срабатывать метод ExitLogic, так как теперь у нас имеется открытая позиция.

  1. Если открыт лонг, значит перезагружаем стоп для позиции, потому что значение нижней границы канала изменяется, и нам нужно, чтобы стоп всегда ей соответствовал.
  2. Если же открыта короткая позиция, подтягиваем трейлинг стоп, используя для этого цену закрытия последней свечи по инструменту вкладки. Метод CloseAtTrailingStop сам проверяет, нужно ли подтянуть стоп. В нашем случае стоп будет двигаться только вниз, вслед за ценой.

Наконец рассмотрим последний созданный метод PanelParametrsChangeByUser, обработчик события ParametrsChangeByUser:

Данный метод сработает, когда пользователь изменит настройки в окне параметров. Как мы знаем у нас есть два параметра, предназначенных для настройки индикатора. Соответственно, после их изменения нужно изменить и индикатор. Для этого при помощи цикла пробегаемся по каждой простой вкладке, принадлежащей скринеру. Получаем доступ к индикатору и устанавливаем новые значения.

Файл с кодом робота можно взять по ссылке.

17:20
488
FAQ

Комментарии

Нет комментариев. Ваш будет первым!