Инвестиции с нуля

От первого шага до первой прибыли

Робот Trend Plus

TrendPlus v1.0: Как я строю торгового робота, который чувствует тренд

Знаете, есть такое чувство, когда понимаешь: прошлый проект перешел в стадию длительного тестирования, но сидеть сложа руки не хочется. А значит пора двигаться дальше. Мой Scatter&Gather честно отрабатывает своё, но хочется чего-то более… элегантного, что ли. Не просто собирать данные, а именно ловить момент. Так родилась идея торгового робота TrendPlus.

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

Философия TrendPlus: не предсказывать, а следовать

Многие думают, что алгоритмическая торговля — это магия, где робот предсказывает цену на завтра. Я так не играю. Мой подход проще и, как мне кажется, честнее: мы не угадываем будущее, мы просто вовремя запрыгиваем в поезд, который уже тронулся.

TrendPlus построен на идее «Золотого креста» — ситуации, когда короткая скользящая средняя пересекает длинную снизу вверх. Это не гарантия роста, но хороший индикатор, который говорит: «Всё, парни, поехали». Задача робота — не спорить с рынком, а увидеть этот сигнал.

Но дьявол, как обычно, кроется в деталях. Нельзя просто взять первую попавшуюся акцию и искать на ее графике крест — нужно фильтровать, проверять, перепроверять. Именно поэтому родилась структура из четырёх стадий, где каждый следующий шаг — это воронка, отсеивающая лишнее.

Стадия 0 (завершена): подготовка, о которой часто забывают

Когда я только начинал писать TrendPlus, мне казалось: главное — это алгоритмы выбора акций и точки входа. Как же я ошибался. Первые тесты показали, что без внятной «предварительной стадии» робот напоминает человека, который пытается войти в закрытую дверь.

Как понять, работает биржа или нет?

Казалось бы, тривиальная задача. В QUIK есть статусы торгов, но привязать их не к чему — у нас же нет «базовой» акции, как в Scatter&Gather. Я перепробовал несколько подходов, пока не пришёл к простому и надёжному решению: берём трёх «китов» — Сбер, Газпром, Роснефть. Если торгуется хотя бы одна — рынок открыт.

Почему именно три? История знает случаи, когда отдельные бумаги замирали по техническим причинам. Например, утренняя сессия в день дивидендной отсечки: биржа запрещает торги акцией до начала основной сессии. Теоретически могут «замолчать» и две акции. Но чтобы на работающем рынке успокоились все три — такого я не встречал, а если случится, робот просто переждёт этот период.

Логи: моя память и моя совесть

Вторая головная боль — логирование. Scatter&Gather писал логи пачками, и через месяц папка с проектом весила как небольшой фильм. Тогда я пошел по пути разделения и ротации логов. В TrendPlus я развил эту идею: один основной лог + четыре стадийных. И ротация: сегодняшний лог живёт в одном файле, вчерашний — в .old, позавчерашний уходит в небытие.

Зачем хранить только двое суток? Для тестирования этого хватает с головой, а для глубокого анализа есть отдельные инструменты. Не люблю, когда код обрастает цифровым мусором.

Стадия 1 (завершена): отсев «мусорных» акций

Первый этап отбора — грубый и прагматичный. Из всего стакана Московской биржи мы выбираем 30 бумаг с максимальным объёмом торгов за предыдущий день. Не за текущий, не в реальном времени, а именно за вчера.

Здесь я совершил интересную эволюцию. В самой первой, «черновой» версии TrendPlus пытался опрашивать объёмы каждые 15 минут в течение дня. Казалось логичным: вдруг какая-то акция резко выстрелит? Но практика показала: на дневном таймфрейме волатильность объёмов в течение дня — это просто шум. Реальная картина складывается только к закрытию сессии.

Поэтому сейчас Стадия 1 запускается один раз в сутки, после закрытия биржи. Мы берём итоговые объёмы, ранжируем, фиксируем топ-30. И дальше эти 30 кандидатов уходят на второй этап.

Важный нюанс: получение вчерашних объёмов в QUIK оказалось нетривиальной задачей. API даёт текущие данные легко, а вот исторические — с плясками. Пришлось подключать дополнительные таблицы и смотреть на свечи не как на график, а как на источник информации. Но это уже детали реализации.

Стадия 2 (в разработке): охота на «Золотой крест»

Итак, у нас есть 30 самых ликвидных акций. Дальше — анализ дневного графика каждой. Именно здесь мы ищем тот самый «Золотой крест».

Используются две скользящие средние: быстрая и медленная. Когда быстрая поднимается над медленной — это технический сигнал начала восходящего тренда. Звучит просто, но на практике приходится учитывать кучу нюансов:

  • Насколько давно произошло пересечение? Если неделю назад — момент упущен.
  • Есть ли подтверждение объёмами? Иногда крест бывает «пустым», на низкой активности.
  • Как вела себя цена до пересечения? Была консолидация или резкий скачок?

В итоге из 30 бумаг мы выбираем одну-единственную, максимально подходящую под критерии. Именно она станет целью для следующего этапа.

Я часто сравниваю эту стадию с кастингом в кино. Приходят сотни актёров, у всех есть портфолио, но роль получает только один — тот, кто идеально вписывается в образ именно сейчас.

Стадия 3 (в разработке): часовой таймфрейм и поиск идеального момента

Теперь самое интересное. У нас есть акция, которая на дневном графике выглядит восходящей. Но входить прямо сейчас, по рынку — самоубийство. Дневной тренд может быть сильным, но внутри дня цена способна скорректироваться на 2–3%, и робот сразу уйдёт в минус.

Поэтому мы переходим на часовой таймфрейм. Задача — найти оптимальную точку входа внутри текущего дня.

Здесь я планирую поэкспериментировать с несколькими индикаторами:

  • Коррекция к скользящей средней — ждём, пока цена чуть откатится к растущей средней.
  • Пробой локального максимума — сигнал, что коррекция закончилась и движение продолжается.
  • Объёмы на часовках — подтверждение интереса крупных игроков.

Идея в том, чтобы не гнаться за ценой, а дать ей возможность «подвезти» нас. Представьте, что вы опаздываете на автобус. Можно бежать за ним и запрыгнуть на ходу (риск сорваться под колеса), а можно спокойно дождаться следующего.

Стадия 4 (в планах): управление позицией и выход

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

Вариантов закрытия сделки несколько, и выбор не окончательный:

1. Классический стоп-лосс — если цена пошла не туда, фиксируем убыток. Без этого никак, жадность губит профит.

2. Трейлинг-стоп — подвижная планка, которая подтягивается за растущей ценой. Если рынок идёт вверх, мы не закрываемся раньше времени, но при развороте сохраняем бóльшую часть прибыли.

3. ATR-стоп — основан на волатильности. Чем активнее движется бумага, тем шире «коридор безопасности».

4. Тейк-профит — фиксация прибыли при достижении целевого уровня.

5. Обратное пересечение средних — тот же «Золотой крест», только наоборот. Сигнал, что тренд выдохся.

Честно говоря, именно от этой стадии я ожидаю самых больших сложностей. Легко написать код, который покупает. Трудно — который вовремя и правильно продаёт. Эмоции в алготорговле отсутствуют, но жадность и страх умудряются просочиться даже в математические формулы.

Вместо послесловия: почему я пишу это в открытую

Многие мои знакомые удивляются: зачем я публикую детали своих проектов? Не боишься, что кто-то украдёт идею?

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

Я делюсь не рецептом, а историей. Надеюсь, она будет полезна тем, кто только начинает свой путь в алгоритмической торговле.