Трейдинг в TUI: пишем легковесный клиент на Go через Finam Trade API
- четверг, 9 апреля 2026 г. в 00:00:10
Меня зовут Сергей, я разработчик в «Финаме». Торгую на бирже около четырех лет. Большую часть дня провожу в терминале - пишу код, деплою, работаю с инструментами. И в какой-то момент заметил нестыковку: все мое рабочее пространство уже в консоли, кроме одной вещи - торгового терминала.
Так появился Finam Terminal - TUI-клиент с открытым кодом для торговли через API брокера «Финам». Написан на Go в свободное время, работает прямо в консоли, весит ~24 МБ. В этой статье расскажу, зачем он нужен, как устроен и почему наличие хорошего API у брокера - это приглашение что-то построить.

Типичный рабочий день: несколько окон терминала, IDE, задачи. Параллельно хочется глянуть, что происходит на счете - проверить позиции, посмотреть котировку, может, выставить заявку.
Для этого нужно свернуть терминал, открыть отдельную программу или браузер, залогиниться. А на моей виртуалке с Linux десктопных клиентов для «Финама» вообще нет - только QUIK, который под Linux не запускается без танцев с Wine, или веб-интерфейс FinamTrade в браузере.
Каждый раз - выход из рабочего контекста. Вроде мелочь, но за день набегает.
Если посмотреть на существующие варианты для клиента «Финама», картина такая.
QUIK - классика, проверенная временем. Мощный, функциональный, с поддержкой Lua-скриптов. Но это десктопное Windows-приложение со всеми вытекающими: не запустишь на Linux-сервере, не встроишь в рабочий процесс в консоли. Интерфейс перегружен, порог входа высокий. Для профессиональных трейдеров - отличный инструмент, но для разработчика, которому нужно «быстро глянуть портфель» - как стрелять из пушки по воробьям.
FinamTrade (веб-терминал) - современный, удобный, работает в браузере. Но это именно браузер: еще одна вкладка среди десятков, отвлекающие элементы интерфейса, потребление памяти. И главное - переключение контекста из терминала в браузер и обратно.
Консольных клиентов для торговли через «Финам» на момент начала разработки я не нашел. У некоторых других брокеров есть неофициальные TUI-проекты, но для «Финам Trade API» - пустота.
Идея консольного клиента витала давно, но реализовать ее мешало отсутствие удобного программного интерфейса. Все изменилось, когда «Финам» запустил современный Trade API.
Что предоставляет API:
gRPC и REST - два протокола на выбор. gRPC дает бинарный протокол с минимальными задержками, REST - простоту интеграции.
Стриминг данных - подписка на котировки, стакан и статусы заявок в реальном времени через gRPC-потоки. Не нужно постоянно дергать сервер запросами.
Официальные SDK - готовые клиентские библиотеки для Go, Python, Kotlin. Не нужно самому генерировать код из proto-файлов или писать обертки поверх HTTP.
Песочница - можно протестировать API на демо-счете, не рискуя реальными деньгами.
Документация и сообщество - подробная документация на tradeapi.finam.ru, телеграм-чат для вопросов, примеры кода на GitHub.
Хороший API - это всегда приглашение что-то построить. «Финам Trade API» стал именно таким приглашением. Наличие официального Go-клиента означало, что я могу сосредоточиться на интерфейсе и логике, а не на низкоуровневой работе с протоколами.
Важно подчеркнуть: Finam Terminal - это не продукт компании «Финам». Это мой личный проект, написанный в свободное время. Trade API - публичный, и любой разработчик может создать на его базе свое приложение. Мой терминал - один из примеров того, что можно построить, имея хороший API.
Finam Terminal - это полноценный торговый клиент, который работает прямо в консоли. Без браузера, без GUI-фреймворков, без Electron.
Что видишь при запуске. Все брокерские счета в одном окне: ИИС, демо-счет, основной. Баланс, открытые позиции, текущая прибыль и убытки - агрегировано, без переключения между вкладками. История сделок и активные заявки - отдельными вкладками внутри того же экрана.
Поиск инструментов. По тикеру или по названию - результаты появляются по мере ввода. Нашел бумагу - нажал Enter - видишь полный профиль: параметры, торговое расписание и свечной график прямо в терминале.

Котировки в реальном времени. Данные поступают через gRPC-стрим напрямую с серверов «Финама» - без задержек промежуточных слоев. Биржевой стакан, лента сделок, свечи - все обновляется в реальном времени.

