На примере арбитражного бота разберем способ использования вкладки типа BotTabIndex.
Перед нами стоит следующая задача: построить график спреда двух торговых инструментов, набросить индикатор ценового канала на график и при расхождении спреда открывать разнонаправленные позиции. По сути, у нас должен получится двуногий арбитраж, который открывает позиции при расхождении спреда, в надежде дождаться сужения и выйти из позиций. В качестве канала будем использовать индикатор LastDayMiddle, который мы создавали в теме об индикаторах. Пример робота является демонстрационным и не гарантирует прибыли. Его задача - познакомить вас с возможностями BotTabIndex.
Рассмотрим список полей, используемых в роботе:

- Режим работы бота, On/Off, включен или выключен соответственно.
- Параметр для настройки размера отклонения для индикатора.
- Торговый объем для первого инструмента.
- Торговый объем для второго инструмента.
- Поле для хранения ссылки на индекс вкладку.
- Простая вкладка для первого инструмента.
- Простая вкладка для второго инструмента.
- Используемый в роботе индикатор.
Чтобы не раздувать конструктор, инициализацию параметров вынесем в отдельный метод CreateParameters:

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

- Создаем параметры.
- Создаем вкладку типа BotTabIndex и сохраняем ссылку в переменную. Это та самая вкладка, которая строит график спреда и уведомляет робота об изменении графика отношений между инструментами.
- Создаем вкладку типа BotTabSimple. Через нее будет вестись торговля первой бумагой.
- Создаем вкладку типа BotTabSimple для торговли второй бумагой.
- При помощи фабрики создаем нужный индикатор.
- Настраиваем индикатор, присваивая значение параметра отклонения.
- Прорисовываем созданный индикатор на графике спреда.
- Сохраняем настройки индикатора.
- Задаем обработчик события SpreadChangeEvent изменения графика спреда.
- Подписываемся на событие изменения параметров стратегии.
Тут следует сделать важное замечание по поводу метода CreateCandleIndicator. Он возвращает ссылку на индикатор, приведенный к интерфейсу IIndicator. Нам нужно выполнить приведение к типу Aindicator, чтобы получить доступ ко всем возможностям индикатора. И также обязательно нужно обновить ссылку индикатора в поле _dayMiddle.
При изменении параметров в обработчике события изменяем настройки индикатора, сохраняем и перезагружаем индикатор:

Далее рассмотрим метод обработчик события изменения спреда, в котором имеется пара фильтров:

- Если робот выключен, выходим из метода.
- Если последнее значение одной из серий индикатора равно нулю, значит индикатор еще не готов, выходим из метода.
- Вызываем метод с торговой логикой.
Рассмотрим основной метод робота, в котором содержится торговая логика:

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