📐 Fibonacci + DeMark: новая торговая стратегия в боте для MOEX — MajoTrade
MajoTrade

📐 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 – классический
индикатор, определяющий направление тренда по последовательности
экстремумов.

Логика фильтрации:

  1. Определяем тренд – DeMark анализирует 36 последних
    баров
  2. Фильтруем сигналы – покупаем только в растущем
    тренде, продаём только в падающем
  3. Проверяем коридор – минимальный размер свинга
    должен быть >= 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-стратегию, чтобы оценить качество сигналов в изоляции.

🔮 Что дальше

  1. Мониторинг на выходной сессии – MOEX FORTS
    работает в субботу (10:00-19:00) и воскресенье (19:00-23:50). Проверим,
    как бот обнаруживает сигналы на реальных данных.
  2. Анализ сигналов – через неделю dry-run соберём
    статистику: сколько сигналов, какой процент совпадает с реальным
    движением цены.
  3. Переход на live – если dry-run подтвердит
    бэктесты, включаем реальную торговлю с минимальным лотом (1 контракт
    GAZPF).
  4. Комбинированная стратегия – в планах объединить
    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 строк).


Проект развивается в открытом режиме. Следите за
обновлениями!