Торговля с клавиатуры. Лимитные и рыночные заявки, стоп-лоссы, тейк-профиты, связанные SL/TP пары - все выставляется без мыши. Управление заявками тоже: отмена через X или Del, редактирование через E. Переключение между экранами - Tab, навигация - стрелки, подтверждение - Enter.
Характеристики: ~24 МБ оперативной памяти, мгновенный запуск, работа на macOS, Linux, Windows (включая WSL). Установка - одна команда, Docker-образ в комплекте.
Стек выбирался из практических соображений.
Go - потому что он компилируется в один бинарник без зависимостей, потребляет мало памяти и идеально подходит для конкурентной работы с gRPC-стримами. Плюс - официальный SDK «Финама» написан на Go, что снимает вопрос совместимости.
tview - библиотека для построения TUI-интерфейсов в Go. Предоставляет готовые виджеты: таблицы, формы, модальные окна, навигацию. На ее базе собран весь интерфейс терминала.
gRPC-стриминг - ключевое преимущество API. Вместо того чтобы каждые N секунд запрашивать данные, клиент открывает один поток и получает обновления по мере их появления. Это критично для торгового терминала: ты видишь изменение цены в момент, когда оно происходит.
Архитектура проекта простая и прямолинейная:
api/ - клиент для взаимодействия с «Финам Trade API» через gRPC
ui/ - компоненты интерфейса на базе tview
config/ - управление конфигурацией
models/ - общие структуры данных
Первый релиз состоялся 19 января 2026 года. За два месяца - 8 релизов, от базового просмотра портфеля до полноценной торговли со стоп-заявками. Проект развивается в свободное время: иногда оно есть, иногда нет, поэтому темп неравномерный.
Из всех задач больше всего времени съело построение TUI-интерфейса на tview.
Казалось бы, консольный интерфейс - это просто: текст, таблицы, пара форм. На практике - отдельный мир со своими ограничениями. Размер экрана неизвестен заранее и может меняться. Нет пикселей, есть символы. Цвета ограничены палитрой терминала. Фокус ввода - только один элемент в каждый момент.
Свечной график в текстовом режиме - это отдельный квест. Unicode-символы блочной графики позволяют рисовать «почти настоящие» свечи, но нужно правильно масштабировать ось цен, адаптироваться под ширину окна и разумно подписывать ось времени для разных таймфреймов.
instrument_profile.png
Модальные окна для заявок потребовали аккуратной работы с фокусом и валидацией. Особенно связанные SL/TP пары, где нужно показать два набора ценовых полей с динамической валидацией - в текстовом интерфейсе это заметно сложнее, чем в вебе.
Еще один нетривиальный момент - корректная обработка всех статусов заявок. API возвращает разные статусы для обычных, стоповых и связанных заявок. Нужно было правильно маппить их на понятные пользователю состояния и отображать в таблице со всеми деталями: стоп-условия, лимитные/стоповые цены, исполненный/оставшийся объем.
Отдельно хочу сказать про опыт работы с «Финам Trade API» - потому что качество API напрямую влияет на то, появятся ли вокруг него сторонние проекты.
Официальный Go SDK сэкономил значительное количество времени. Вместо того чтобы разбираться с proto-файлами, генерировать клиентский код, обрабатывать ошибки сериализации - берешь готовый пакет и работаешь с типизированными структурами.
gRPC-стриминг - главная причина, почему консольный клиент вообще имеет смысл. Без данных в реальном времени TUI-терминал был бы просто медленной альтернативой веб-интерфейсу. С потоковыми данными он становится полноценным инструментом.
Демо-счет позволил разрабатывать и тестировать торговые функции без риска. Создаешь токен, подключаешься к песочнице, отлаживаешь размещение заявок - все как на реальном рынке, но с виртуальными деньгами.
Документация покрывает основные сценарии, а телеграм-чат помогает с нюансами, которые неизбежно возникают при интеграции.
Это хороший пример того, как брокер может стимулировать развитие экосистемы вокруг своей платформы: дать разработчикам инструменты - и они построят то, что полезно им самим.
Прежде всего - для тех, кто проводит день в терминале и не хочет из него выходить ради проверки позиции. Для любого трейдера с навыками разработчика или желанием их освоить. А еще для тех, кому важна скорость и минимализм. Никаких баннеров, никакого маркетинга внутри интерфейса - только данные и действия. Ну и для тех, кто работает на удаленных серверах без графической оболочки: подключился по SSH - и у тебя полноценный торговый терминал.
Проект активно развивается. В ближайших планах:
Аналитика по счету - детальная статистика по сделкам, доходности, распределению активов.
Избранное - возможность отслеживать выбранные инструменты в отдельном списке, без поиска каждый раз.
Улучшение визуализации данных и расширение набора поддерживаемых типов заявок.
Работа над UI интерфейсом что бы он выглядел еще приятнее и понятнее
Проект open source, лицензия Apache 2.0. Вклад приветствуется - от багрепортов до pull request'ов.
Установка - одна команда (macOS / Linux / WSL):
curl -fsSL https://fcli.ru/install.sh | bash
В случае с Windows PowerShell:
irm https://fcli.ru/install.ps1 | iex
Также доступны готовые бинарники и Docker:
docker pull ghcr.io/updevru/finam-terminal:latest docker run -it --rm ghcr.io/updevru/finam-terminal:latest
Исходный код: github.com/updevru/finam-terminal
Finam Trade API: tradeapi.finam.ru
Если вы торгуете и живете в консоли - попробуйте. Если вы разработчик и думали, что с API брокера можно только торговых роботов писать - вот пример того, что можно построить что-то другое.