Данный пример робота – большой шаг для нас всех в сторону HFT и быстрых алгоритмов. Работающая модель котировщика в 600 строк кода с работающим тестером, у которого, чтобы это стало возможным, 30 тысяч строк кода логики и математики OsEngine под капотом.
И я несказанно рад, что мы заканчиваем публичную часть нашего Гайда по Сеткам на такой ноте. Сетки – не дерьмо, как я думал пару месяцев назад, начиная делать новый слой по сеткам под давлением сообщества. По крайней мере MarketMaking сетки и возможность их выбрасывать и остановить в 20 строк кода по любому сигналу – отличное начала для алгоритмов котировщиков. Это большой прорыв!
Сегодняшний пример: GridPair.
Тип сетки: MarketMaking.
Логика: Сигналом для выброса сетки служит раздвижка с «Графика минимальных остатков от разницы двух ценовых рядов с оптимальным мультипликатором», которая должна пробить уровень стандартного отклонения, умноженного на мультипликатор. Выход по обратному сигналу.
1. Пример в проекте.
Для начала Вам следует открыть исходный код робота GridPair. Внутри проекта это здесь:
Робот не из маленьких, поэтому для удобства разбит на три региона:
- Constructor, settings, service – сервисный код.
- Logic – основная торговая логика.
- Non trade periods – место хранения параметров и методов, отвечающих за неторговые периоды.
2. Конструктор.
Сеточники отличаются от обычного робота только способом открытия позиции. Т.е. конструкторы совершенно обычные. Данный робот использует источник BotTabScreener для работы с N инструментов одновременно.
ВАЖНО!!! Из скринера используются только первые ДВА источника. Т.е. если добавить потом в робота 3 или 30 источников, работать будут всё равно два. Это было сделано, чтобы было удобно открыть два окна источников рядом без лишней визуализации, как в BotTabPair.
- Блок кода, в котором мы создаём источник типа BotTabScreener. Сохраняем его в поле класса. Подписываемся на событие завершения свечи по какому-то инструменту. Подписываемся на событие старта теста для тестера.
- Создание параметров.
- Создание параметров для неторговых периодов, которые будут передаваться напрямую в сетки.
3. Параметры робота.
У данного робота три вкладки параметров, рассмотрим их по очереди.
Вкладка «Prime»:
- Regime – режим работы.
- Off – Выключен.
- On – Включен и будет входить в лонг.
- Deviation chart length – за какое кол-во свечек будет считаться «График минимальных остатков от разницы двух ценовых рядов с оптимальным мультипликатором».
- Standard deviation value – мультипликатор для стандартного отклонения, для съёма сигнала с «Графика минимальных остатков от разницы двух ценовых рядов с оптимальным мультипликатором».
- Volume type – режим выбора объёма.
- Contracts – кол-во контрактов инструмента.
- Contract currency – валюта контракта.
- Deposit percent – процент от депозита.
- Volume – значение объёма. Что именно, зависит от предыдущего пункта. В случае Contracts тут указывается объём инструмента. В случае Contract currency здесь указывается кол-во рублей или долларов, которыми нужно войти. В случае с Deposit percent здесь указывается % от общего депозита, которым нужно войти в контракт.
- Asset in portfolio – тут нужно указывать название валюты, которое будет использовано для расчёта объёма, если Вы выбрали тип объёма “Deposit percent”. В тестере и Т-Инвест оставляем «Prime». На крипте это обычно “USDT”.
*Все значения для объёмов указаны для одной линии.
Вкладка «Grid»:
- Grid lines count – количество линий в сетке.
- Grid lines step – шаг в % между линиями.
- Profit % – расстояние до закрывающего ордера.
Вкладка «Trade periods»:
Каждую настройку описывать не будем. Это полный дубль имеющихся в ручных настройках сетки неторговых периодов.
4. Точка входа в логику.
Завершение свечи по какому-то инструменту, подключенному в скринер:
- Если главный режим робота Off, ничего не делаем.
- Если в скринере источников меньше двух, ничего не делаем.
- Блок кода, в котором мы берём свечи у первых двух источников и проверяем, чтобы в последней свече было одинаковое время.
- Если уже существует ранее выброшенная сетка по инструменту, то заходим в логику её закрытия и удаления.
- Если сеток по источнику нет, вызываем метод для попытки выбросить сетку по условию.
5. Логика сигнала на выброс сетки.

- Фильтр по времени.
- Расчёт графика минимальных остатков.
- Зафиксирована ситуация, когда первая бумага ускорилась вниз, а вторая ускорилась вверх. По первой выставляем сетку на покупку, по второй на продажу.
- Зафиксирована ситуация, когда первая бумага ускорилась вверх, а вторая ускорилась вниз. По первой выставляем сетку на продажу, по второй на покупку.
6. Выброс сетки. Отдельным методом.
- Берём значение последнего закрытия свечи по инструменту.
- Создание основного объекта сетки.
- Устанавливаем тип сетки. В данном случае это MarketMaking. Т.е. будем заходить и выходить по каждой линии отдельно.
- Устанавливаем объёмы для сетки.
- Устанавливаем настройки для генерации сетки и вызываем метод генерации. После этого внутри сетки появляются линии, по которым будут в дальнейшем выставляться ордера.
- Устанавливаем неторговые периоды для сетки.
- Устанавливаем Trailing Up. Заметьте, что шаг сдвига рассчитывается в процентах. В данном случае это 0.2%, при этом вызван метод, обрезающий цены по цене инструмента.
- Устанавливаем Trailing Down. Заметьте, что шаг сдвига рассчитывается в процентах. В данном случае это 0.2%. При этом вызван метод, обрезающий цены по цене инструмента.
- Сохраняем то, что получилось.
- Включаем режим сетки в ON. После этого должны начать выставляться заявки.
7. Закрытие сетки по обратному сигналу.
Метод вызывается, когда уже есть выброшенные сетки в рынок.
Его смысл – сменить статус сетки на CloseForced, чтобы она закрылась, в случае, если наступило условие для закрытия сетки:
- Костыли. Если сетки нет или есть не все, выходим из метода. Должно быть две.
- Если у сеток режим уже не On – выходим.
- Расчёт графика «Минимальных остатков» и расчёт сигнала относительно линии стандартного отклонения, умноженного на мультипликатор.
- В случае, если получен противоположный к открытию сеток сигнал, переводим сетки в режим CloseForced.
8. Удаление сетки из памяти по завершению.
Метод вызывается, когда уже есть выброшенные сетки в рынок.
Его смысл – удалить аккуратно сетки из памяти, когда они уже своё отжили и отработали.
- Удаляем сетку, если она уже отработала.
В заключении.
Данный робот – отличная заготовка для создания маркет-мейкерских алгоритмов. Почти все инструменты, которые мной включались в пару во время тестов, показывают прибыль, совершая десятки тысяч сделок в год:

Конечно же нужно будет доработать скрипт, убрать переносы через ночь, оптимизировать параметры и много ещё чего. У меня список исследований по этому направлению включает несколько десятков пунктов.
И это прекрасная заготовка под роботов для маркетмейкинга в «нужное» время и «нужную» сторону.
Ещё раз поздравляю нас с выходом в зону HFT.
Удачных алгоритмов!
Пост из серии статей про Сеточных роботов: https://smart-lab.ru/company/os_engine/blog/1167610.php
Комментарии открыты для друзей!

https://smart-lab.ru/company/os_engine/blog/1024149.php
OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support
Канал научный трейдинг: https://t.me/bad_quant