
Привет! Я Алексей Кабанов, младший разработчик в команде публичного API Т-Инвестиций. Занимаюсь разработкой и поддержкой Java SDK и внутренних сервисов. Изучаю анализ рыночных закономерностей и программную реализацию алгоритмов торговли, построенную на них.
Расскажу о Java SDK для работы с API Т-Инвестиций и покажу, как использовать его для создания торгового робота. Мы сосредоточимся на стратегии, основанной на технических индикаторах, и продемонстрируем, как ее реализовать с помощью новых возможностей SDK.
Современная алгоритмическая торговля предлагает множество инструментов и стратегий, которые могут значительно повысить эффективность торговли на финансовых рынках. В статье покажу, как использовать обновленный Java SDK для создания робота, который будет торговать по стратегии, основанной на технических индикаторах. А еще подробно рассмотрим, как с его помощью можно настроить и протестировать робота, чтобы запустить его на реальном рынке.
Особенности алгоритмической торговли
Алгоритмическая торговля — использование программных алгоритмов для выполнения торговых операций на финансовых рынках. С ее помощью можно ускорить процесс принятия решений и минимизировать влияние человеческого фактора. Торговые алгоритмы могут работать по различным стратегиям, включая анализ данных в реальном времени, использование технических индикаторов и сложных математических моделей.
Технические индикаторы — это математические расчеты, основанные на ценах, объемах или открытом интересе финансового инструмента. В отличие от фундаментального анализа они не учитывают внешние экономические факторы. Некоторые индикаторы — опережающие, они предсказывают будущие изменения рынка, в то время как другие запаздывают, подтверждая уже сформировавшийся тренд.
Стратегии, основанные на технических индикаторах, включают анализ рыночных данных для прогнозирования движения цен и принятия торговых решений. Один из популярных подходов — использование комбинированных сигналов от нескольких индикаторов для подтверждения точности прогноза. Например, сигнал одного индикатора может использоваться как подтверждение или опровержение сигнала другого. Это повышает надежность стратегии, но важно учитывать, что индикаторы зависят от исторических данных и имеют задержку в реакции на изменения рынка.
Для примера мы используем стратегию с двумя скользящими средними, основанными на экспоненциальной скользящей средней (EMA).
EMA (Exponential Moving Average) — запаздывающий индикатор, который помогает выявить текущий тренд финансового актива.
Выбранная нами для примера стратегия будет включать две EMA:
Short EMA (короткая скользящая средняя) быстрее реагирует на изменения цены и отражает краткосрочные тенденции;
Long EMA (длинная скользящая средняя) сглаживает колебания и показывает долгосрочные тенденции.
Логика стратегии проста: когда короткая EMA пересекает длинную EMA снизу вверх, это сигнал к покупке. Когда короткая EMA пересекает длинную сверху вниз, это сигнал к продаже. Так, длинная EMA подтверждает сигналы короткой EMA, а стратегия называется cross-EMA.

Работа с CLI SDK
Для упрощения работы с SDK добавили CLI (Command Line Interface), который позволяет быстро начать работу с API Т-Инвестиций и запустить своего торгового робота. Для его использования достаточно установить Java (JRE) версии не ниже 17.
CLI позволяет пройти полный цикл создания торгового робота, включая:
получение информации об инструменте по тикеру;
подбор параметров стратегии;
запуск робота на тестовой («песочнице») или реальной среде.
В CLI по умолчанию реализована стратегия cross-EMA. Если хочется использовать другую стратегию, потребуется внести изменения в исходный код и собрать свою версию CLI.
Правильно начать свой путь в трейдинге с торгового терминала, чтобы разобраться в предметной области и терминологии. Торговый терминал — это программное обеспечение, которое дает возможность использовать более продвинутые и гибкие инструменты для торговли и анализа рынка.
У многих брокеров доступна торговля через терминал QUIK — один из самых популярных терминалов среди русскоязычных фондовых трейдеров. Но начинающим пользователям он может показаться сложным, поэтому крупные брокеры создают собственные терминалы.
Терминал — один из продуктов Т-Инвестиций, представляет собой настраиваемый конструктор, состоящий из виджетов. Любой виджет пользователь может разместить на экране и настроить в зависимости от своих потребностей. Чтобы получить доступ к терминалу, необходимо быть клиентом Т-Инвестиций.
Для начала необходимо выбрать инструмент, на котором будем торговать. В торговом терминале Т-Инвестиций можно воспользоваться виджетом «Скринер акций» для поиска ликвидных инструментов.

