📐 Fibonacci + DeMark: новая торговая стратегия в боте для MOEX
Сегодня расскажу о крупном обновлении проекта торгового бота для Московской биржи – интеграции стратегии на основе уровней Фибоначчи и трендового фильтра DeMark. Это четвертый режим работы бота, который показал впечатляющие результаты на бэктестах.
🎯 Зачем ещё одна стратегия
До сегодняшнего дня бот работал в трёх режимах:
- LongOnly – только покупки, для растущего рынка
- ShortOnly – только продажи, для падающего рынка
- MLAuto – ML-модель сама решает направление сделки (RSI + ATR + BB)
ML-режим показывал стабильные результаты, но у него есть ограничение: он опирается на спредовую стратегию и ждёт, пока рынок “раздвинет” спред до нужного порога. На фьючерсе GAZPF с его узким спредом это означает длительное ожидание между сделками.
Идея: добавить принципиально другой подход – торговлю от ключевых
ценовых уровней.
📊 Что такое уровни Фибоначчи в трейдинге
Уровни Фибоначчи – это математически рассчитанные ценовые зоны, от
которых цена с высокой вероятностью отскакивает. Бот находит последний
значимый ценовой свинг (движение вверх или вниз) и строит сетку
уровней:
Свинг вверх: 100.00 → 110.00 (откат сверху вниз)
110.00 ─── Вершина свинга (0% коррекции)
107.64 ─── Уровень 0.236
106.18 ─── Уровень 0.382
105.00 ─── Уровень 0.500
103.82 ─── Уровень 0.618 (золотое сечение)
102.14 ─── Уровень 0.786
100.00 ─── Основание свинга (100% коррекции)
Когда цена откатывает к одному из этих уровней и разворачивается –
это сигнал на вход в позицию. Take-profit и stop-loss тоже
рассчитываются по сетке Фибоначчи.
🔬 Фильтр DeMark: не каждый откат – сигнал
Простое использование уровней Фибоначчи давало бы слишком много
ложных сигналов. Поэтому добавлен трендовый фильтр DeMark – классический
индикатор, определяющий направление тренда по последовательности
экстремумов.
Логика фильтрации:
- Определяем тренд – DeMark анализирует 36 последних
баров - Фильтруем сигналы – покупаем только в растущем
тренде, продаём только в падающем - Проверяем коридор – минимальный размер свинга
должен быть >= 0.5%, чтобы отсечь шум
Это ключевое отличие от наивного подхода: мы торгуем откаты в
направлении тренда, а не пытаемся ловить развороты.
📈 Результаты бэктестов
Стратегию протестировали на двух наборах данных:
Инструмент
Таймфрейм
Свечей
Win Rate
Profit Factor
Max DD
GAZP
Daily
1079
81.5%
7.88
-4.15%
GAZPF
5-min
1003
80.8%
4.90
–
Win Rate 80.8% на 5-минутных данных фьючерса GAZPF –
это означает, что 4 из 5 сделок закрываются в плюс. Profit
Factor 4.90 говорит о том, что на каждый потерянный рубль
стратегия зарабатывает почти 5.
Для сравнения: ML-стратегия (RSI + ATR + Bollinger Bands) показывает
WR ~50% и PF ~1.2 на тех же данных. Разница существенная.
🔧 Как это реализовано
Интеграция заняла 10 фаз разработки, затронула 17 файлов (+1726 строк
кода):
Архитектура решения
┌─────────────────────────────────────────────┐
│ bot4rest (Rust) │
│ │
│ --mode fibonacci │
│ │ │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ Fibonacci Detector │ │
│ │ ┌───────────────────┐ │ │
│ │ │ 1. Fetch candles │ │ PostgreSQL │
│ │ │ from DB (200) │──│──► OHLC data │
│ │ │ 2. Find swings │ │ │
│ │ │ 3. Build fib grid │ │ │
│ │ │ 4. DeMark filter │ │ │
│ │ │ 5. Generate signal│ │ │
│ │ └───────────────────┘ │ │
│ └────────────┬────────────┘ │
│ │ FibLiveSignal │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ Entry Handler │ │
│ │ - TP/SL from fib grid │ │
│ │ - Direction from trend │ │
│ │ - Finam API order │ │
│ └─────────────────────────┘ │
└─────────────────────────────────────────────┘
Ключевые параметры стратегии
Параметр
Значение
Описание
fib_min_swing_pct
1.0%
Мин. размер свинга для построения
fib_swing_lookback
12 баров
Окно поиска свингов
fib_trend_lookback
36 баров
Окно трендового фильтра DeMark
fib_max_hold_bars
48 баров
Макс. время удержания позиции
fib_min_corridor
0.5%
Мин. коридор (фильтр шума)
candle_lookback
200
Количество свечей из БД
Все параметры оптимизированы на 5-минутных данных GAZPF из
бэктеста.
Что переиспользовали
Важный принцип: не дублировать код. Стратегия Фибоначчи уже была
реализована как отдельный модуль для бэктестов. Для интеграции в бот
мы:
- Переиспользовали
FibonacciStrategy::generate_signals() - Переиспользовали
FibonacciStrategy::detect_trend() - Использовали существующие функции входа в позицию с TP/SL
- Читаем данные из той же таблицы
ml_features.trade_intervals
Новый код – это “клей” между существующими компонентами: детектор
сигналов в реальном времени и обработчик входа в позицию.
🚀 Развёртывание и баги
Деплой на сервер выявил 4 бага, которых не было в локальных
тестах:
1. Конфликт lock-файлов
Проблема: Оба бота (ML и Fibonacci) использовали
один файл /tmp/bot4rest.lock. Второй бот не мог
запуститься.
Решение: Каждый режим получил свой lock-файл:
- ML-бот:
/tmp/bot4rest.lock - Fibonacci-бот:
/tmp/bot4rest-fibonacci.lock
2. Неправильный символ торговли
Проблема: Бот торговал SBERF вместо GAZPF, хотя в
командной строке указан --symbols GAZPF@RTSX.
Причина: Внутренняя переменнаяconfig.symbol не синхронизировалась с флагом--symbols.
Решение: Добавлена автосинхронизация для режима
одного инструмента.
3. Переполнение поля в БД
Проблема: Слово “Fibonacci” (9 символов) не влезало
в колонку ml_direction типа varchar(8).
Решение: Сокращение до “Fib” для записи в БД.
4. Формат символа в запросе к БД
Проблема: Запрос свечей из БД использовал “GAZPF”, а
в базе данные хранятся как “GAZPF@RTSX”.
Решение: Передача полного символа с биржевой
секцией.
Все 4 бага были обнаружены и исправлены за один деплой-цикл. Это
хороший пример того, почему первый запуск новой стратегии всегда
делается в режиме --dry-run (без реальных ордеров).
📊 Текущий статус
Fibonacci-бот запущен на сервере archbook как отдельный
systemd-сервис:
- Сервис:
finam-bot4rest-fibonacci.service - Режим: dry-run (имитация сделок, без реальных
ордеров) - Инструмент: GAZPF@RTSX (фьючерс на акции
Газпрома) - Автозапуск: включен (автостарт при перезагрузке
сервера)
ML-бот временно остановлен – на выходных тестируем только
Fibonacci-стратегию, чтобы оценить качество сигналов в изоляции.
🔮 Что дальше
- Мониторинг на выходной сессии – MOEX FORTS
работает в субботу (10:00-19:00) и воскресенье (19:00-23:50). Проверим,
как бот обнаруживает сигналы на реальных данных. - Анализ сигналов – через неделю dry-run соберём
статистику: сколько сигналов, какой процент совпадает с реальным
движением цены. - Переход на live – если dry-run подтвердит
бэктесты, включаем реальную торговлю с минимальным лотом (1 контракт
GAZPF). - Комбинированная стратегия – в планах объединить
Fibonacci + ML для повышения точности: ML фильтрует направление,
Fibonacci даёт точки входа.
🛠 Технические детали для разработчиков
Проект написан на Rust с использованием:
- tokio – асинхронный runtime
- sqlx – типобезопасные SQL-запросы к PostgreSQL
- Finam Trade API – gRPC-подключение к брокеру
Запуск в режиме Fibonacci:
bot4rest \
--symbols GAZPF@RTSX:1:0.05 \
--mode fibonacci \
--fib-min-swing 1.0 \
--fib-lookback 12 \
--fib-trend-lookback 36 \
--fib-max-hold 48 \
--fib-min-corridor 0.5 \
--dry-run
Весь код доступен в репозитории. Коммит интеграции:ec91cf6 (17 файлов, +1726 строк).
Проект развивается в открытом режиме. Следите за
обновлениями!