Гайд
Разбор Стратегии SMA 9/30
Содержание
Стратегия SMA 9/30 — классический инструмент тренд-следования, который отлично подходит для понимания того, как работает инерция рынка.
В ее основе лежит простой принцип: тренды склонны продолжаться дольше, чем кажется. Если актив уверенно растет 10 дней подряд, шансы, что он продолжит расти еще несколько дней, обычно выше, чем шансы на мгновенный разворот — хотя это лишь общая закономерность, а не гарантия. Торговля по тренду не пытается угадать «самую низкую точку» для покупки — она подключается к уже начавшемуся движению и старается забрать его часть.
Что делает стратегия
В основе системы лежат две простые скользящие средние (Simple Moving Average). Скользящее среднее — это средняя цена закрытия за N предыдущих свечей:
- SMA 9 (быстрая) — отвечает за импульс и локальный настрой рынка, чутко реагирует на свежие изменения цены.
- SMA 30 (медленная) — выступает «компасом» и определяет глобальный тренд, отсекая рыночный шум.
Когда быстрая линия пересекает медленную снизу вверх — это может сигнализировать о развороте вверх, сигнал на вход. Когда пересекает сверху вниз — тренд, вероятно, слабеет, сигнал на выход.
- Вход (LONG): вчера SMA9 ≤ SMA30, сегодня SMA9 > SMA30 — «золотой крест».
- Выход: вчера SMA9 ≥ SMA30, сегодня SMA9 < SMA30 — «крест смерти».
Средние считаются только по ценам закрытия уже закрытых свечей, а первый сигнал возможен не раньше 31-й свечи — 30, чтобы прогреть SMA30, плюс одна, чтобы было с чем ее сравнить.
Пример работы

График показывает работу классической трендследящей стратегии на MSFT: пересечение быстрой (SMA9) и медленной (SMA30) скользящих средних по цене закрытия. Зеленая/красная заливка между линиями наглядно показывает, в каком режиме находится рынок — «бычьем» или «медвежьем».
За рассматриваемый период (180 дней) MSFT показал устойчивый восходящий тренд: buy & hold дал +39,6%, а стратегия отработала 3 закрытые сделки и принесла +14,7% (плюс еще −0,7% на текущей открытой позиции).
SMA-кроссовер по своей природе — запаздывающий индикатор: он входит в движение уже после того, как оно началось, и выходит уже после разворота. На выраженном тренде это даёт положительный результат за счет одной-двух крупных сделок, но систематически уступает простому удержанию позиции (buy & hold). На практике SMA чаще используют как вспомогательный индикатор внутри более крупных стратегий, а не как самостоятельную торговую систему.
В этом гайде мы научимся реализовывать ее самостоятельно, используя Trade API и готовый SDK.
Реализация
1. Получите токен
Secret-токен выпускается в личном кабинете, в разделе Токены.
Также при выборе инструмента в Trade API нужно учитывать, что любой инструмент указывается в формате ticker@mic, например SBER@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:
Напишем математическую функцию расчета сигнала: она берет список цен закрытия и возвращает текущие SMA9/SMA30 и сигнал:
Функция расчета сигнала
Дальше нужны сами цены. Загрузите историю свечей через MarketData.Bars: почти все они уже закрыты и готовы для расчёта, а вот самая последняя — ещё нет, она может продолжить меняться прямо сейчас. Поэтому ее мы в SMA пока не считаем, а просто откладываем и ждём следующую свечу:
С историей на руках можно подписаться на поток через метод MarketData.SubscribeBars и на каждой новой свече проверять, закрылась ли предыдущая. Если метка времени совпадает — свеча еще обновляется, просто заменяем pending; если новее — предыдущая точно закрылась, и по ней можно считать SMA и сигнал:
Высчитав сигнал, можно реализовать саму отправку заявки с методом Orders.PlaceOrder. Перед этим стоит свериться с текущей позицией: входить можно только с нуля, а выходить — только из уже открытой длинной позиции и не больше ее размера, чтобы случайно не открыть шорт:
Вот и все — четыре кусочка логики (расчет, история, поток, заявка) дают рабочую стратегию. Полная версия стратегии — Python / Node.js.
Чтобы не собирать ее вручную, вы можете склонировать наш репозиторий и запустить готовый пример:
3. Запустите проверку истории на чтение
В репозитории мы подготовили безопасный первый шаг запуска — режим --check. Он аутентифицируется, загружает исторические свечи, считает SMA9/SMA30 и печатает результат, ничего не выставляя и даже не читая счет:
Запустить можно командой, предварительно подставив свой токен
Пример ожидаемого вывода (реальный прогон на SBER@MISX):
Если аутентификация не проходит — проверьте, что токен активен и имеет доступ к рыночным данным. Если свечи не пришли — проверьте формат ticker@mic и то, что биржа действительно торгует этим инструментом.
4. Запустите потоковый dry-run
В режиме --check стратегия делает один шаг и завершается. Следующий этап — запускать ее постоянно, на заданном таймфрейме, то есть с одной свечой каждые, например, 5 минут. Для этого просто убираем флаг --check: стратегия переходит в потоковый режим, подписывается на свечи через gRPC-стрим и на каждой закрытой свече печатает в лог SMA и сигнал. Заявки при этом по-прежнему не выставляются — счет не читается вообще.
Для остановки скрипта нужно нажать комбинацию клавиш Ctrl-C.
Вот какие еще есть доступные значения --timeframe:
Значение | Таймфрем |
|---|---|
| 1 минута |
| 5 минут |
| 15 минут |
| 30 минут |
| 1 час |
| 2 часа |
| 4 часа |
| 8 часов |
| 1 день |
| 1 неделя |
| 1 месяц |
| 1 квартал |
Также можно настроить и остальные параметры стратегии — вот таблица всех флагов и соответствующих переменных окружения:
Флаг / переменная окружения | Что задает | По умолчанию |
|---|---|---|
| токен | обязателен |
| инструмент, | обязателен |
-- | таймфрейм свечей | M5 |
| размер позиции | 1 |
| подробность логов | INFO |
| разовая проверка по истории, без потока и заявок | выключен |
| включить настоящие заявки (без dry-run) | выключен |
5. Включите настоящие заявки
Перед стартом стратегия сама определяет ID счета через AuthService.TokenDetails и откажется работать, если токену доступен не ровно один счет — это защита от случайной торговли не на том счете. Перед каждой заявкой также проверяется текущая позиция: вход возможен только с нуля, а на выходе продается не больше, чем есть в позиции, чтобы не открыть случайный шорт.
Что дальше
Теперь, когда стратегия запущена и понятна изнутри, с ней можно экспериментировать — поменять окна SMA, добавить свой фильтр сигналов или собрать похожую логику на другом индикаторе.
Но перед боевым использованием стоит помнить: это учебный пример, а не production-система. Для реальной торговли потребуются как минимум постоянное хранение состояния между перезапусками, переподключение потока при разрывах, добор пропущенных свечей, мониторинг и лимиты риска. Подробности о механике сверки свечей и защитных проверках — в README стратегии.
Конец лонгрида