Пет-проект

HEART

версия 0.4октябрь 2026

Торговый терминал, который работает в браузере. Графики с индикаторами и алертами, бэктест стратегий, боты на Python, журнал сделок и экономический календарь в одном окне.

Проект
Личный, без команды и заказчика: делаю для себя как трейдер.
Моя роль
Самостоятельная разработка от идеи до готового раздела: архитектура, функциональность, решения о том, что войдёт в проект.
Проверка
Каждое изменение проходит автотесты и мою проверку в браузере.
  • Данные: Binance, cTrader, FXStreet
  • Сервер: Go
  • Интерфейс: TypeScript, React
  • Код: закрытый репозиторий
Графики. BTC/USDT, 1 час, живые котировки Binance. На графике торговые сессии (Сидней, Токио, Лондон, Нью-Йорк), SMA 20 и объём, над графиком цены свечи под курсором. Справа список инструментов с переключателем Binance / cTrader.

Графики

Свой движок графиков

Свечи, полые свечи, бары, линия, область и Хайкин-Аши. Сетка до четырёх графиков синхронизирует инструмент, таймфрейм и время. Индикаторы считаются в отдельном потоке и двигаются вместе с формирующейся свечой, значения осцилляторов видны прямо на их шкалах. Рисует WebGPU, а где его нет, Canvas.

  • 31 инструмент рисования, горячие клавиши и шпаргалка по «?»
  • алерты на цену, линию, RSI, скользящую и MACD
  • снимок графика в буфер, в PNG или к сделке журнала
  • пивоты, уровни прошлого дня и недели, OBV, A/D, MFI, CMF

Стратегии

Бэктест, который не подыгрывает

Стратегию можно прогнать по истории за несколько секунд: доходность, просадка, профит-фактор, издержки и сравнение с «купить и держать». Чтобы не подгонять параметры под прошлое, последние 30% истории откладываются. Стратегия проверяется на данных, по которым параметры не подбирались. Прогоны можно сравнивать между собой.

  • отложенный период для проверки
  • комиссия и проскальзывание в расчёте
  • сравнение двух прогонов
Пересечение EMA на BTC/USDT, 1 минута. Стратегия убыточна, и терминал так и пишет: на подборе прибыли нет, проверять нечего.

Конструктор ботов

Бот без строчки кода

Правила входа и выхода собираются из индикаторов и условий. Справа конструктор пересказывает бота обычными словами и предупреждает о слабых местах, например когда не задан тейк-профит. Сохранённый бот сразу отправляется в бэктест.

Конструктор бота. Шаблон «Пересечение EMA»: условия, стоп-лосс, объём сделки и пересказ правил справа.

Редактор кода

Свои индикаторы на TypeScript, боты на Python

Когда конструктора мало, есть редактор. Индикатор пишется на TypeScript и сразу появляется на графике. Бот пишется на Python и запускается прямо в браузере через Pyodide, устанавливать ничего не нужно. Пользовательский код работает в отдельном потоке и не тормозит интерфейс.

Бот на Python. Заготовка с параметрами и обработкой каждой свечи.
Индикатор на TypeScript. Три заготовки: пустой скелет, линия и фигуры.

Журнал

Журнал сделок с разбором каждой

Сделки попадают в журнал вручную, из cTrader или с фьючерсного счёта Binance (только чтение). Результат каждой сделки считается в R: прибыль, делённая на риск до стопа. Календарь месяца подсвечивает прибыльные и убыточные дни, по сетапам считается винрейт, а счета в разных валютах не складываются. В разборе сделки видны снимок графика и новости, которые выходили в это время.

Данные на этом скриншоте — пример. Счёт «Пример» и сделки созданы для витрины, настоящий счёт сюда не попадает.

Календарь

Экономический календарь с обратным отсчётом

События недели с фильтром по валютам и важности: факт, прогноз и предыдущее значение. Для ближайшего события идёт обратный отсчёт и показаны сценарии, что жёсткий или мягкий тон значит для валюты и для золота. Данные приходят через собственный сервер на Go.

Настоящие события 21 октября 2026 года. Источник FXStreet.

Модули

Каждый раздел можно выключить

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

Модули. Семь разделов с переключателями, ниже места для пользовательских модулей и источников данных.

Подход

Как я работаю

Результат принимается только после проверки.

  1. Задача

    Формулирую, что должно получиться и как это проверить. Например: «запуск не медленнее, чем до изменений».

  2. Код и тесты

    Каждое изменение идёт с тестами: сквозные в браузере (Playwright), модульные (Vitest) и серверные (Go).

  3. Проверка

    Перед каждым коммитом сами запускаются проверка типов, тесты и контроль границ между модулями. Потом смотрю результат в браузере.

  4. Решение

    Оставляю, переделываю или убираю совсем, если идея не подтвердилась.

Где результат не приняли на веру

Источник календаря

Заменено

Investing начал ограничивать запросы. Календарь переведён на FXStreet через собственный сервер, а запросы к источнику не отправляются пачками.

Скорость после перестройки

Измерено

После разбивки терминала на модули замерили запуск и переключение разделов на собранной версии.

366 мсзапуск, было 388 мс
5–11 мспервое открытие раздела, было 310 мс

Ключи и секреты

Защищено

Ключи Binance хранятся в зашифрованном виде средствами Windows (DPAPI). Секреты не попадают в адреса запросов и в тексты ошибок, а доступ к счёту Binance только на чтение.

Стек

Из чего сделано

Интерфейс
TypeScript, React 19, Vite, Zustand
Графики
Собственный движок отрисовки на WebGPU с запасным Canvas, индикаторы считаются в отдельном потоке
Сервер
Go: история котировок, календарь, копия данных терминала
Боты
Python в браузере через Pyodide, движок бэктеста на TypeScript
Тесты
Playwright, Vitest, go test, проверки перед каждым коммитом
Данные
Binance, cTrader, FXStreet
Разработка
Git