К содержимому
logologo-text

API

Гайд

Гайд: стратегия RSI 14 на Trade API

~15 мин чтенияОбновлено 26 октября 2026

Содержание

Стратегия RSI 14 с порогами 0.2 / 0.8 — классический пример торговли на возврат к среднему (mean reversion). По логике она противоположна тренд-следованию: вместо того чтобы присоединяться к уже начавшемуся движению, она ищет моменты, когда движение зашло слишком далеко.

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

Что делает стратегия

В основе системы лежит индекс относительной силы (Relative Strength Index, RSI). Он сравнивает, насколько в среднем цена росла и насколько падала за последние 14 закрытых свечей:

  • Средний рост — среднее всех положительных изменений цены закрытия за период.
  • Среднее падение — среднее всех отрицательных изменений (по модулю).
  • RSI = средний рост / (средний рост + среднее падение).

Получается число от 0 до 1. Значение около 0 означает, что в окне почти одни падения, около 1 — почти одни росты, 0.5 — равновесие. Средние сглаживаются по методу Уайлдера: первое значение — простое среднее за 14 изменений, а каждое следующее подмешивает новое изменение с весом 1/14.

  • Вход (LONG): RSI опустился ниже 0.2, пока стратегия вне позиции — рынок перепродан.
  • Выход: RSI поднялся выше 0.8, пока стратегия держит позицию — рынок перекуплен.
  • Между 0.2 и 0.8 ничего не происходит.

0.2 и 0.8 — это те же 20 и 80. В терминалах RSI обычно рисуют на шкале 0–100. Здесь отношение хранится на естественной шкале 0..1, поэтому rsi=0.2 в логе стратегии — это знакомые «RSI 20» на графике.

Важная деталь: правила проверяют уровень, а не пересечение. Если RSI десять свечей подряд держится ниже 0.2, условие входа выполняется на всех десяти. Повторно войти стратегии мешает не правило, а знание о том, что позиция уже открыта, — поэтому стратегия хранит флаг позиции и передает его в расчет.

Первый сигнал возможен не раньше 15-й закрытой свечи: 14 изменений цены плюс одно закрытие перед первым из них.

Пример работы

Стратегия RSI 14 на GAZP — бэктест выполнен на часовых свечах за 90 дней, не учитывает комиссии и проскальзывание. Данные до октября 2026 года
Стратегия RSI 14 на GAZP — бэктест выполнен на часовых свечах за 90 дней, не учитывает комиссии и проскальзывание. Данные до октября 2026 года

На графике — работа стратегии на GAZP@MISX на часовых свечах за последние 90 дней. Сверху — цена закрытия, зеленым залиты периоды, когда стратегия держит позицию. Снизу — сам RSI с пунктирными уровнями 0.2 и 0.8: вход происходит, когда линия ныряет под нижний уровень, выход — когда пробивает верхний.

За этот период стратегия совершила 2 сделки, и обе закрыла в плюс:

  • 14.08 → 23.09: вход на резкой распродаже по 86,06 ₽, выход на ралли по 101,49 ₽ — +17,9%. Обратите внимание: после входа цена еще около двух недель держалась ниже точки покупки. Стратегия не угадывает дно, она лишь фиксирует, что падение было слишком резким.
  • 29.09 → 09.10: вход на откате по 94,20 ₽, выход по 101,82 ₽ — +8,1%.

В сумме это +27,5% против +23,6% у buy & hold. Стратегия обогнала простое удержание за счет того, что пропустила часть августовского падения и купила уже внизу. А вот финальный рост в октябре до 111 ₽ она пропустила: RSI ушел выше 0.8, позиция закрылась, и новой перепроданности до конца периода не случилось.

Тот же бэктест на других бумагах Мосбиржи (часовые свечи, 90 дней) показывает, что так получается не всегда:

Инструмент

Сделок

Стратегия

Buy & Hold

GAZP@MISX

2

+27,5%

+23,6%

LKOH@MISX

2

+21,9%

+31,8%

SBER@MISX

2

+4,7%

+10,6%

На дневных свечах сигналов еще меньше: за последний год (365 дней) уровни 0.2/0.8 достигались единичные разы, а на MSFT, NVDA и AMD — ни разу. На SBER@MISX стратегия купила 22 июня 2026 по 301,93 ₽, а уже через месяц цена упала до 249,34 ₽ — просадка −17,4%, и почти все время с момента входа позиция провела в минусе. Без стоп-лосса стратегия просто пересиживает такое падение, ожидая, пока RSI дойдет до 0.8.

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

В этом гайде мы научимся реализовывать ее самостоятельно, используя Trade API и готовый SDK.

Как реализовать

1. Получите токен

Secret-токен выпускается в личном кабинете, в разделе Токены.

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

Также при выборе инструмента в Trade API нужно учитывать, что любой инструмент указывается в формате ticker@mic, например GAZP@MISX — MISX здесь означает Московскую биржу. Полный список бирж можно получить запросом GET /v1/exchanges.

2. Реализуйте стратегию

В Trade API уже есть SDK для двух языков — Python (finam-sdk, импортируется как finam_trade_api) и Node.js (@finam/trade-api). Установите нужный:

Рассмотрим ключевые фрагменты кода без второстепенных импортов и объявлений (BarsRequest, Order, interval и так далее); полная рабочая версия — в репозитории по ссылке в конце раздела.

Все начинается с подключения клиента SDK — он берет на себя аутентификацию по токену и фоновое обновление JWT:

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

strategy.py

Теперь сам RSI и сигнал. Обратите внимание на аргумент in_position: именно он не дает правилу «вход» срабатывать на каждой свече, пока RSI остается ниже 0.2. А если цена стоит совсем на месте (нет ни ростов, ни падений), RSI считается равным 0.5 — середине между уровнями, чтобы пауза в данных сама по себе не открыла сделку:

