golang

Трейдинг в TUI: пишем легковесный клиент на Go через Finam Trade API

  • четверг, 9 апреля 2026 г. в 00:00:10
https://habr.com/ru/companies/finam_broker/articles/1020970/

Меня зовут Сергей, я разработчик в «Финаме». Торгую на бирже около четырех лет. Большую часть дня провожу в терминале - пишу код, деплою, работаю с инструментами. И в какой-то момент заметил нестыковку: все мое рабочее пространство уже в консоли, кроме одной вещи - торгового терминала.

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

Счета и портфель
Счета и портфель

Проблема: контекст-свитчинг

Типичный рабочий день: несколько окон терминала, IDE, задачи. Параллельно хочется глянуть, что происходит на счете - проверить позиции, посмотреть котировку, может, выставить заявку.

Для этого нужно свернуть терминал, открыть отдельную программу или браузер, залогиниться. А на моей виртуалке с Linux десктопных клиентов для «Финама» вообще нет - только QUIK, который под Linux не запускается без танцев с Wine, или веб-интерфейс FinamTrade в браузере.

Каждый раз - выход из рабочего контекста. Вроде мелочь, но за день набегает.

Что есть на рынке

Если посмотреть на существующие варианты для клиента «Финама», картина такая.

QUIK - классика, проверенная временем. Мощный, функциональный, с поддержкой Lua-скриптов. Но это десктопное Windows-приложение со всеми вытекающими: не запустишь на Linux-сервере, не встроишь в рабочий процесс в консоли. Интерфейс перегружен, порог входа высокий. Для профессиональных трейдеров - отличный инструмент, но для разработчика, которому нужно «быстро глянуть портфель» - как стрелять из пушки по воробьям.

FinamTrade (веб-терминал) - современный, удобный, работает в браузере. Но это именно браузер: еще одна вкладка среди десятков, отвлекающие элементы интерфейса, потребление памяти. И главное - переключение контекста из терминала в браузер и обратно.

Консольных клиентов для торговли через «Финам» на момент начала разработки я не нашел. У некоторых других брокеров есть неофициальные TUI-проекты, но для «Финам Trade API» - пустота.

Повод, которого не хватало: Finam 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 возвращает разные статусы для обычных, стоповых и связанных заявок. Нужно было правильно маппить их на понятные пользователю состояния и отображать в таблице со всеми деталями: стоп-условия, лимитные/стоповые цены, исполненный/оставшийся объем.

Про 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

Если вы торгуете и живете в консоли - попробуйте. Если вы разработчик и думали, что с API брокера можно только торговых роботов писать - вот пример того, что можно построить что-то другое.