На рисунке список акций, где в колонке «Инструмент» указан тикер. Тикер — это краткое наименование финансового актива, идентификатор, уникальный для конкретной секции определенной биржи.
Выберем для примера акцию T-Технологий с тикером Т, потому что за первые 15 сделок в день с ней не удерживается комиссия, что повысит возможный профит при торговле роботом.
После выбора инструмента нужно получить токен для работы с API Т-Инвестиций. Инструкция есть в документации публичного API Т-Инвестиций.
После получения токена переходим к загрузке CLI. Он опубликован как артефакт в Maven Repository, а весь исходный код доступен в репозитории проекта на GitHub.
Скачиваем jar-файл и переходим к настройке параметров. Создадим файл настроек invest.properties
и укажем в нем полученный токен:
token=<INVEST_API_TOKEN>
Запустим программу для получения информации об инструменте:
java -jar java-sdk-basic-example-1.31.jar -p invest.properties client instruments -t T shares
В результате в файле output.json
будет выведена информация о найденных по заданному тикеру инструментах:
{
"instruments": [{
"figi": "TCS80A107UL4",
"ticker": "T",
"classCode": "TQBR",
...
"name": "Т-Технологии",
...
"tradingStatus": "SECURITY_TRADING_STATUS_NORMAL_TRADING",
...
"apiTradeAvailableFlag": true,
"uid": "87db07bc-0e02-4e29-90bb-05e8ef791d7b",
"realExchange": "REAL_EXCHANGE_MOEX",
...
}, {
"figi": "BBG000BSJK37",
"ticker": "T",
"classCode": "SPBXM",
...
"name": "AT\u0026T",
...
"tradingStatus": "SECURITY_TRADING_STATUS_BREAK_IN_TRADING",
...
"apiTradeAvailableFlag": true,
"uid": "594afd09-a3c5-4936-a3ff-9e2eaae281fb",
"realExchange": "REAL_EXCHANGE_RTS",
...
}]
}
Нам нужен первый инструмент, так как именно он — акция Т-Технологий. Второй инструмент относится к американской компании AT&T.
Почему нам вернулось несколько инструментов в запросе по тикеру? Тикер — это уникальный идентификатор в рамках конкретной секции биржи, значит, на разных биржах тикеры разных инструментов могут совпадать. За информацию о секции биржи, на которой торгуется инструмент, отвечает поле classCode. По связке ticker и classCode можно однозначно идентифицировать инструмент.
Стоит также обращать внимание на поля tradingStatus
и apiTradeAvailableFlag
— они говорят о том, доступна ли торговля инструментом в данный момент и доступна ли торговля через API соответственно.
Поле uid
— уникальный идентификатор инструмента у брокера «Т-Инвестиции». С ним мы и будем дальше работать. Искомый uid
— 87db07bc-0e02-4e29-90bb-05e8ef791d7b
.
Необходимо провести бэктест, чтобы выяснить, насколько прибыльной будет торговля по выбранным инструментам и на каких параметрах наша стратегия покажет лучшие результаты.
Бэктест — это метод проверки инвестиционной стратегии или торговой системы с использованием исторических рыночных данных. С помощью бэктеста можно оценить, насколько хорошо стратегия работала бы в прошлом, если бы мы ее применяли.
Для настройки параметров бэктеста вызовем команду backtest с опцией -h, чтобы увидеть доступные параметры:
java -jar java-sdk-basic-example-1.31.jar -p invest.properties backtest -h
Получим такой вывод:
Usage: <main class> backtest [-hV] -c=<candleInterval>
[--commission-fee=<commissionFee>] -e=<to>
-i=<instrumentId> [--long-ema-end=<longEmaEnd>]
[--long-ema-start=<longEmaStart>] -s=<from>
-e, --end-date=<to> Дата окончания бэктеста
-h, --help Show this help message and exit.
-i, --instrument-id=<instrumentId>
Индентификатор инструмента в формате UID
--long-ema-end=<longEmaEnd>
Конечное значение перебора для длинной EMA
Default: 50
--long-ema-start=<longEmaStart>
Начальное значение перебора для длинной EMA
Default: 30
-s, --start-date=<from> Дата начала бэктеста
--short-ema-end=<shortEmaEnd>
Конечное значение перебора для короткой EMA
Default: 40
--short-ema-start=<shortEmaStart>
Начальное значение перебора для короткой EMA
Default: 10
-V, --version Print version information and exit.
Проведем бэктест нашей стратегии на исторических свечных данных с 20 сентября 2024 по 20 марта 2025 года. Интервал свечи возьмем 15 минут, а остальные значения оставим по умолчанию:
java -jar java-sdk-basic-example-1.31.jar -p invest.properties backtest -i 87db07bc-0e02-4e29-90bb-05e8ef791d7b --candle-interval CANDLE_INTERVAL_15_MIN --start-date 2024-09-20 --end-date 2025-03-20
Из результатов бэктеста видно, что наиболее высокую прибыль стратегия показала при shortEma=11
и longEma=30
. Можно сказать, что наш бот зарабатывает, только когда акция растет, но мы провели бэктест и на других ликвидных инструментах, чтобы доказать обратное.
Тикер | Таймфрейм | PnL | Количество сделок | Период короткой EMA | Период длинной EMA |
OZON | 15M | 55,87% | 92 | 24 | 50 |
OZON | 10M | 34,25% | 140 | 30 | 50 |
T | 15M | 50,44% | 178 | 11 | 30 |
T | 10M | 47,74% | 164 | 23 | 37 |
SMLT | 10M | 26,13% | 126 | 36 | 50 |
SMLT | 15M | 22,95% | 133 | 20 | 44 |
MTLR | 15M | 41,49% | 83 | 33 | 49 |
MTLR | 10M | 24,82% | 135 | 40 | 49 |
Акции SMLT и MTLR за период с 20 сентября 2024 по 20 марта 2025 как росли, так и падали в цене, но бэктест показал, что робот с выбранной стратегией сможет на них заработать.
Когда параметры стратегии подобраны, можно запускать робота. Но сначала сделаем это в «песочнице». Для этого предварительно в файле invest.properties
укажем параметр sandbox.enabled
:
...
sandbox.enabled=true
...
Как и в случае с бэктестом, можно вызвать команду live-trading с опцией -h, чтобы увидеть список доступных параметров:
java -jar java-sdk-basic-example-1.31.jar -p invest.properties live-trading -h
Usage: <main class> live-trading [-hV] [-b=<sandboxBalance>]
--candle-interval=<candleInterval>
-i=<instrumentId> [-l=<longEma>]
[-lots=<instrumentLots>] [-s=<shortEma>]
[-w=<warmupLength>]
Запуск стратегии cross-EMA на реальном рынке
-b, --sandbox-balance=<sandboxBalance>
Начальный баланс «песочницы». Чтобы торговать в
«песочнице», нужно в properties установить
значение sandbox.enabled в 'true'
Default: 1000000
--candle-interval=<candleInterval>
Интервал свечи. Возможные значения:
CANDLE_INTERVAL_1_MIN, CANDLE_INTERVAL_2_MIN,
CANDLE_INTERVAL_3_MIN, CANDLE_INTERVAL_5_MIN,
CANDLE_INTERVAL_10_MIN, CANDLE_INTERVAL_15_MIN,
CANDLE_INTERVAL_30_MIN, CANDLE_INTERVAL_HOUR,
CANDLE_INTERVAL_2_HOUR,
CANDLE_INTERVAL_4_HOUR,
CANDLE_INTERVAL_DAY,
CANDLE_INTERVAL_WEEK,
CANDLE_INTERVAL_MONTH
-h, --help Show this help message and exit.
-i, --instrument-id=<instrumentId>
Идентификатор инструмента в формате UID
-l, --long-ema=<longEma> Период длинной EMA
Default: 15
-lots, --instrument-lots=<instrumentLots>
Количество лотов одного инструмента, на которые
будет выставлена заявка на покупку или продажу
по сигналу стратегии
Default: 1
-s, --short-ema=<shortEma> Период короткой EMA
Default: 5
-V, --version Print version information and exit.
-w, --warmup-length=<warmupLength>
Количество свечей, которые будут загружены перед
стартом стратегии. Требуется для корректной
работы индикаторов технического анализа
Default: 100
Запустим робота с подобранными ранее периодами длинной и короткой EMA для торговли акцией Т-Технологий:
java -jar java-sdk-basic-example-1.31.jar -p invest.properties live-trading -i 87db07bc-0e02-4e29-90bb-05e8ef791d7b --candle-interval CANDLE_INTERVAL_15_MIN --short-ema 11 --long-ema 30
Бот успешно запущен в «песочнице»! Теперь каждые 15 минут при получении новой закрытой свечи будет происходить пересчет индикаторов и в зависимости от их последнего значения приниматься решение о входе или выходе из бумаги по стратегии cross-EMA.
Достаточно установить параметр sandbox.enabled в false, чтобы запустить робота на реальном рынке. Важно отметить, что для торговли на реальном рынке должен быть открыт брокерский счет в Т-Инвестициях, а выпущенный токен должен иметь полный доступ к этому счету.
Если мы хотим проанализировать исторические рыночные данные, можно использовать CLI для их загрузки. Например, загрузим 3-минутные свечи по акции Т-Технологий:
java -jar java-sdk-basic-example-1.31.jar -p invest.properties history-bars -i 87db07bc-0e02-4e29-90bb-05e8ef791d7b --start-date 2024-01-01 --candle-interval CANDLE_INTERVAL_3_MIN
В результате получим файл 87db07bc-0e02-4e29-90bb-05e8ef791d7b_candle_interval_3_min.csv
с данными вида:
start_time,open,high,low,close,volume
2024-01-03T06:57:00Z,3230.0,3230.0,3230.0,3230.0,605
2024-01-03T07:00:00Z,3227.0,3228.0,3210.5,3226.5,3168
2024-01-03T07:03:00Z,3226.0,3239.5,3225.0,3239.5,4673
…
Мы ознакомились с тем, как подбирать торговые инструменты в терминале и по тикеру получать их идентификаторы с помощью CLI. Провели бэктест стратегии cross-EMA на различных инструментах, чтобы выяснить, с какими параметрами стратегия на них показала наибольшую прибыль на истории. Запустили робота на «песочнице», чтобы проверить, что все работает корректно и робот действует согласно стратегии.
Использование SDK в проекте
Есть несколько способов обратиться к API Т-Инвестиций:
использовать proto-контракты для gRPC, сгенерировав по ним классы;
вызывать REST для унарных запросов и WebSocket для стриминга;
подключить Java SDK в проект и упростить себе жизнь :)
Сама библиотека разбита на модули, каждый из которых можно подключить в зависимости от потребностей:
Core — основной модуль SDK. Все взаимодействие с API Т-Инвестиций происходит именно через него.
Storage отвечает за сохранение рыночных данных в CSV-файлы или СУБД (MySQL, PostgreSQL), чтение из них, а также поиск по уникальным полям.
Strategy — модуль для тестирования стратегий по инструментам с различными параметрами и запуска их на тестовой («песочнице») или реальной среде.
Spring Boot Starter. В мире Java стандарт при разработке микросервисов — фреймворк Spring Boot. Мы добавили поддержку этого фреймворка в SDK, реализовав Spring Boot Starter. Он позволяет упростить написание робота и абстрагироваться от низкоуровневых реализаций библиотеки.
Например, пишем проект бота, который ищет самые выгодные облигации. Для этого достаточно использовать модуль core. Если хотим расширить функциональность проекта и сохранять в БД стриминг рыночных данных по инструментам, можно воспользоваться модулем storage, чтобы не писать логику сохранения самостоятельно.
Но наш бот все еще не торгует. Чтобы это исправить, стоит подключить модуль strategy, позволяющий проводить бэктест стратегии на основе технического анализа и запускать ее на «песочнице» или реальной среде. Приятное дополнение к набору —я Spring Boot Starter, который избавит от необходимости вручную подгружать конфигурацию и прописывать запуск стратегии в main-методе.
Подробнее ознакомиться с возможностями каждого модуля, инструкцией по его подключению и использованию можно на сайте с документацией для разработчиков, в разделе Java SDK: developer.tbank.ru.
Заключение
Мы провели бэктест стратегии cross-EMA, подобрали параметры для нее и запустили робота в «песочнице». Затем рассмотрели, из каких модулей состоит SDK и как их можно использовать в своем проекте.
Предлагайте свои идеи по развитию SDK, а в случае возникновения сложностей обращайтесь к документации или в телеграм-чат разработчиков.