Дальше нужны сами цены. Загрузите историю свечей через market_data.Bars: почти все они уже закрыты и готовы для расчета, а вот самая последняя — еще нет, она может продолжить меняться прямо сейчас. Поэтому ее мы в RSI пока не считаем, а просто откладываем и ждем следующую свечу:

С историей на руках можно подписаться на поток через метод market_data.SubscribeBars и на каждой новой свече проверять, закрылась ли предыдущая. Если метка времени совпадает — свеча еще обновляется, просто заменяем pending; если новее — предыдущая точно закрылась, и по ней можно считать RSI и сигнал.

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


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

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

Вот и все — пять кусочков логики (средние, RSI с сигналом, история, поток, заявка) дают рабочую стратегию. Полная версия стратегии — Python / Node.js.

Чтобы не собирать ее вручную, вы можете склонировать наш репозиторий и запустить готовый пример:

3. Запустите проверку истории (только чтение)

В репозитории мы подготовили безопасный первый шаг запуска — режим --check. Он аутентифицируется, загружает исторические свечи, считает RSI по последней закрытой свече и печатает результат, ничего не выставляя и даже не читая счет.

Запустить можно командой, предварительно подставив свой токен:

# Python
TRADE_API_SECRET=... uv run python main.py --symbol GAZP@MISX --check

# Node.js
TRADE_API_SECRET=... npm start -- --symbol GAZP@MISX --check

Ожидаемый вывод (реальный прогон на GAZP@MISX, таймфрейм M5 по умолчанию):

History check passed: close=110.97 rsi=0.455673 average_gain=0.037075 average_loss=0.044288 signal=none

Здесь rsi=0.46 — середина диапазона, рынок ни перепродан, ни перекуплен, поэтому сигнала нет. average_gain и average_loss — средний рост и среднее падение за свечу в рублях; сами правила на них не смотрят, но по ним удобно понять, откуда взялось значение RSI.

Если аутентификация не проходит — проверьте, что токен активен и имеет доступ к рыночным данным. Если свечей не хватает — проверьте формат ticker@mic и то, что биржа действительно торгует этим инструментом: для расчета нужно минимум 16 свечей.

4. Запустите потоковый dry-run

В режиме --check стратегия делает один шаг и завершается. Следующий этап — запускать ее постоянно, на заданном таймфрейме, то есть с одной свечой каждые, например, 5 минут. Для этого просто убираем флаг --check: стратегия переходит в потоковый режим, подписывается на свечи через gRPC-стрим и на каждой закрытой свече печатает в лог RSI и сигнал. Заявки при этом по-прежнему не выставляются — счет не читается вообще.

Когда RSI уходит под 0.2, в логе появляется сигнал на вход (фрагмент лога для иллюстрации):

Closed bar: close=97.14548127769474 rsi=0.237647 average_gain=0.086146 average_loss=0.276348 signal=none
Closed bar: close=96.10407145930658 rsi=0.194634 average_gain=0.079992 average_loss=0.330995 signal=entry
DRY RUN: entry 1 units of GAZP@MISX

В dry-run стратегия тоже ведет флаг позиции, поэтому в логе вход и выход чередуются, а не повторяются на каждой перепроданной свече. Чтобы оставить в логе только сигналы, запустите с --log-level WARNING.

Для остановки скрипта нужно нажать комбинацию клавиш Ctrl-C.

Вот какие еще есть доступные значения --timeframe:

Значение

Таймфрейм

M1

1 минута

M5

5 минут

M15

15 минут

M30

30 минут

H1

1 час

H2

2 часа

H4

4 часа

H8

8 часов

D

1 день

W

1 неделя

MN

1 месяц

QR

1 квартал

Как показал бэктест выше, таймфрейм сильно влияет на частоту сделок: на дневных свечах уровни 0.2/0.8 могут не достигаться месяцами, а на часовых и минутных сигналы появляются заметно чаще.

Также можно настроить и остальные параметры стратегии — вот таблица всех флагов и соответствующих переменных окружения:

Флаг / переменная окружения

Что задает

По умолчанию

--secret / TRADE_API_SECRET

токен

обязателен

--symbol / TRADE_API_SYMBOL

инструмент, ticker@mic

обязателен

--timeframe / TRADE_API_TIMEFRAME

таймфрейм свечей

M5

--quantity / TRADE_API_QUANTITY

размер позиции

1

--log-level / TRADE_API_LOG_LEVEL

подробность логов

INFO

--check

разовая проверка по истории, без потока и заявок

выключен

--execute

включить настоящие заявки (по умолчанию dry-run)

выключен

Период RSI и уровни входа/выхода — часть правила и из командной строки не настраиваются. Чтобы попробовать другие значения, поменяйте аргументы вызова evaluate в runner.py / runner.ts, например evaluate(closes, in_position, period=14, entry_level=Decimal("0.3"), exit_level=Decimal("0.7")) — более мягкие уровни 30/70 дадут больше сделок.

5. Включите настоящие заявки

Внимание: --execute выставляет настоящие рыночные заявки на реальном счете. Используйте для этого выделенный, некритичный счет и сначала обязательно прогоните --check и dry-run.

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

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

Что дальше

Теперь, когда стратегия запущена и понятна изнутри, с ней можно экспериментировать — поменять период и уровни, добавить фильтр тренда (например, входить по RSI только когда цена выше SMA200) или скомбинировать RSI с другим индикатором.

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

Конец лонгрида

Дочитаете до конца — засчитается автоматически

Предложить идею

Увеличить лимиты API