В данной статье посмотрим робота, который торгует одновременно всю площадку, к которой подключён. Т.е. может торговать несколько десятков или сотен инструментов одновременно. Не пугайтесь! Это всё ещё чуть больше 200 строк кода, т.к. в OsEngine для этого есть специальный тип источника: BotTabScreener. Им и будем учиться пользоваться.
Прибыльность у данного скринера хорошая из коробки. На некоторых настройках около 0.5% на сделку на MOEX TOP 30 за 10 лет.
Логика робота.
По-простому, это импульсный трендовый робот на пробое верхней границы Bollinger с фильтром по Momentum. Вся его соль в том, что он смотрит весь рынок одновременно, и с ним удобно делать кросс-тесты (это когда тестируется торговля одной стратегии на множестве инструментов).
По пунктам:
- Смотрим одновременно N инструментов по площадке.
- Если по какому-то инструменту сложилась ситуация:
- Текущая цена выше верхней линии боллинджера;
- Текущее значение Momentum выше определённого значения (настраиваемое);
- По другим инструментам не превышено одновременное кол-во открытых позиций;
- Открываем ЛОНГ.
Далее будем разбирать, как робот устроен…
Шаг 1. Открываем исходный код робота BollingerMomentumScreener.
На ГитХаб он лежит здесь: https://github.com/AlexWan/OsEngine/blob/master/project/OsEngine/Robots/Screeners/BollingerMomentumScreener.cs
Внутри проекта тут:
Шаг 2. Конструктор. Создание источника скринера и его использование.
- Создание поля для хранения источника скринер. Это нужно, чтобы в любом месте робота можно было потом обратиться к источнику.
- Вызываем у робота процедуру создания источника типа BotTabScreener.
- Источники такого типа хранятся в массиве TabsScreener. Сохраняем объект в ранее созданное поле.
- Подписываемся на событие завершения свечи по какому-то инструменту. В обработчике этого события у нас будет логика.
- Создаём два индикатора для скринера. В данном случае это Bollinger и Momentum. Они будут размещены НА ВСЕХ бумагах, которые Вы подключите в скринер.
Шаг 3. Создание параметров.
В примере можно подсмотреть сразу три типа параметра:
- String – в данном случае перечисление.
- Decimal – число с плавающей запятой.
- Int – целое число.
- Создание полей для хранения параметров. Это нужно, чтобы в любом месте робота можно было потом обратиться к параметру.
- Создание самих параметров.
А так это выглядит в интерфейсе:
За что отвечают параметры:
1. Regime – режим работы.
- Off – Выключен.
- On – Включен и будет входить и в лонг и в шорт.
- OnlyClosePosition – сможет только закрыть позицию, а входить не будет.
2. Max positions – максимальное одновременное кол-во позиций.
3. Min momentum value – минимальное значение индикатора Momentum для открытия позиции.
4. Bollinger length – длина расчёта индикатора Bollinger.
5. Bollinger deviation – отклонение индикатора Bollinger.
6. Momentum length – длина расчёта индикатора Momentum.
7. Trail stop % — величина подтягивающегося стоп приказа.
8. Volume type – режим выбора объёма.
- Contracts – кол-во контрактов инструмента.
- Contract currency – валюта контракта.
- Deposit percent – процент от депозита.
9. Volume – значение объёма. Что именно, зависит от предыдущего пункта. В случае Contracts тут указывается объём инструмента. В случае Contract currency здесь указывается кол-во рублей или долларов, которыми нужно войти. В случае с Deposit percent здесь указывается % от общего депозита, которым нужно войти в контракт.
10. Asset in portfolio – тут нужно указывать название валюты, которое будет использовано для расчёта объёма, если Вы выбрали тип объёма “Deposit percent”. В тестере оставляем «Prime». На крипте это обычно “USDT”.
11. Slippage % — проскальзывание для цен ордера.
Шаг 4. Логика.
Обработчик события завершения свечи по инструменту в скринере:
- Обработчик события завершения свечи по какому-то инструменту в скринере. Точка входа в логику. В параметрах передаёт свечи инструмента и источник (BotTabSimple) инструмента, через который можно торговать.
- Проверяем, включен ли робот и есть ли хотя бы несколько свечек по инструменту.
- Запрашиваем у текущего инструмента (по которому завершилась свеча) его текущие открытые позиции.
- Если позиций нет и режим работы робота не «Только закрытие», то заходим в метод открытия позиции.
- Если позиции есть, заходим в метод закрытия позиции.
Логика открытия позиций:
- Обращаемся к источнику скринера и проверяем, сколько позиций всего набрал робот по разным инструментам. Не превышает ли это то значение, которое указал пользователь.
- Берём последнюю цену свечи. Закрытие.
- Берём значение верхней линии Bollinger. Также в этом процессе проверяем, чтобы параметры индикатора на конкретном инструменте совпадали с тем, что пользователь установил в настройках робота.
- Берём значение индикатора Momentum. Также в этом процессе проверяем, чтобы параметры индикатора на конкретном инструменте совпадали с тем, что пользователь установил в настройках робота.
- Конечная логика открытия позиции:
- Если цена закрытия последней свечи выше верхней линии Bollinger.
- Если последнее значение Momentum выше уровня, установленного пользователем.
- Открываем позицию.
Шаг 5. Подключение разных источников в интерфейсе и запуск тестера.
Если Вы никогда не настраивали источник BotTabScreener, то нужно почитать вот эту статью: https://smart-lab.ru/company/os_engine/blog/1030326.php
В итоге это выглядит так:
- Робот в Bot Station Light выглядит, как и все остальные. Одна строка.
- Если нажать на кнопку Chart у этого робота, то откроется окно робота, в котором можно подключить множество инструментов. Сам источник BotTabScreener это таблица с инструментами.
- Если в таблице подключенных инструментов в скринер нажать на кнопку Chart, откроется окно конкретного инструмента, где можно посмотреть графики, сделки и индикаторы.
Удачных алгоритмов!
Комментарии открыты для друзей!
OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support
Регистрируйся в АЛОР и получай бонусы: https://www.alorbroker.ru/open
Сайт АЛОР БРОКЕР: https://www.alorbroker.ru
Раздел «Для клиентов»: https://www.alorbroker.ru/openinfo/for-clients
Программа лояльности от АЛОР БРОКЕР и OsEngine: https://smart-lab.ru/company/os_engine/blog/972745.php