Почему я вообще за это взялся
Трейдинг всегда был моим «побочным интересом» — я читал литературу (Элдер, Швагер, Крейг), смотрел графики, торговал сам с 2018 года с переменным успехом. Главный вывод от ручной торговли: я не отличаюсь терпением. Видеть, как цена идёт против тебя, и не дёргаться — отдельный навык, который у инженера обычно вырабатывается слабее, чем у монаха.
Решение банальное: заменить себя машиной. Написать бота, который торгует по правилам, не паникует, не жалеет и не пропускает сделки из-за того, что «что-то мне не нравится сегодня». Так появился MOEX Trading Bot.
Сразу оговорка: это не про «лёгкие деньги» и не про «робот, который обгонит рынок». Алгоритмический трейдинг — это про дисциплину и статистику, а не про чудо. Я знал, во что лезу, и ожидания были реалистичные.
Challenge
Задачи, которые надо было решить, сводились к четырём пунктам:
- Интеграция с MOEX. Получать котировки в реальном времени, ставить заявки, управлять позицией. MOEX ISS API для данных, брокерский API (FINAM/Тинькофф Инвестиции) для исполнения.
- Стратегии. Не одна, а несколько, чтобы диверсифицировать по логике. Каждая стратегия — отдельный модуль, который можно включить/выключить.
- Риск-менеджмент. Главное правило: бот может ошибаться, но не может потерять всё. Стоп-лоссы, ограничение на размер позиции, дневной лимит убытков, kill switch.
- Бэктест. Прогон стратегии на исторических данных до того, как она пойдёт на реальный рынок. Без бэктеста запускать стратегию — это казино, а не алгоритмический трейдинг.
Solution: как устроено внутри
Языковая база — Node.js + TypeScript. Почему не Python? Во-первых, у меня больше опыта с Node, это моя рабочая инфраструктура. Во-вторых, async-IO в Node отлично ложится на работу с котировками в реальном времени. В-третьих, TypeScript даёт мне строгую типизацию на критически важных местах — ордерах, позициях, балансе.
Данные — MOEX ISS API. Свечи, стаканы, объёмы, данные по инструментам. Кеш свечей в SQLite, чтобы не бить по API на каждом прогоне бэктеста. Обновление в реальном времени — раз в минуту пул-реквест, для начала хватает.
Исполнение — через брокерский API. Тут всё стандартно: запрос на открытие позиции, мониторинг статуса ордера, обработка частичного исполнения и отмен.
Стратегии. В проект зашито три:
-
TrendFollow. Классический тренд-фолловинг на двух скользящих средних (быстрая + медленная) с подтверждением через ATR. Работает хорошо на трендовых бумагах с большой капитализацией (Сбер, Газпром, ЛУКОЙЛ) в трендовой фазе рынка. Ловит большие движения, проигрывает в боковике.
-
SwingLevel. Торговля на отбой от сильных уровней поддержки/сопротивления. Уровни определяются алгоритмически — по кластерам свечных экстремумов за N дней. Вход — на касании уровня с подтверждением разворотной свечи. Хорошо работает на бумагах с выраженной сезонностью.
-
Breakout. Пробой диапазона с фильтром по объёму. Берём последние 20 свечей, считаем хай/лоу диапазона, входим при закрытии за его границами с повышенным объёмом. Ловит импульсные движения, но даёт много ложных сигналов в вялом рынке — отсекаем фильтром «только в сессиях с объёмом выше среднего за 5 дней».
Каждая стратегия — отдельный модуль, принимает на вход свечи + параметры, возвращает сигналы и размер позиции. Чистая функция, легко тестируется в изоляции.
Риск-менеджмент — отдельный слой над стратегиями:
- Максимальный риск на сделку — 1% от депозита.
- Максимальный риск одновременно в работе — 3%.
- Дневной лимит убытков — 3%, после пробития бот останавливается до следующего дня.
- Stop-loss на уровне, заранее рассчитанном из ATR или уровня.
- Trailing-stop для выигрышных позиций.
- Kill switch: если бот встречает 5 критических ошибок подряд (отказ API, странные данные, несуществующий инструмент) — он останавливается сам и шлёт мне уведомление в Telegram.
Бэктест. Отдельный модуль, который прогоняет стратегию на исторических данных с учётом комиссий, проскальзываний и слиппеджа. Выдаёт метрики: win rate, profit factor, максимальная просадка, Sharpe ratio, среднее время в сделке, распределение результатов. Результаты рисую в HTML-отчёт — графики кривой капитала, гистограммы сделок, таблицы. В репозитории проекта лежат десятки таких отчётов (backtest_GAZP_*.html, backtest_SBER_*.html и т.д.), я их периодически просматриваю, ищу закономерности.
Процесс сборки
Бот собирался по той же методологии, что и все остальные проекты «Консоли» — PROMPTS.md + run-prompts.sh + Claude Code CLI. Подробнее про подход — в кейсе Stonekarelia.
Отличие — в трейдинге много «рыночной математики», где Claude хорошо помогает с формулами, но критически важно самому проверять логику. У меня на каждую стратегию был отдельный юнит-тест с размеченными вручную сигналами на синтетических данных, и только после их прохождения код шёл в бэктест.
Честно про результаты
Тут я обязан быть аккуратным — это не реклама и не приглашение «доверять мне свои деньги». Ничего подобного. Это мой личный инженерный проект.
Что получилось объективно:
- Автоматическая торговля 24/7 (точнее, в часы сессии MOEX). Бот работает сам.
- Система риск-менеджмента — главное, что я ценю. Психологически я теперь спокоен: я знаю, что хуже, чем -3% в день, меня не накроет.
- Подробная аналитика по каждой сделке — причина входа, причина выхода, комиссия, проскальзывание, метрики стратегии на тот момент.
- Несколько стратегий — когда одна в просадке, другая часто вытаскивает.
Что понял за первые сто сделок:
-
Бэктест врёт. Не потому, что он плохой, а потому, что реальный рынок — это проскальзывания, не заполненные заявки, остановки торгов, технические сбои. Реальная доходность обычно на 20–30% хуже бэктестовой. Это нормально, с этим надо закладываться заранее.
-
Просадки — это норма. Любая стратегия проходит через серию убыточных сделок. Психологически тяжело не выключить бота в просадке «на всякий случай», но именно в такие моменты ты сливаешь преимущество.
-
Комиссии и налоги едят больше, чем кажется. На стратегиях с частыми сделками комиссии съедали до половины валовой прибыли. Перевёл всё на более редкие сигналы — результат улучшился.
-
Риск-менеджмент важнее стратегии. Хорошая стратегия с плохим риском разоряет. Посредственная стратегия с хорошим риском — выживает и со временем находит edge.
-
Логируй всё. Каждое решение бота, каждая заявка, каждая ошибка API. В первые недели я бы уже сдался, если бы не мог посмотреть лог и понять, что произошло в конкретный момент.
Чему это научило меня как инженера
Главный вывод, который я забрал не в трейдинг, а во всю свою работу: любая автоматизация должна иметь kill switch. Не важно, торговый ли это бот, генератор контента для VK, или PDNGuard, который сам сканирует домены и ест токены Claude API. Должна быть кнопка «стоп», которая останавливает всё — автоматическая по условиям и ручная от меня.
Второй вывод: логи — это не «на потом». Логи пишутся сразу, в структурированном виде, чтобы их можно было анализировать. Я теперь на каждый более-менее серьёзный проект сразу заворачиваю structured logging, даже если проект «на два дня».
Что дальше
В планах — добавить ML-фильтр сигналов (классификатор «это хороший сигнал или ложный» на основе истории), интеграцию с другими брокерами для диверсификации, и, возможно, перенос части логики на Python — для удобства работы с анализом данных и бэктестами. Но всё это — мои личные эксперименты.
Если вам нужен специфический автоматический инструмент (не обязательно трейдинг — любая штука, где надо реагировать на события в реальном времени с риск-менеджментом) — поговорим.
Павел Гладышев — директор «Консоли» и бодрый инженер с избытком любопытства. Пишет код, читает про рынки, бегает по лесам. Не даёт инвестиционных советов — только технические.