Гайд
Гайд: стратегия RSI 14 на Trade API
Содержание
Стратегия 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 изменений цены плюс одно закрытие перед первым из них.
Пример работы

На графике — работа стратегии на 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 |
|---|---|---|---|
| 2 | +27,5% | +23,6% |
| 2 | +21,9% | +31,8% |
| 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:
Напишем математическую часть. Сначала — средние Уайлдера: разбиваем изменения цены на росты и падения, сеем первое среднее простым средним и дальше сглаживаем:
Теперь сам 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:
Значение | Таймфрейм |
|---|---|
| 1 минута |
| 5 минут |
| 15 минут |
| 30 минут |
| 1 час |
| 2 часа |
| 4 часа |
| 8 часов |
| 1 день |
| 1 неделя |
| 1 месяц |
| 1 квартал |
Как показал бэктест выше, таймфрейм сильно влияет на частоту сделок: на дневных свечах уровни 0.2/0.8 могут не достигаться месяцами, а на часовых и минутных сигналы появляются заметно чаще.
Также можно настроить и остальные параметры стратегии — вот таблица всех флагов и соответствующих переменных окружения:
Флаг / переменная окружения | Что задает | По умолчанию |
|---|---|---|
| токен | обязателен |
| инструмент, | обязателен |
| таймфрейм свечей |
|
| размер позиции |
|
| подробность логов |
|
| разовая проверка по истории, без потока и заявок | выключен |
| включить настоящие заявки (по умолчанию 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 стратегии.
Конец лонгрида