Робот, просматривающий всю площадку одновременно. Быстрый старт в программировании

Робот, просматривающий всю площадку одновременно. Быстрый старт в программировании

В данной статье посмотрим робота, который торгует одновременно всю площадку, к которой подключён. Т.е. может торговать несколько десятков или сотен инструментов одновременно. Не пугайтесь! Это всё ещё чуть больше 200 строк кода, т.к. в OsEngine для этого есть специальный тип источника: BotTabScreener. Им и будем учиться пользоваться.

Прибыльность у данного скринера хорошая из коробки. На некоторых настройках около 0.5% на сделку на MOEX TOP 30 за 10 лет.

Логика робота.

По-простому, это импульсный трендовый робот на пробое верхней границы Bollinger с фильтром по Momentum. Вся его соль в том, что он смотрит весь рынок одновременно, и с ним удобно делать кросс-тесты (это когда тестируется торговля одной стратегии на множестве инструментов).

По пунктам:

1. Смотрим одновременно N инструментов по площадке.

2. Если по какому-то инструменту сложилась ситуация:

1. Текущая цена выше верхней линии боллинджера;

2. Текущее значение Momentum выше определённого значения (настраиваемое);

3. По другим инструментам не превышено одновременное кол-во открытых позиций;

4. Открываем ЛОНГ.

 

Шаг 1. Открываем исходный код робота BollingerMomentumScreener.

На ГитХаб он лежит здесь: ссылка

Внутри проекта тут:

 

Шаг 2. Конструктор. Создание источника скринера и его использование.

1. Создание поля для хранения источника скринер. Это нужно, чтобы в любом месте робота можно было потом обратиться к источнику.

2. Вызываем у робота процедуру создания источника типа BotTabScreener.

3. Источники такого типа хранятся в массиве TabsScreener. Сохраняем объект в ранее созданное поле.

4. Подписываемся на событие завершения свечи по какому-то инструменту. В обработчике этого события у нас будет логика.

5. Создаём два индикатора для скринера. В данном случае это Bollinger и Momentum. Они будут размещены НА ВСЕХ бумагах, которые Вы подключите в скринер.

 

Шаг 3. Создание параметров.

В примере можно подсмотреть сразу три типа параметра:

1. String – в данном случае перечисление.

2. Decimal – число с плавающей запятой.

3. Int – целое число.

1. Создание полей для хранения параметров. Это нужно, чтобы в любом месте робота можно было потом обратиться к параметру.

2. Создание самих параметров.

А так это выглядит в интерфейсе:

За что отвечают параметры:

1. Regime – режим работы.

1. Off – Выключен.

2. On – Включен и будет входить и в лонг и в шорт.

3. 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 – режим выбора объёма.

1. Contracts – кол-во контрактов инструмента.

2. Contract currency – валюта контракта.

3. Deposit percent – процент от депозита.

9. Volume – значение объёма. Что именно, зависит от предыдущего пункта. В случае Contracts тут указывается объём инструмента. В случае Contract currency здесь указывается кол-во рублей или долларов, которыми нужно войти. В случае с Deposit percent здесь указывается % от общего депозита, которым нужно войти в контракт.
10. Asset in portfolio – тут нужно указывать название валюты, которое будет использовано для расчёта объёма, если Вы выбрали тип объёма “Deposit percent”. В тестере оставляем «Prime». На крипте это обычно “USDT”.
11. Slippage % — проскальзывание для цен ордера.

 

 

Шаг 4. Логика.

Обработчик события завершения свечи по инструменту в скринере:

1. Обработчик события завершения свечи по какому-то инструменту в скринере. Точка входа в логику. В параметрах передаёт свечи инструмента и источник (BotTabSimple) инструмента, через который можно торговать.

2. Проверяем, включен ли робот и есть ли хотя бы несколько свечек по инструменту.

3. Запрашиваем у текущего инструмента (по которому завершилась свеча) его текущие открытые позиции.

4. Если позиций нет и режим работы робота не «Только закрытие», то заходим в метод открытия позиции.

5. Если позиции есть, заходим в метод закрытия позиции.

Логика открытия позиций:

1. Обращаемся к источнику скринера и проверяем, сколько позиций всего набрал робот по разным инструментам. Не превышает ли это то значение, которое указал пользователь.

2. Берём последнюю цену свечи. Закрытие.

3. Берём значение верхней линии Bollinger. Также в этом процессе проверяем, чтобы параметры индикатора на конкретном инструменте совпадали с тем, что пользователь установил в настройках робота.

4. Берём значение индикатора Momentum. Также в этом процессе проверяем, чтобы параметры индикатора на конкретном инструменте совпадали с тем, что пользователь установил в настройках робота.

5. Конечная логика открытия позиции:

1. Если цена закрытия последней свечи выше верхней линии Bollinger.

2. Если последнее значение Momentum выше уровня, установленного пользователем.

3. Открываем позицию.

 

 

Шаг 5. Подключение разных источников в интерфейсе и запуск тестера.

Если Вы никогда не настраивали источник BotTabScreener, то нужно почитать вот эту статью: https://smart-lab.ru/company/os_engine/blog/1030326.php

В итоге это выглядит так:

1. Робот в Bot Station Light выглядит, как и все остальные. Одна строка.

2. Если нажать на кнопку Chart у этого робота, то откроется окно робота, в котором можно подключить множество инструментов. Сам источник BotTabScreener это таблица с инструментами.

3. Если в таблице подключенных инструментов в скринер нажать на кнопку Chart, откроется окно конкретного инструмента, где можно посмотреть графики, сделки и индикаторы.

Удачных алгоритмов!

 

P.S.

Os Engine поддержка терминала: https://t.me/osengine_official_support 

Обсуждаем в телеграмме: https://t.me/o_s_a_chat

Канал проекта: https://t.me/bad_quant

 

19:20
178

Комментарии

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